2

我有一个用 wxPython 编写的应用程序,我想制作多语言。我们的选择是

  1. 使用 gettext http://docs.python.org/library/gettext.html
  2. 将所有 UI 文本分离到 messages.py 文件中,并使用它来翻译文本

我非常倾向于第二种方式,我认为采用 gettext 方式没有任何好处,使用第二种方式我可以将所有消息放在一个地方而不是代码中,所以如果我需要更改消息,则无需更改代码,以防万一gettext 我可能对 msg-constants 感到困惑,因为我将只是包装原始 msg 而不是将其转换为 messages.py 中的常量

基本上代替

wx.MessageBox(_("Hi stackoverflow!"))

我认为

wx.MessageBox(messages.GREET_SO)

更好,那么gettext方式和劣势第二种方式有什么优势吗?还有第三种方法吗?

编辑:gettext 语言文件似乎也太依赖代码了,如果我想要两条英语相同但法语不同的消息会发生什么,例如假设法语对英语的不同场景有更微妙的翻译一个是可以的

经验:我已经走了第二条路,我必须说每个应用程序都应该尝试从代码中提取 UI 文本,它提供了重构的机会,看看 UI 在哪里进入模型以及在哪里可以改进 UI 文本,相比之下 gettext 是机械师,没有为编码员提供任何输入,我认为维护起来会更困难。

在为文本创建名称时,例如 PRINT_PROGRESS_MSG,有机会看到在许多地方,相同的 msg 的使用方式略有不同,并且可以合并为一个名称,这在我以后只需要更改 msg 一次时会有所帮助。

结论:我仍然不确定使用 gettext 并使用我自己的消息文件有什么好处。但我选择的答案至少解释了为什么 gettext 是有益的。最终的解决方案 IMO 是从两种方式中获得最佳效果的方法,即我自己的由 gettext 包装的消息标识符,例如

wx.MessageBox(_("GREET_SO"))
4

3 回答 3

1

Gettext 是要走的路,在您的示例中,您还可以使用 gettext 来“避免将翻译存储在代码中”:

wx.MessageBox(messages.GREET_SO)

gettext 可能与以下内容相同:

wx.MessageBox(_("GREET_SO")) or wx.MessageBox(_("messages.GREET_SO"))

Gettext 几乎是多语言应用程序的标准,我很确定您将来会从使用它中受益。例如,您可以使用 Poedit(或其他类似应用程序)将翻译分配给您的合作者或贡献者,然后将一条或多条消息标记为未正确翻译。此外,如果缺少/额外的条目,poedit 会警告您。不要自欺欺人,gettext 是唯一被证明是维护翻译的可靠方法。

于 2009-07-01T12:58:30.873 回答
1

gettext 有一些优点:

  1. 最大的优势之一是:使用 poedit 进行翻译时,您可以从翻译数据库中受益。基本上 poedit ca 会扫描您的硬盘并查找已翻译的文件,并会在您翻译文件时提出建议。
  2. 当您将代码提供给其他人进行翻译时,他们可能已经知道 gettext 的翻译方式,而您必须向他们解释您的翻译方式。
  3. 你在代码的上下文中有文本,所以当你看到翻译周围的代码时,它应该更容易翻译
  4. 考虑如下文本:print _('%d files of %d files selected') % (num, numTotal)甚至更复杂的情况。在这里,它确实有助于周围的代码......
于 2009-06-25T15:05:52.260 回答
-1

对于网络(这是 PHP,但想法相同),我总是在特定目录中创建多个语言文件。en.php、fr.php 等等。这些文件包含给定语言的所有输出文本的定义。用户对语言的偏好决定了包含哪些文件,因此,输出出现在哪种语言中。例如...

在 en.php 中:TEXT_I_AM = "我是"

在 fr.php 中:TEXT_I_AM = "Je suis"

于 2009-06-25T12:55:10.387 回答