简化国际化应用程序的开发
项目描述
这个包试图简化国际化应用程序的工作流程和开发。它是对现有工具(特别是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 的目录,其中存储翻译。
提取消息
在实际翻译之前,您需要通过在 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 文件,其中包含在应用程序中找到的所有消息。
此外,extract() 还为每个受支持的语种创建一个 消息目录 文件,例如 languages/$CODE/LC_MESSAGES/messages.po,其中 $CODE 是 supported_languages 列表中的语言之一(如上述示例中的 it_IT、fr_FR 和 de_DE)。
目录文件现在可以使用许多现有工具之一进行翻译,例如 QT Linguist 或 Poedit。为了确保应用程序的正确运行,需要保留整个 languages/ 目录结构。我们建议将各种 messages.po 文件与属于该应用程序的其他文件一起存放在版本控制系统。
更新消息
在应用程序开发过程中,您肯定会添加需要翻译的新消息。extract 命令会自动处理这种情况:如果它找到现有的目录文件,则将其内容(包括现有的翻译)与新提取的消息合并。
编译目录
在使用 gettext 之前,需要编译目录文件。默认情况下,我们的 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 会自动在 DB 中创建 translation_entries 表。然后,应用程序需要提供一个用户界面来操作该表。为了测试,您可以使用 add_translation() 方法在 DB 中插入一个新的翻译。
tr.add_translation("it_IT", "hello world", "ciao mondo") print tr._("hello world") # prints "ciao mondo"
如何使用全局 Translator
按照设计,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)
这样,应用程序的其余部分可以简单地从 translate.py 中导入并使用 _() 和 ngettext()。或者,根据您的喜好,直接导入 tr 对象并使用 tr._() 和 tr.ngettext() 来翻译消息。
代码的最后两行提供了一个方便的方法,可以从命令行调用 extract 和 compile,而不必手动指定根目录和支持的语言。只需运行
$ python translate.py extract # ...or compile
致谢
本软件包的开发得到了 S3 s.r.l. 的慷慨资助。
项目详情
i18n-0.2.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a6206172b184887c57a5a209d8be7aa5f70d36a7a66aa7506754e9e377d2fb4c |
|
MD5 | 4463da4ad3678728741b757b3a6aa55a |
|
BLAKE2b-256 | 06f75252ff5349e5b39320a7aee118c48fa890baebb0aa33b76968a41f4ed151 |