jad*_*k94 6 python plugins gettext internationalization
总之,我可以同时在python中使用.mo同一种语言的python许多文件吗?
在我的python应用程序中,我需要使用gettextI18N.这个应用程序使用一种插件系统.这意味着你可以下载一个插件并将其放在适当的目录中,它就像任何其他python包一样运行.主应用程序存储.mo它使用的文件./locale/en/LC_MESSAGES/main.mo.插件nr 1 在同一目录中.mo调用了自己的文件plugin1.mo.
我会用它来加载main.moI18N消息:
gettext.install('main', './locale', unicode=False)
Run Code Online (Sandbox Code Playgroud)
如何安装其他插件,以便所有插件按照应有的方式进行翻译?
我想到的解决方案:
我应该gettext.install()在每个包的命名空间中吗?但是这会覆盖_()之前定义的并且混乱主应用程序的未来翻译.
有没有办法将两个.mo文件合二为一(例如安装新的插件时)?
在运行时,我可以将它们组合成一个GNUTranslation对象吗?或者覆盖_()添加到全局命名空间的默认方法?然后,我将如何选择该选项?而不是_('Hello World'),我会使用_('plugin1', 'Hello World in plug-in 1')
注意:应用程序不应该知道要安装的所有插件,因此它不能已经在其main.mo文件中翻译了所有消息.
您应该为每个插件使用不同的域。域名可以是包名,防止冲突。
我不明白为什么您需要使用插件的域来翻译插件之外的内容,但如果您确实需要,那么您应该每次都消除域的歧义。
每个插件都可以提供自己的“undescore”,很容易绑定到插件的域:
from my.plugin import MessageFactory as _my_plugin
Run Code Online (Sandbox Code Playgroud)
请注意,下划线只是一种约定,因此提取工具可以在程序中找到启用 i18n 的消息。插件的消息应该在各自的包中用下划线标记(您确实将它们放入单独的包中,对吗?)。在所有其他地方,您可以自由地用其他名称来调用这些工厂,并为主程序翻译域留下下划线。
我对 .mo 文件不太确定,但您肯定可以将所有 .po 文件编译成一个 .mo 文件。但是,如果插件是由不合作的独立作者编写的,则可能会出现 msgid 冲突。
更新:
如果插件与主应用程序位于同一包中,则为它们使用单独的翻译域是没有意义的(这不是您的情况)。如果插件位于单独的包中,则应该对这些包独立进行提取。在这两种情况下,变量 _ 都没有问题。如果由于某种原因主应用程序希望在其代码中使用插件的翻译,请使用 _ 的其他名称,如答案中所示。当然,提取工具除了下划线之外不会识别任何内容。
换句话说,插件应该自己关心它们的翻译。主应用程序可以使用特定于插件的翻译功能作为插件 API 的一部分。主应用程序也不关心将字符串提取或手动添加到 po/mo 文件中:由插件作者提供翻译。
| 归档时间: |
|
| 查看次数: |
2117 次 |
| 最近记录: |