跳转到主要内容

简化国际化应用程序的开发

项目描述

这个包试图简化国际化应用程序的工作流程和开发。它是对现有工具(特别是gettextbabel)的一个薄层封装。

基本用法

# 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 extractpybabel 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,其中 $CODEsupported_languages 列表中的语言之一(如上述示例中的 it_IT、fr_FR 和 de_DE)。

目录文件现在可以使用许多现有工具之一进行翻译,例如 QT LinguistPoedit。为了确保应用程序的正确运行,需要保留整个 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 尽可能完全避免任何全局状态。这意味着您可以实例化任意多的 TranslatorDBTranslator,每个都指向不同的目录和/或数据库。这对于测试特别有用。

然而,在实际中,大多数项目希望使用一个全局翻译器,该翻译器知道项目所有组件的消息。示例应用程序在 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() 来翻译消息。

代码的最后两行提供了一个方便的方法,可以从命令行调用 extractcompile,而不必手动指定根目录和支持的语言。只需运行

$ python translate.py extract     # ...or compile

致谢

本软件包的开发得到了 S3 s.r.l. 的慷慨资助。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源代码分布

i18n-0.2.tar.gz (6.5 kB 查看哈希值)

上传时间 源代码

支持者