字符串提示不同的语言

时间:2014-07-18 11:31:35

标签: unity3d

我在Unity3d中创建游戏。

在某处,我的提示出现在HUD的底部(例如“按A行动”)。我希望我的游戏支持更多语言,我不希望这些提示在脚本中被硬编码。

解决此任务最优雅的方法是什么?我正在考虑txt文件,我会在所有语言中提供所有提示。但我不确定,如果这是一个好主意。

提前致谢。

5 个答案:

答案 0 :(得分:3)

使用的常用方法是为每种语言提供XML文件。 XML文件应包含您在游戏中使用的每个短语,并带有唯一的ID。

在您的代码中,您可以使用正确的ID从当前语言的XML中获取正确的短语。

如果您不了解XML文件,请阅读本教程,了解如何在Unity中使用XML文件:http://xeophin.net/en/blog/2010/05/13/reading-strings-out-xml-file-using-c-unity-3d

但是如果你愿意在游戏上花一些钱,你应该看一下:http://u3d.as/content/rodrigo-barros/my-menu/32E

我还没试过,但似乎很好。

答案 1 :(得分:2)

如果你正确地执行硬编码并不是那么糟糕。

例如,创建一个抽象类,其中包含您要拥有的所有消息以及语言自动检测:

public abstract class Lang {

  static Lang currentLang;

  public static Lang Get {
    get {
      if(currentLang == null)
        switch(Application.systemLanguage) {
        case SystemLanguage.Polish:
          currentLang=new LangPL();
          break;
        default:
        case SystemLanguage.English:
          currentLang=new LangEN();
          break;
        }

      return currentLang;
    }
  }

  public abstract string MenuTime {get;}
  public abstract string MenuPoints {get;}
  public abstract string YouWon {get;}
  public abstract string YouLost {get;}
  public abstract string Point(int p);

}

然后将每种语言作为单独的类实现:

public class LangPL:Lang {
  public override string MenuTime {get {return "CZAS";}}
  public override string MenuPoints {get {return "WYNIK";}}
  public override string YouWon {get {return "Gratuluję, wygrałeś!";}}
  public override string YouLost{get {return "Może następnym razem...";}}
  public override string Point(int p) {
    if(p == 1)
      return "1 punkt";
    return p+" punktów";
  }
}


public class LangEN:Lang {
  public override string MenuTime {get {return "TIME";}}
  public override string MenuPoints {get {return "SCORE";}}
  public override string YouWon {get {return "You won!";}}
  public override string YouLost{get {return "Maybe next time...";}}
  public override string Point(int p) {
    if(p == 1)
      return "1 point";
    return p+" points";
  }
}

用法很简单:

GUILayout.Label(Lang.Get.YouWon);
GUILayout.Label(Lang.Get.Point(5));

这样您就拥有了最多的控制权,并且可以轻松支持复杂的翻译。此方法还有助于减少错误 - 如果您在任何地方忘记或错误输入文本会导致语法错误。

答案 2 :(得分:1)

您可以尝试为每种语言创建Javascript脚本或C#脚本,然后根据选择的语言调用特定脚本。

e.g

public class English : MonoBehaviour{
  public string jump = "Press 'space' to jump";
  //etc
}

public class French : MonoBehaviour{
  public string jump = "Appuyer sur 'espace' pour sauter";
  //etc
}

在GUIText的功能

public GameController gameController;
public GUIText text;

private string languageSelected;// obtain from the user input on language selection (better if registered in the gameController)

void Awake(){
  languageSelected = System.Activator.CreateInstance(Type.GetType(gameController.languageSelected));
  // where languageSelected will be e.g English
  text.text = languageSelected.jump;
}

答案 3 :(得分:1)

我强烈建议不要在您的代码中嵌入文本。它会减慢本地化过程(必须通过代码查找文本并不是实现本地化的最快捷方式)。

使用单独的文件。它易于维护,翻译人员无需访问代码。

看看l2本地化。它是一个非常方便的Unity插件,可以让您管理游戏的翻译。

单个Google电子表格中的所有本地化字符串。设置完成后,您需要做的就是填写它以查看游戏中的结果。

我自己就是一名游戏翻译员,而且恰巧正在管理一个名为Level Up Translation的小型游戏翻译团队。几个月前,我们在博客中发布了localization in Unity的初学者指南。随意查看它!

答案 4 :(得分:0)

例如,您可以格式化 france.txt 的语言文件:

hello=Bonjour
goodbye=Au Revoir

然后,读取文件并将其转换为字典:

string[] lines = File.ReadAllLines("france.txt");
var dict = lines.Select(l => l.Split('=')).ToDictionary(a => a[0], a => a[1]);

现在您可以按键从字典中读取:

string hello = dict["hello"];