1

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

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

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

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

4

1 回答 1

1

我建议不要安装_到内置程序中,而是在你的包中定义它__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)
于 2013-03-29T07:39:26.847 回答