国际化¶
CubicWeb完全支持其内容和接口的内部化。
CubicWeb的接口国际化基于翻译项目 GNU gettext .
CubicWeb的内部化包括两个步骤:
在python代码和cubicWebtal模板中:标记可翻译字符串
在您的实例中:处理翻译目录,编辑翻译
字符串国际化¶
用户定义字符串¶
在python代码和cubicWebtal模板中,可翻译字符串可以通过以下方式之一进行标记:
通过使用 built-in 功能 _ :
class PrimaryView(EntityView): """the full view of an non final entity""" __regid__ = 'primary' title = _('primary')OR
通过使用等效请求的方法:
class NoResultView(View): """default view when no result has been found""" __regid__ = 'noresult' def call(self, **kwargs): self.w(u'<div class="searchMessage"><strong>%s</strong></div>\n' % self._cw._('No result matching query'))
的目标 built-in 功能 _ 只是 标记可翻译字符串 ,它只返回要转换自身的字符串,而不返回其转换(它实际上是 unicode 内置)。
另一方面,请求的方法 self._cw._ 也用于检索所请求语言中翻译字符串的正确翻译。
最后你也可以使用 __ (两个下划线)用于获取字符串转换的请求对象的属性 它本身不应该添加到目录中 ,通常在通过字符串插值创建实际msgid的情况下:
self._cw.__('This %s' % etype)
在这个例子中 ._cw.__ 使用而不是 ._cw._ 所以我们在邮件目录中没有“this%s”。
CubicWebTal模板中的翻译也可以使用Tal标记完成。 i18n:content 和 i18n:replace .
如果需要将其他邮件标记为可翻译,可以创建一个名为 i18n/static-messages.pot ,请参见示例 专门化应用程序多维数据集的翻译 .
您可以将在python源中找不到的消息放在那里,或者重写依赖项中使用的多维数据集中的一些消息。
生成的字符串¶
在自动生成实体/关系时,我们不需要标记特定实例架构所使用的实体/关系的转换字符串。还生成了各种操作的字符串。
例如,以下模式:
class EntityA(EntityType):
relation_a2b = SubjectRelation('EntityB')
class EntityB(EntityType):
pass
可能会生成以下消息:
add EntityA relation_a2b EntityB subject
此消息将在以下视图中使用 EntityA
为了创造一个新的 EntityB
具有预设关系 relation_a2b
在电流之间 EntityA
和新的 EntityB
.相反的信息:
add EntityA relation_a2b EntityB object
用于类似创建 EntityA
从 EntityB
.他们各自的创作形式的标题是:
creating EntityB (EntityA %(linkto)s relation_a2b EntityB)
creating EntityA (EntityA relation_a2b %(linkto)s EntityA)
在翻译后的字符串中,可以使用 %(linkto)s
供参考来源 entity
.
处理翻译目录¶
一旦在代码中完成国际化,就需要填充和更新翻译目录。CubicWeb为此提供以下命令:
i18ncubicweb 更新CubicWeb框架的翻译目录。除非您实际上是在框架本身上工作,否则不需要使用此命令。
i18ncube 更新的翻译目录 一个特定的立方体 (或所有立方块)。执行此命令后,必须更新翻译文件 .po 在多维数据集的“i18n”目录中。此命令当然不会删除仍在使用中的现有翻译。它将标记未使用的翻译,但不会删除它们。
i18ninstance 重新编译的翻译目录 一个特定实例 (或所有实例)在更新其多维数据集的翻译目录之后。每次创建或更新实例时都会自动调用此命令。已编译的目录( .mo )存储在实例的i18n/<lang>/lc_消息中,其中 lang 是语言标识符(例如“en”或“fr”)。
例子¶
您已经在多维数据集中添加和/或修改了一些翻译字符串(例如,在创建新视图或修改多维数据集的模式之后)。要更新翻译目录,需要执行以下操作:
cubicweb-ctl i18ncube <cube>
编辑 <cube>/i18n/xxx.po 文件并添加缺少的翻译(带有空的 msgstr )
hg ci -m "updated i18n catalogs"
cubicweb-ctl i18ninstance <myinstance>
自定义消息提取过程¶
由执行的消息提取 i18ncommand
从几个不同的来源收集消息:
模式和应用程序定义(实体名、docstrings、帮助消息、uicfg)
源文件:
i18n:content
或i18n:replace
来自TAL文件的指令(带有.pt
扩展)带下划线前缀的字符串 (
_
)在python文件中,在javascript文件中,带双引号、前缀为下划线的字符串。
源文件是通过遍历多维数据集目录来收集的,但忽略一些目录,如 .hg
, .tox
, test
或 node_modules
.
如果需要在多维数据集中自定义此行为,则必须扩展 cubicweb.devtools.devctl.I18nCubeMessageExtractor
.下面的示例将从 jinja2
文件并忽略 static
邮件收集阶段的目录:
# mymodule.py
from cubicweb.devtools import devctl
class MyMessageExtractor(devctl.I18nCubeMessageExtractor):
blacklist = devctl.I18nCubeMessageExtractor | {'static'}
formats = devctl.I18nCubeMessageExtractor.formats + ['jinja2']
def collect_jinja2(self):
return self.find('.jinja2')
def extract_jinja2(self, files):
return self._xgettext(files, output='jinja.pot',
extraopts='-L python --from-code=utf-8')
那么,你必须在 cubicweb.i18ncube
多维数据集设置中的入口点。py::
setup(
# ...
entry_points={
# ...
'cubicweb.i18ncube': [
'mycube=cubicweb_mycube.mymodule:MyMessageExtractor',
],
},
# ...
)
编辑采购订单文件¶
使用可识别订单的编辑器¶
有许多工具可以帮助维护.po(po)文件。公共编辑器或开发环境为这些提供了模式。您还可以找到专用的采购订单文件编辑器,例如 poedit .
虽然使用这种工具是值得称赞的,但是使用(支持Unicode的)纯文本编辑器可以完全编辑po文件。了解它们的结构对于排除故障也很有用。
采购订单文件的结构¶
在本节中,我们选择性地引用 GNU gettext 关于采购订单文件的手册章节,可从以下网址获得:
http://www.gnu.org/software/hello/manual/gettext/PO-Files.html
一个订单文件条目具有以下原理图结构:
white-space
# translator-comments
#. extracted-comments
#: reference...
#, flag...
#| msgid previous-untranslated-string
msgid untranslated-string
msgstr translated-string
一个简单的条目可以如下所示:
#: lib/error.c:116
msgid "Unknown system error"
msgstr "Error desconegut del sistema"
也可以有带有上下文说明符的条目。它们看起来像这样:
white-space
# translator-comments
#. extracted-comments
#: reference...
#, flag...
#| msgctxt previous-context
#| msgid previous-untranslated-string
msgctxt context
msgid untranslated-string
msgstr translated-string
上下文用于消除具有相同未翻译字符串的消息的歧义。在一个po文件中,可以有多个具有相同未翻译字符串的条目,前提是它们各自具有不同的上下文。请注意,空上下文字符串和不存在的msgctxt行并不意味着相同的事情。
上下文和CubicWeb¶
CubicWeb PO文件既有非上下文的msgid,也有上下文的msgid。
在某些情况下,会自动使用上下文条目。例如,entity.dc_type()、eschema.display_name(req)或display_name(etype、req、form、context)方法/函数调用将使用它们。
也可以显式使用上下文 _cw.pgettext(context, msgid) .
专门化应用程序多维数据集的翻译¶
每个多维数据集都有自己的翻译文件。对于特定的应用程序多维数据集,专用化其他多维数据集的翻译可能很有用。您可以使用 _ 在python代码中,或添加 static-messages.pot 文件到 i18n 目录。此文件看起来像:::
msgid ""
msgstr ""
"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
msgig "expression to be translated"
msgstr ""
这样做, expression to be translated
将由 i18ncube
命令和其他消息将出现在 .po 多维数据集的文件。