0

我目前正在为将用于多种语言的界面创建一个 GUI。

我工作的环境是带有 Mono C# 的 Unity 4.2。应用程序必须保持非常跨平台兼容(包括 web、ios、Linux、windows)。

我想要实现的是一种处理多种语言的好方法,允许轻松添加额外的语言或额外的字段。如果我在 ruby​​ 或 python 中工作,我相信这可能是一个不错的解决方案;

class RegionalDB:
    def __init__(self):
        # Maybe connect to a data source such as a db, or files

    def set_language(self, lang):
        # Verify we have this lang, error if not
        # Set an attribute on self for every field entry in this language

text = RegionalDB()
text.set_language('de')

print text.exit_button

上述方法将允许我使用 python 对象的强大功能,能够在运行时动态分配成员。上面的代码将以德语打印数据源的“exit_button”字段中的文本。在 ruby​​ 中我可以做类似的事情,或者我可以使用 attribute_missing 函数直接查询数据源,而不是一次将内存中的所有变量分配给对象。

不幸的是,C# 的反射代码并不像上面提到的脚本那样优雅。所以我的问题如下;

  1. 用编译的强类型语言创建一个优雅的、可维护的、区域化工具。
  2. 使用统一以有效的方式存储语言数据

对于问题 1。老实说,我一直找不到设计模式,或者根本找不到太多信息。

问题2。我相信可以通过一些统一编辑器编程来解决,但是我没有太多地触及这个话题并且愿意接受建议。

所以以问题的形式;

  1. 有谁知道任何可以与 C# 一起很好地进行区域化的设计模式
  2. 关于统一编辑器中的接口/存储机制前进方向的任何建议

谢谢。

PS我必须能够在运行时更改语言

4

1 回答 1

2

有很多 C# 应用程序已经支持 l10n。

我将它们分为三种类型:

  1. 基于资源的国际化:文本存储在 XML 文件中。这是微软的方式
  2. 基于 PO 的国际化:使用历史悠久的gettext技术,其中包括许多 Unixy 工具来处理更新原始文本和翻译。您可以通过查看一些 Mono 桌面应用程序(即Banshee)的代码来了解其工作原理,并查找使用 Mono.Posix 程序集作为链接引用的 Catalog.GetString() 调用。
  3. Vernacular -based 国际化:在移动应用程序中用于抽象每个移动平台的本地化细节,并有一个通用的方法。

在我看来,最好和最现代的方法是后者。但如果你的目标是桌面应用程序,我想你可以创建/贡献一个新的 Vernacular 后端来满足这个目的。

于 2013-08-24T13:29:11.580 回答