【问题标题】:string hints in different languages不同语言的字符串提示
【发布时间】:2017-03-02 07:05:30
【问题描述】:

我正在 Unity3d 中创建游戏。

我在 HUD 底部的某个地方出现了提示(类似于“按 A 进行操作”)。我希望我的游戏支持更多语言,并且我不希望这些提示被硬编码在脚本中。

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

提前致谢。

【问题讨论】:

  • 如果您有 Visual Studio,并在其中进行 C# 编码,您应该能够使用资源文件。这就是那些程序使用本地化的方式。每种语言都有一个文件,短语有一个键。根据设置的语言,它将选择正确的资源文件(如果可用)。

标签: unity3d


【解决方案1】:

一种常用的方法是为每种语言创建一个 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

我还没有尝试过,但看起来不错。

【讨论】:

  • 感谢您的帮助!
【解决方案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));

通过这种方式,您拥有最大的控制权,并且可以轻松支持复杂的翻译。此外,这种方法有助于减少错误 - 如果您忘记或错误键入了引发语法错误的文本。

【讨论】:

  • 非常感谢!我想,我会像那样实现它!
【解决方案3】:

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

例如

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;
}

【讨论】:

  • 谢谢!这是一个有趣的选择
【解决方案4】:

我强烈建议不要将文本嵌入到您的代码中。它会减慢本地化过程(必须通过代码查找文本并不是处理本地化的最快和最好的方法)。

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

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

您所有的本地化字符串都在一个 Google 电子表格中。设置完成后,您只需填写即可在游戏中查看结果。

我自己是一名游戏翻译,碰巧管理着一个名为 Level Up Translation 的小型游戏翻译团队。几个月前,我们在博客中发布了localization in Unity 的初学者指南。快来看看吧!

【讨论】:

    【解决方案5】:

    例如,您可以将 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"];
    

    【讨论】:

      猜你喜欢
      • 2016-11-04
      • 2019-07-18
      • 2015-12-22
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多