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

i18n的Python项目详细描述


这个包试图简化 国际化的应用程序。它是一个围绕现有工具的薄包装。 特别是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,其中存储翻译。

提取消息

在进行实际翻译之前,您需要extract从 您的源文件,通过调用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 file`,它 包含应用程序中找到的所有消息。

此外,extract()还为每个 支持的语言为languages/$CODE/LC_MESSAGES/messages.po,其中 $CODEsupported_languages(it, 上面例子中的fr_fr和de_de)。

目录文件现在可以使用 现有的工具,例如QT LinguistPoedit。为了正确 应用程序运行时,整个languages/层次结构需要 保存。我们建议在版本中跟踪各种messages.po文件 控制系统以及属于应用程序的其他文件。

更新消息

在应用程序的开发过程中,您肯定会向 被翻译。extract命令自动处理这种情况:如果 查找现有的目录文件及其内容(包括现有内容) 与新提取的消息合并。

编译目录

在使用目录文件之前,必须先编译它们 获取文本。默认情况下,我们的Translator对象自动编译所有 在languages/中找到的目录,生成相应的.mo 文件夹。只有在修改了目录文件后才进行编译。 这意味着在大多数情况下,您不必担心编译 目录的。

如果你想控制这一步,你可以通过 autocompile=FalseTranslator的构造函数并编译它们 从命令行手动操作:

$ 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试图完全避免任何全局状态。这意味着 你可以实例化尽可能多的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)

这样,应用程序的其余部分就可以简单地导入并使用_()ngettext()来自translate.py。或者,根据您的喜好,直接导入 tr对象并使用tr._()tr.ngettext()来翻译 信息。

代码的最后两行启用一种方便的方法来调用extractcompile从命令行执行,而无需手动指定 根目录和支持的语言。只需运行:

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

致谢

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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JavaSpringMVC控制器测试打印结果JSON字符串   若catch语句返回,那个么为什么它最终会阻塞呢?   java Grails中servletContext在哪里可用?   java Jhipster:如何为现有项目启用多种语言   java异常评估SpringEL表达式:“#fields.hasErrors('something')”   java如何验证SeleniumWebDriver中的文本颜色?   java在绘图时使用JPanel坐标   java如何初始化spring启动到project?   java如何通过JDBC的PreparedStatement将UUID数组插入HyperSQL数据库   java修改JVM以跨线程序列化文件访问   Javascript到Java正则表达式   使用Java运行时调用aspell程序时出现字符集问题。getRuntime()。执行官   执行RDP时的java Sukuli按钮识别   java如何使用okhttp更改connect请求的标头   java无法创建Maven Eclipse项目