翻译工具集
项目描述
什么是lingua?
Lingua是一个包含从代码中提取可翻译文本以及检查现有翻译的工具包。它取代了gettext中的
消息提取
提取所有可翻译消息的最简单方法是使用
$ pot-create src
这将创建一个包含所有找到的消息的messages.pot文件。
指定输入文件
有三种方法告诉lingua要扫描哪些文件
在命令行上直接指定文件名。例如
$ pot-create main.py utils.py
在命令行上指定目录。Lingua将递归地扫描该目录中所有它知道如何处理的文件。
$ pot-create src
使用--files-from参数指向一个包含要扫描的文件列表的文件。以#开头的行和空行将被忽略。
$ pot-create --files-from=POTFILES.in
您还可以使用 --directory=PATH 参数将指定的路径添加到检查文件的目录列表中。这可能听起来有些令人困惑,但可能会很有用。例如,这个命令将在当前目录中查找 main.py 和 utils.py 文件,如果它们在 ../src 目录中找不到
$ pot-create --directory=../src main.py utils.py
配置
默认配置下,lingua 将使用其 Python 提取器处理 .py 文件,其 XML 提取器处理 .pt 和 .zpt 文件,其 ZCML 提取器处理 .zcml 文件。如果您使用不同的扩展名,则需要设置一个配置文件来告诉 lingua 如何处理文件。此文件使用简单的 ini 风格格式。
配置文件中可以设置两种类型的配置:为文件扩展名指定使用哪个提取器,以及单个提取器的配置。
文件扩展名在 extensions 节中进行配置。该节中的每个条目都将一个文件扩展名映射到提取器名称。例如,要告诉 lingua 使用其 XML 提取器处理具有 .html 扩展名的文件,您可以使用以下配置
[extensions] .html = xml
要了解可用的提取器,请使用 -list-extractors 选项。
$ bin/pot-create --list-extractors chameleon Chameleon templates (defaults to Python expressions) python Python sources xml Chameleon templates (defaults to Python expressions) zcml Zope Configuration Markup Language (ZCML) zope Zope templates (defaults to TALES expressions)
可以使用名为 extractor:<name> 的节来配置特定的提取器。例如,要告诉 XML 提取器默认用于表达式的语言是 TALES 而不是 Python
[extractor:xml] default-engine = tales
您可以将全局配置文件 .config/lingua 放到您的家目录中,或使用 --config 选项将 lingua 指向您的配置文件。
$ pot-create -c lingua.cfg src
域过滤
当处理大型系统时,您可能需要在单个源树中使用多个翻译域。Lingua 可以通过在扫描源时按域过滤消息来支持这一点。要启用域过滤,请使用 -d 选项。
$ pot-create -d mydomain src
Lingua 将始终包括它无法确定域的消息。例如,考虑以下 Python 代码:
print(gettext(u'Hello, World')) print(dgettext('mydomain', u'Bye bye'))
第一条 hello-message 没有指定其域,因此将始终被包括。第二条行使用 dgettext 明确指定域。Lingua 将在过滤域时使用这些信息。
包含注释
您可以为消息添加注释以帮助翻译人员,例如解释文本的用法,或提供翻译提示。对于 chameleon 模板,可以使用 i18n:comment 属性来完成此操作。
<label i18n:comment="This is a form label" i18n:translate="">Password</label>
注释是继承的,因此您也可以在父元素上放置它们。
<form i18n:comment="This is used in the password reset form"> <label i18n:translate="">Password</label> <button i18n:translate="">Change</button> </form>
对于 Python 代码,您可以使用 --add-comments 选项告诉 lingua 包括注释。这将使 Linua 在翻译调用之前的行(之间可能有空行)上包括所有注释。
# This text should address the user directly. return _('Thank you for using our service.')
或者,您也可以在开始翻译函数调用的行的末尾放置注释。
return _('Thank you for using our service.') # Address the user directly
如果您不想包括所有注释,只想包括特定的注释,您可以在 --add-comments 选项中添加一个关键字,例如 --add-comments=I18N。
# I18N This text should address the user directly, and use formal addressing. return _('Thank you for using our service')
在注释中设置消息标志
消息可以包含标志。这些标志用来指示消息的格式,通常由验证工具用来检查翻译是否不会破坏变量引用或模板语法。Lingua能够合理地检测使用C和Python格式的字符串,但有时您可能需要自己设置标志。这可以通过在注释中使用[标志, 标志]标记来完成。
# I18N [markdown,c-format] header = _(u'# Hello *%s*')
指定关键词
在查找消息时,lingua解析器使用默认的关键词列表来识别翻译调用。您可以通过--keyword选项添加额外的关键词。如果您有自己的mygettext函数,它将翻译字符串作为第一个参数,您可以使用这个函数
$ pot-create --keyword=mygettext
如果您的函数接受更多参数,您需要告诉lingua这些参数。这可以通过几种方式来完成
如果可翻译的文本不是第一个参数,您可以使用<keyword>:<parameter number>来指定参数号。例如,如果您使用i18n_log(level, msg),关键词指定器将是i18n_log:2
如果您支持复数,您可以指定用于单数和复数文本的参数号。例如,如果您的函数签名是show_result(single, plural),则关键词指定器是show_result:1,2
如果您使用消息上下文,您可以添加一个c到参数号中,来指定用于上下文的参数。例如,pgettext的关键词指定器是pgettext:1c,2。
如果您的函数接受域作为参数,您可以添加一个d到参数号中,来指定用于域的参数。例如,dgettext的关键词指定器是dgettext:1d,2。这是一个lingua指定的扩展。
您可以使用t后缀来指定函数调用必须具有的确切参数数量。例如,如果函数must有四个参数才是有效调用,则指定器可以是myfunc:1,4t。
提取器
Lingua包含了一些提取器
python:处理Python源代码。
chameleon:处理Chameleon文件,使用Zope i18n语法
zcml:处理Zope配置标记语言(ZCML)文件。
- zope:chameleon提取器的变体,它假设默认的表达式语言是TALES而不是Python。
xml:旧名称为chameleon提取器。这个名称不应再使用,并且仅为了向后兼容而支持。
比较其他工具
Babel提取器
有几个包为Babel的消息提取工具提供插件。Lingua也可以使用这些插件。插件名称将以前缀babel-开头,以区分lingua提取器。
例如,如果您已安装PyBabel-json包,您可以通过在配置文件中添加以下内容来指示lingua使用它处理.json文件
[extensions] .json = babel-json
某些Babel插件要求您指定注释标签。这可以通过comment-tags选项来设置。
[extractor:babel-mako] comment-tags = TRANSLATOR:
与其他工具的比较
与GNU gettext的比较
更有效地检测Python中使用的格式字符串。
不支持C、C++、Perl等许多其他语言。Lingua专注于在Python项目中常用的语言,尽管可以通过插件添加对其他语言的支持。
与Babel相比的不同之处
更可靠地检测Python格式字符串。
Lingua包含复数支持。
仅支持提取特定翻译域中的文本。这对于在单个应用程序中使用多个翻译域的可扩展软件非常有用。
验证翻译
Lingua包含一个简单的polint工具,该工具对PO文件执行一些基本检查。目前实现的测试有
重复的消息ID(也可以使用GNU gettext的msgfmt进行检查)。这些情况不应该发生,通常是由于消息提取逻辑中的错误造成的。
对多个规范文本使用相同的翻译。这种情况可能由于有效原因而发生,例如原始文本的拼写不一致。
要检查PO文件,只需使用PO文件作为参数运行polint
$ polint nl.po Translation: ${val} ist keine Zeichenkette Used for 2 canonical texts: 1 ${val} is not a string 2 "${val}" is not a string
编写自定义提取器
首先,我们需要创建自定义提取器
from lingua.extractors import Extractor from lingua.extractors import Message class MyExtractor(Extractor): '''One-line description for --list-extractors''' extensions = ['.txt'] def __call__(self, filename, options): return [Message(None, 'msgid', None, [], u'', u'', (filename, 1))]
通过在setup.py中的lingua.extractors入口点连接提取器,将提取器连接到Lingua
setup(name='mypackage', ... install_requires=[ 'lingua', ], ... entry_points=''' [lingua.extractors] my_extractor = mypackage.extractor:MyExtractor ''' ...)
注意 - 注册的提取器必须是派生自Extractor基类的类。
安装mypackage后,Lingua将自动检测新的自定义提取器。
辅助脚本
存在一个名为i18n.sh的辅助shell脚本,用于管理docs/examples中包的翻译。将其复制到您想要进行翻译的工作包根目录,编辑脚本内的配置参数,并使用
./i18n.sh lang
为创建初始目录
./i18n.sh
更新翻译并编译目录。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定该选择哪个,请了解更多关于安装包的信息。
源分发
构建分发
lingua-4.15.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0e1a946741db288a40361ad04ff38fe04bf0819834b8abb84c4b535fed9ba4ef |
|
MD5 | 0bae9e1a51bce8688c7a6d6f345914f8 |
|
BLAKE2b-256 | ba8550f030e20ca64562ac8fd36b65338c4da626739afd49200936f3d99a6047 |
lingua-4.15.0-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8645a8029425bc97b74850f3c7817a7fae58d5f60709f13b3f3f41e5041f8a68 |
|
MD5 | e7e4c611cfe6b78026a95b496b40ae43 |
|
BLAKE2b-256 | 04804c5f9db682ec22a390b0bf0d7a0cd45ffecb60c5aa5bc60deed2c265af58 |