总之,我可以同时在python中使用多个.mo文件用于同一种语言吗?
在我的python应用程序中,我需要为I18N使用gettext.这个应用程序使用一种插件系统.这意味着你可以下载一个插件并将其放在适当的目录中,它就像任何其他python包一样运行.主应用程序存储它使用的.mo文件,例如./locale/en/LC_MESSAGES/main.mo.插件nr 1在同一目录中有自己的.mo文件plugin1.mo.
我会用它来加载main.mo I18N消息:
gettext.install('main','./locale',unicode=False)
我想到的解决方案:
我应该在每个包的名称空间中使用gettext.install()吗?但是这会覆盖之前定义的_()并弄乱主应用程序的未来翻译.
在运行时,我可以将它们组合成一个GNUTranslation对象吗?或者覆盖添加到全局命名空间的默认_()方法?然后,我将如何选择该选项?
而不是_(‘Hello World’),我会使用_(‘plugin1′,’插件1中的Hello World’)
我不明白为什么你需要使用插件的域来翻译插件之外的东西,但如果你真的需要,那么你应该每次都消除域的歧义.
每个插件都可以提供它自己的“非核心”,很容易绑定到插件的域:
from my.plugin import MessageFactory as _my_plugin
请注意,下划线只是一个约定,因此提取工具可以在程序中找到支持i18n的消息.插件的消息应该在各自的包中用下划线标记(你确实将它们放在单独的包中,对吧?).在所有其他地方,您可以通过其他名称自由地调用这些工厂,并为主程序转换域留下下划线.
我对.mo文件不太了解,但你可以将所有.po文件编译成一个.mo文件.但是,如果插件是由独立的不合作作者编写的,则可能存在msgid冲突.
更新:
如果插件与主应用程序位于同一个包中,那么为它们使用单独的翻译域是没有意义的(这不是您的情况).如果插件位于单独的包中,则应该针对这些包单独进行提取.在这两种情况下,变量_都没有问题.如果由于某种原因主应用程序在其代码中需要插件的翻译,请使用_的其他名称,如答案中所示.当然,提取工具除了下划线外不会识别任何东西.
换句话说,插件应该自己关心他们的翻译.主应用程序可以使用插件特定的翻译功能作为插件API的一部分.将字符串提取或手动添加到po / mo文件中也不是主要应用程序所关注的问题:它由插件作者提供翻译.