【问题标题】:Making a wxPython application multilingual制作多语言的 wxPython 应用程序
【发布时间】:2009-06-25 12:49:08
【问题描述】:

我有一个用 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 方式和劣势 2nd 方式有什么优势吗?还有第三种方法吗?

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

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

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

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

wx.MessageBox(_("GREET_SO"))

【问题讨论】:

  • 您是否看过 i18n 的 wxPyWiki 配方页面以及使用 gettext 的示例? wiki.wxpython.org/RecipesI18n
  • 是的,我已经看到了,这也是我不想使用 gettext 方式的原因之一
  • 您提到的使用自己的消息文件的所有“优点”也存在gettext方式。然而,反之则不成立。

标签: python internationalization multilingual gettext


【解决方案1】:

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

wx.MessageBox(messages.GREET_SO)

可能与 gettext 相同:

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

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

【讨论】:

  • 是的,这可能是一个不错的方法,将两者合并,至少解决了我的主要问题,即消息与消息标识符相同,如果需要,我可以用我的函数替换 _ 只是为了好玩:)
【解决方案2】:

gettext 有一些优点:

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

【讨论】:

  • '1' 我认为在我的情况下并不重要,我永远不会依赖自动翻译,'2' 也不是什么大问题,因为我的方式会更容易,只翻译给定的字符串,而不是神秘的gettext 文件,我不明白'3'你如何看待翻译代码,不是吗? 4 似乎是有效的情况
  • 好吧 (4) 是 (3) 的一个特别常用的例子。关于(1):您是否尝试过 poedit 的自动翻译 - 它确实有帮助。
  • 是的,我忘了自动翻译功能 - 真的很方便!
  • @Anurag:gettext 文件并不神秘,你有 PO(便携式目标文件),它几乎是一个标准的文本文件和 MO(机器对象),它是为了性能而“编译”的。方式类似于 .py 和 .pyc 文件。
【解决方案3】:

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

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

在 fr.php 中: TEXT_I_AM = "你好"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 2012-07-04
    • 2012-03-21
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    相关资源
    最近更新 更多