国际化

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:contenti18n: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

用于类似创建 EntityAEntityB .他们各自的创作形式的标题是:

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”)。

例子

您已经在多维数据集中添加和/或修改了一些翻译字符串(例如,在创建新视图或修改多维数据集的模式之后)。要更新翻译目录,需要执行以下操作:

  1. cubicweb-ctl i18ncube <cube>

  2. 编辑 <cube>/i18n/xxx.po 文件并添加缺少的翻译(带有空的 msgstr

  3. hg ci -m "updated i18n catalogs"

  4. cubicweb-ctl i18ninstance <myinstance>

自定义消息提取过程

由执行的消息提取 i18ncommand 从几个不同的来源收集消息:

  • 模式和应用程序定义(实体名、docstrings、帮助消息、uicfg)

  • 源文件:

    • i18n:contenti18n:replace 来自TAL文件的指令(带有 .pt 扩展)

    • 带下划线前缀的字符串 (_ )在python文件中,

    • 在javascript文件中,带双引号、前缀为下划线的字符串。

源文件是通过遍历多维数据集目录来收集的,但忽略一些目录,如 .hg.toxtestnode_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 多维数据集的文件。