简化国际化应用程序的开发
i18n的Python项目详细描述
这个包试图简化 国际化的应用程序。它是一个围绕现有工具的薄包装。 特别是gettext和babel。
基本用法
# demo.py # from i18n.translator import Translator supported_languages = ['it_IT', 'fr_FR', 'de_DE'] # activate italian translations tr = Translator('/path/to/root', supported_languages, 'it_IT') print tr._('Hello world!')
其中/path/to/root/是项目的根目录。什么时候? 实例化后,Translator类会自动创建一个目录 称为/path/to/root/languages,其中存储翻译。
提取消息
在进行实际翻译之前,您需要extract从 您的源文件,通过调用i18n模块上的extract命令, 它是一个包装pybabel extract和pybabel update:
$ python -m i18n --root=/path/to/root --languages=it_IT,fr_FR,de_DE extract
extract查找对_()的调用中包装的所有消息,
gettext()或ngettext()并生成一个名为
languages/template.pot。这是一个标准gettext po file`
,它
包含应用程序中找到的所有消息。
此外,extract()还为每个 支持的语言为languages/$CODE/LC_MESSAGES/messages.po,其中 $CODE是supported_languages(it, 上面例子中的fr_fr和de_de)。
目录文件现在可以使用 现有的工具,例如QT Linguist或Poedit。为了正确 应用程序运行时,整个languages/层次结构需要 保存。我们建议在版本中跟踪各种messages.po文件 控制系统以及属于应用程序的其他文件。
更新消息
在应用程序的开发过程中,您肯定会向 被翻译。extract命令自动处理这种情况:如果 查找现有的目录文件及其内容(包括现有内容) 与新提取的消息合并。
编译目录
在使用目录文件之前,必须先编译它们 获取文本。默认情况下,我们的Translator对象自动编译所有 在languages/中找到的目录,生成相应的.mo 文件夹。只有在修改了目录文件后才进行编译。 这意味着在大多数情况下,您不必担心编译 目录的。
如果你想控制这一步,你可以通过 autocompile=False到Translator的构造函数并编译它们 从命令行手动操作:
$ python -m i18n --root=/path/to/root --languages=it_IT,fr_FR,de_DE compile
在数据库中存储翻译
对于某些应用程序,让用户定义新的翻译是很有用的 和/或覆盖默认值。i18n使用 DBTranslator类,它是Translator的子类。什么时候? 翻译,DBTranslator首先在数据库中查找:如果消息是 未找到,它委托给标准的gettext行为。
DBTranslator基于sqlalchemy。它的构造函数需要 engine参数:
from i18n.dbtranslator import DBTranslator from sqlalchemy import create_engine engine = create_engine('sqlite:///db.sqlite') ROOT = '/path/to/root' LANGUAGES = ['it_IT', 'fr_FR'] DEST_LANGUAGE = 'it_IT' tr = DBTranslator(ROOT, LANGUAGES, DEST_LANGUAGE, engine=engine) print tr._("hello world")
DBTranslator自动在中创建表translation_entries。 数据库。然后,由应用程序提供用户界面 操纵桌子。对于测试,可以使用add_translation() 在数据库中插入新翻译的方法:
tr.add_translation("it_IT", "hello world", "ciao mondo") print tr._("hello world") # prints "ciao mondo"
如何使用全局转换器
通过设计,i18n试图完全避免任何全局状态。这意味着 你可以实例化尽可能多的Translator和DBTranslator。 需要,每个引用不同的目录和/或数据库。这是 对测试特别有用。
然而,在实践中,大多数项目希望使用一个全局转换器,它知道 关于项目中所有组件的消息。演示应用程序 显示在translate.py模块中执行此操作的方法:
import py from i18n.translator import Translator # set the root of the project to the directory containing this file ROOT = py.path.local(__file__).dirpath() LANGUAGES = ['it_IT', 'fr_FR', 'de_DE'] tr = Translator(ROOT, LANGUAGES, 'it_IT') _ = tr._ ngettext = tr.ngettext if __name__ == '__main__': tr.cmdline(sys.argv)
这样,应用程序的其余部分就可以简单地导入并使用_()和 ngettext()来自translate.py。或者,根据您的喜好,直接导入 tr对象并使用tr._()和tr.ngettext()来翻译 信息。
代码的最后两行启用一种方便的方法来调用extract 和compile从命令行执行,而无需手动指定 根目录和支持的语言。只需运行:
$ python translate.py extract # ...or compile
致谢
这个软件包的开发得到了S3 s.r.l.的慷慨资助。