我有一个针对Python 2.7编写的国际化应用程序。 在其中我使用了一些我写过的包。我想要翻译这些包中的用户可见文本。
鉴于应用程序使用_
将__builtin__
安装到translation.install
命名空间中,如何让各个包的文本翻译为具有自己域名的特定翻译?例如,是否可以合并两个翻译?然后我可以让应用程序在导入时合并包导入,如果我把它放在传统的地方。
我是否必须在每个子包的顶部定义_
和其他gettext助手?如果是这样,他们如何在保持松散耦合的同时接受应用程序配置的语言?
这感觉它比它应该更复杂,这让我相信我不理解某些东西。
答案 0 :(得分:1)
我建议不要将_
安装到内置版中,而是在包__init__
中定义它,并在其他模块中明确导入它。
E.g。 mypackage/__init__.py
:
import gettext
translations = gettext.translation('mypackage')
_ = translations.ugettext
然后在其他地方
from mypackage import _
some_string = _("Something that will be translated")
我实际上很久没有使用过gettext了,所以拿这个例子加盐(尽管它基于recommendation in gettext's documentation)。
我主要使用基于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)