15.1.5 应用与模块本地化
转换的作业域定义了如何安装gettext,以及如何将gettext用于一个代码体。
15.1.5.1 应用本地化
对于全应用范围的转换,可以让作者使用__builtins__命名空间全局地安装类似ungettext()的函数,这是可以接受的,因为作者可以控制应用的顶层代码,并理解完整的需求。
import gettext
gettext.install(
'example',
'locale',
names=['ngettext'],
)
print(_('This message is in the script.'))
install()函数将gettext()绑定到__builtins__命名空间中的名_()。它还增加了ngettext()和names中列出的其他函数。
15.1.5.2 模块本地化
对于一个库或单个模块,修改__builtins__并不是一个好主意,因为这可能会与某个应用全局值冲突。实际上,应当在模块前面手工地导入或重新绑定转换函数名。
import gettext
t = gettext.translation(
'example',
'locale',
fallback=False,
)
_ = t.gettext
ngettext = t.ngettext
print(_('This message is in the script.'))
15.1.6 切换转换
前面的例子在整个程序期间都使用了一个转换。有些情况下,特别是对于web应用,还需要在不同时间使用不同的消息编目,而不要退出和重新设置环境。对于这些情况,gettext中提供的基于类的API会更为方便。这些API调用实际上与这一节中介绍的全局调用相同,不过会发布消息编目对象,而且可以直接管理,因此可以使用多个编目。