[英]Internationalizing subpackages in a Python application
我有一个针对Python 2.7编写的国际化应用程序。 在其中,我使用了一些我编写的软件包。 我希望翻译这些软件包中的用户可见文本。
假设应用程序通过translation.install
将_
安装到__builtin__
命名空间中,我如何获取各个软件包以将其文本翻译为具有各自域的特定翻译? 例如,是否可以合并两个翻译? 然后,如果我将其放在常规位置,则可以让应用程序在导入时合并软件包翻译。
我是否必须在每个子包的顶部定义_
和其他gettext帮助器? 如果是这样,他们如何在保持松散耦合的同时选择应用程序配置的语言?
感觉这比应该做的要复杂得多,这使我相信自己对某些事情不了解。
我建议不要将_
安装到内置函数中,而应在包的__init__
定义它,然后将其显式导入其他模块中。
例如mypackage/__init__.py
:
import gettext
translations = gettext.translation('mypackage')
_ = translations.ugettext
然后在其他地方
from mypackage import _
some_string = _("Something that will be translated")
我已经有很长时间没有实际使用gettext了,所以以这个例子为例(尽管它是基于gettext文档中的建议 )。
我主要使用基于Zope的Web应用程序,这些模块在模块导入期间无法进行翻译-我们需要将实际翻译延迟到请求呈现时间,以便我们知道用户的首选语言。 我们使用zope.i18nmessageid的MessageFactory以非常相似的方式标记要翻译的字符串:
# mypackage/__init__.py
from zope.i18nmessageid import MessageFactory
_ = MessageFactory("mypackage")
# mypackage/somemodule.py
from mypackage import _
some_string = _("Something that will be translated later")
# e.g. with print zope.i18n.translate(some_string, request)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.