python – 如何同时使用多个.mo文件进行gettext转换?

前端之家收集整理的这篇文章主要介绍了python – 如何同时使用多个.mo文件进行gettext转换?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

总之,我可以同时在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()吗?但是这会覆盖之前定义的_()并弄乱主应用程序的未来翻译.

有没有办法将两个.mo文件合二为一(例如安装新的插件时)?

在运行时,我可以将它们组合成一个GNUTranslation对象吗?或者覆盖添加到全局命名空间的默认_()方法?然后,我将如何选择该选项?
而不是_(‘Hello World’),我会使用_(‘plugin1′,’插件1中的Hello World’)

注意:应用程序不应该知道要安装的所有插件,因此它不能已经在其main.mo文件中翻译了所有消息.

最佳答案
您应该为每个插件使用不同的域.域可以是包名以防止冲突.

我不明白为什么你需要使用插件的域来翻译插件之外的东西,但如果你真的需要,那么你应该每次都消除域的歧义.

每个插件都可以提供它自己的“非核心”,很容易绑定到插件的域:

from my.plugin import MessageFactory as _my_plugin

请注意,下划线只是一个约定,因此提取工具可以在程序中找到支持i18n的消息.插件的消息应该在各自的包中用下划线标记(你确实将它们放在单独的包中,对吧?).在所有其他地方,您可以通过其他名称自由地调用这些工厂,并为主程序转换域留下下划线.

我对.mo文件不太了解,但你可以将所有.po文件编译成一个.mo文件.但是,如果插件是由独立的不合作作者编写的,则可能存在msgid冲突.

更新:

如果插件与主应用程序位于同一个包中,那么为它们使用单​​独的翻译域是没有意义的(这不是您的情况).如果插件位于单独的包中,则应该针对这些包单独进行提取.在这两种情况下,变量_都没有问题.如果由于某种原因主应用程序在其代码中需要插件的翻译,请使用_的其他名称,如答案中所示.当然,提取工具除了下划线外不会识别任何东西.

换句话说,插件应该自己关心他们的翻译.主应用程序可以使用插件特定的翻译功能作为插件API的一部分.将字符串提取或手动添加到po / mo文件中也不是主要应用程序所关注的问题:它由插件作者提供翻译.

原文链接:https://www.f2er.com/python/439243.html

猜你在找的Python相关文章