15.1.2 有源代码创建消息编目
gettext首先在一个转换数据库中查找字面量串,并取出适当的转换串。常用模式是将适当的查找函数与名“_”(单个下划线字符)绑定,使得代码中不会堆积大量长名函数调用。
消息抽取程序xgettext会查找嵌入在编目查找函数(catalog lookup function)调用中的消息。它知道不同的源语言,并分别使用适当的解析器。如果查找函数有别名,或者增加了额外的函数,那么便要为xgettext提供这些额外符号的名,从而能够在抽取消息时考虑到。
以下脚本提供了一个消息,可以完成转换。
import gettext
# Set up message catalog access.
t = gettext.translation(
'example_domain','locale',
fallback=True,
)
_ = t.gettext
print(_('This message is in the script.'))
文本“This message is in the script.”是将要由编码替换的消息。这里启用了Fallback模式,所以如果运行脚本时没有一个消息编目,则会打印内联的消息。
下一步是抽取消息,并创建.pot文件,,这里可以使用pygettext.py或xgettext。
生成的输出文件包含以下内容。
消息编目被安装到按域(domain)和语言(language)组织的目录中。域由应用或库提供,通常是一个唯一值,如应用名。在这里,gettext_example.py中的域是example_domian。语言值则由用户环境在运行时通过某个环境变量(LANGYAGE,LC_ALL,LC_MESSAGE或LANG)提供,这取决于其配置和平台。这一章中的例子在运行时都将语言设置为en_US。
既然模板已经准备好,那么下一步便是创建必要的目录结构,并把模板复制到适当的位置。
使用msgformat从.po文件构建这个编目。
gettext_example.py中的域是example_domain,但是文件名为example.pot。要让gettext找到正确的转换文件,名字必须匹配。
t = gettext.translation(
'example','locale',
fallback=True,
)
现在运行脚本时,会打印编目中的消息而不是内联字符串。