使用多个i18n域实现Python应用程序国际化的最佳方法是什么?

时间:2009-03-29 15:08:07

标签: python localization internationalization

我正在将Python应用程序国际化,并考虑到两个目标:

  1. 应用程序从多个包中加载类,每个包都有自己的i18n域。因此,包A中的模块使用域A,包B中的模块使用域B等

  2. 可以在应用程序运行时更改区域设置。

  3. Python的gettext模块使得单域单语言应用程序的国际化变得非常容易;您只需设置区域设置,然后调用gettext.install(),找到正确的Translation并将其ugettext方法安装在全局命名空间中_。但显然,全局值仅适用于单个域,并且由于它加载单个Translation,因此它仅适用于该区域设置。

    我可以在每个模块的顶部加载Translation,并将其ugettext方法绑定为_。然后每个模块将_用于自己的域。但是当更改语言环境时,这仍然会中断,因为_用于错误的语言环境。

    所以我想我可以在每个函数的顶部加载正确的ugettext,但这看起来非常麻烦。另一种方法是仍然按模块执行,但不是绑定ugettext,而是替换我自己的函数,它将检查当前的语言环境,获取其Translation,并将字符串转发给它。有没有人有更清洁的解决方案?

1 个答案:

答案 0 :(得分:2)

如何将_绑定到一个大致类似的函数(对于每个模块):

def _(message):
    return my_gettext(__name__, message)

这允许您使用gettext,同时在每个模块的每个调用基础上执行任何查找,允许您切换区域设置。