我有一个用 wxPython 编写的应用程序,我想制作多语言。我们的选择是
- 使用 gettext http://docs.python.org/library/gettext.html
- 将所有 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"))