在Python应用程序中国际化子包

时间:2013-03-28 16:23:53

标签: python internationalization gettext

我有一个针对Python 2.7编写的国际化应用程序。 在其中我使用了一些我写过的包。我想要翻译这些包中的用户可见文本。

鉴于应用程序使用___builtin__安装到translation.install命名空间中,如何让各个包的文本翻译为具有自己域名的特定翻译?例如,是否可以合并两个翻译?然后我可以让应用程序在导入时合并包导入,如果我把它放在传统的地方。

我是否必须在每个子包的顶部定义_和其他gettext助手?如果是这样,他们如何在保持松散耦合的同时接受应用程序配置的语言?

这感觉它比它应该更复杂,这让我相信我不理解某些东西。

1 个答案:

答案 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)