我有一个用wxPython编写的应用程序,我想用多语言编写。 我们的选择是
我非常倾向于第二,我认为以gettext方式没有任何好处, 使用第二种方式我可以将所有消息放在一个地方而不是代码中,所以如果我需要更改消息,代码不需要更改,在gettext的情况下我可能会混淆msg-constants因为我将只是包装原始msg而不是在messages.py
中将其转换为常量基本上不是
wx.MessageBox(_("Hi stackoverflow!"))
我认为
wx.MessageBox(messages.GREET_SO)
更好,所以gettext方式和劣势第二方面有什么优势吗?还有第三种方式吗?
编辑: gettext语言文件似乎与代码过于紧密,如果我想要两条英语相同但法语不同的消息,会发生什么?假设法语对于英语的不同scnerarios有更微妙的翻译,这是可以的
经验: 我已经走了第二条道路,我必须说每个应用程序都应该尝试从代码中提取UI文本,它提供了重构的机会,看看UI正在进入模型的位置以及UI文本可以改进的地方,相比之下gettext是机制,没有给编码员任何输入,我认为维护起来会更困难。
并为文本创建名称,例如PRINT_PROGRESS_MSG,有机会看到在许多地方,相同的msg使用方式略有不同,可以合并为一个名称,稍后我需要只更改一次msg时会有所帮助。
结论:我仍然不确定使用gettext和使用我自己的消息文件有什么好处。但我选择的答案至少解释了为什么gettext可能有益的几点。 IMO的最终解决方案是从两种方式中获得最佳效果,即我自己的消息标识符由gettext包装,例如
wx.MessageBox(_("GREET_SO"))
答案 0 :(得分:1)
gettext有一些优点:
print _('%d files of %d files selected') % (num, numTotal)
以及更复杂的情况。这里的代码真的很有帮助...... 答案 1 :(得分:1)
Gettext是要走的路,在你的例子中你也可以使用gettext“避免在代码中存储翻译”:
wx.MessageBox(messages.GREET_SO)
可能与gettext相同:
wx.MessageBox(_("GREET_SO")) or wx.MessageBox(_("messages.GREET_SO"))
Gettext几乎是多语言应用程序的标准,我非常确定您将来会从中受益。例如,您可以使用Poedit(或其他类似的应用程序)为您的协作者或贡献者分配翻译,然后将一个或多个消息标记为未正确翻译。如果有遗漏/额外的条目,poedit会警告你。不要欺骗自己,gettext是唯一经过验证的可靠的翻译方式。
答案 2 :(得分:-1)
对于网络(这是PHP但想法相同),我总是在特定目录中创建多个语言文件。 en.php,fr.php等。这些文件包含给定语言的所有输出文本的定义。用户对语言的偏好决定了哪些文件被包含在内,因此输出出现在哪种语言中。例如......
在en.php中: TEXT_I_AM =“我是”
fr.php中的: TEXT_I_AM =“Je suis”