翻译工具集
项目描述
什么是语言?
Lingua 是一个包含从代码中提取可翻译文本和检查现有翻译的工具的包。它取代了 gettext 中的xgettext命令或Babel 中的pybabel的使用。
消息提取
提取所有可翻译消息的最简单方法是将pot-create工具指向 源代码树的根目录。
$ 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 样式格式。
可以在配置文件中设置两种类型的配置:用于文件扩展名的提取器,以及单个提取器的配置。
文件扩展名在扩展部分配置。本节中的每个条目都将文件扩展名映射到提取器名称。例如,要告诉 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 将在过滤域时使用此信息。
包括评论
您可以在消息中添加注释以帮助翻译人员,例如解释文本的使用方式,或提供有关如何翻译文本的提示。对于变色龙模板,这可以使用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 格式检测字符串方面做得很合理,但有时您可能需要自己设置标志。这可以通过注释中的[flag, flag]标记来完成。
# I18N [markdown,c-format] header = _(u'# Hello *%s*')
指定关键字
在查找消息时,语言解析器使用默认的关键字列表来识别翻译调用。您可以通过--keyword 选项添加额外的关键字。如果你有自己的mygettext函数,它接受一个字符串作为它的第一个参数,你可以使用这个:
$ pot-create --keyword=mygettext
如果您的函数需要更多参数,您需要将它们告诉 lingua。这可以通过多种方式完成:
如果可翻译文本不是第一个参数,您可以使用<keyword>:<parameter number>指定参数编号。例如,如果您使用i18n_log(level, msg)关键字说明符将是i18n_log:2
如果您支持复数,您可以通过指定单数和复数文本的参数编号来指定用于复数消息的参数。例如,如果您的函数签名是show_result(single,复数)关键字说明符是show_result:1,2
如果您使用消息上下文,您可以通过将c添加到参数编号来指定用于上下文的参数。例如 pgettext 的关键字说明 符是pgettext:1c,2。
如果您的函数将域作为参数,您可以通过在参数编号中添加d来指定用于域的参数。例如 dgettext 的关键字说明符是dgettext:1d,2。这是一个语言指定的扩展。
您可以使用t后缀指定函数调用必须具有的参数的确切数量。例如,如果一个函数必须有四个参数才能成为有效调用,则说明符可以是myfunc:1,4t。
提取器
Lingua 包括许多提取器:
python:处理 Python 源代码。
chameleon:处理Chameleon文件,使用Zope i18n 语法
zcml:处理 Zope 配置标记语言 (ZCML) 文件。
- zope : 变色龙提取器的变体,假定为默认值
表达语言是TALES 而不是 Python。
xml :变色龙提取器的旧名称。此名称不应再使用,仅支持向后兼容。
巴别塔提取器
有几个带有Babel消息提取工具插件的包。Lingua 也可以使用这些插件。插件名称将以babel-为前缀,以区别于语言提取器。
例如,如果您安装了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 包含一个简单的polit工具,它对 PO 文件执行一些基本检查。目前实施的测试有:
重复的消息 ID(也可以使用 GNU gettext 的msgfmt检查)。这些不应该发生,通常是消息提取逻辑中的错误的结果。
用于多个规范文本的相同翻译。这可能是出于正当的原因,例如当原始文本拼写不一致时。
要检查 po 文件,只需使用 po 文件作为参数运行polit :
$ 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))]
将提取器连接到 lingua 由setup.py中的lingua.extractors入口点完成:
setup(name='mypackage',
...
install_requires=[
'lingua',
],
...
entry_points='''
[lingua.extractors]
my_extractor = mypackage.extractor:MyExtractor
'''
...)
注意 - 注册的提取器必须是从提取器 基类派生的类。
安装mypackage之后,lingua 会自动检测新的自定义提取器。
辅助脚本
在名为i18n.sh的文档/示例中存在一个帮助程序 shell 脚本,用于管理包的翻译 。将其复制到要进行翻译的包根目录,编辑脚本内的配置参数并使用:
./i18n.sh lang
用于初始目录创建和:
./i18n.sh
用于更新翻译和编译目录。