我正在将Python应用程序国际化,并考虑到两个目标:
应用程序从多个包中加载类,每个包都有自己的i18n域。因此,包A中的模块使用域A,包B中的模块使用域B等
可以在应用程序运行时更改区域设置。
Python的gettext
模块使得单域单语言应用程序的国际化变得非常容易;您只需设置区域设置,然后调用gettext.install()
,找到正确的Translation
并将其ugettext
方法安装在全局命名空间中_
。但显然,全局值仅适用于单个域,并且由于它加载单个Translation
,因此它仅适用于该区域设置。
我可以在每个模块的顶部加载Translation
,并将其ugettext方法绑定为_
。然后每个模块将_
用于自己的域。但是当更改语言环境时,这仍然会中断,因为_
用于错误的语言环境。
所以我想我可以在每个函数的顶部加载正确的ugettext
,但这看起来非常麻烦。另一种方法是仍然按模块执行,但不是绑定ugettext
,而是替换我自己的函数,它将检查当前的语言环境,获取其Translation
,并将字符串转发给它。有没有人有更清洁的解决方案?
答案 0 :(得分:2)
如何将_绑定到一个大致类似的函数(对于每个模块):
def _(message):
return my_gettext(__name__, message)
这允许您使用gettext,同时在每个模块的每个调用基础上执行任何查找,允许您切换区域设置。