Chameleon 国际化

备注

创建此配方是为了记录 Chameleon 模板的国际化(i18n)和本地化(l10n)过程。事实上,这本书没有太多内容,但由于作者对这一事实感到困惑,所以最好描述几个必要的步骤。

我们从一个virtualenv和一个通过paster创建的新Pyramid项目开始:

1$ virtualenv --no-site-packages env
2$ env/bin/pip install pyramid
3$ env bin/paster create -t pyramid_routesalchemy ChameleonI18n

依赖关系

首先,将依赖项添加到 Pyramid 项目的 setup.py ::

 1requires = [
 2    ...
 3    'Babel',
 4    'lingua',
 5    ]
 6...
 7message_extractors = { '.': [
 8    ('**.py',   'lingua_python', None ),
 9    ('**.pt',   'lingua_xml', None ),
10    ]},

你得跑了 ../env/bin/python setup.py develop 之后,让Babel和Lingua进入您的virtualenv,并使消息提取工作正常。

区域设置的文件夹

接下来,为locales pot&po文件添加一个文件夹:

1$ mkdir chameleoni18n/locale

翻译什么

好吧,让我们翻译一下给定模板的某些部分 mytemplate.pt . Add a namespace and an i18n:domain to the <html> tag:

-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal"
+      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+      i18n:domain="ChameleonI18n">

重要的一点——作者缺少的一点——是i18n:domain的拼写必须与稍后创建的pot/po/mo文件完全相同,包括case。如果没有这一点,翻译就不会被提取。

如果模板组织在模板层次结构中,则必须在包含要提取的消息的每个文件中包含i18n:domain:

-<tal:block>
+<tal:block i18n:domain="ChameleonI18n">

现在我们可以标记模板的一部分进行翻译:

-          <h2>Search documentation</h2>
+          <h2 i18n:translate="search_documentation">Search documentation</h2>

i18n:translate属性告诉lingua将h2标记的内容提取到目录壶中。您不必添加描述(如本例中的“搜索文档”),但它使翻译人员更容易理解。

翻译命令

现在,您需要在项目目录中运行以下命令:

1(env)$ python setup.py extract_messages
2(env)$ python setup.py init_catalog -l de
3(env)$ python setup.py init_catalog -l fr
4(env)$ python setup.py init_catalog -l es
5(env)$ python setup.py init_catalog -l it
6(env)$ python setup.py update_catalog
7(env)$ python setup.py compile_catalog

重复 init_catalog 为您需要的每种语言单步执行。

第一个命令将提取字符串,以便转换为项目的locale/<project name>.pot文件,在本例中是chameloni18n.pot。

这个 init 命令为不同的语言和 update 命令将把条目从主pot同步到语言pos。

此时,您可以告诉翻译人员去编辑采购订单文件:-),否则翻译将保持为空,并使用默认值。

最后, compile 命令将把pos转换成二进制mo文件,这些文件实际上用于获取相关的转换。

备注

项目的GETEXT子目录是 locale/ 在 Pyramid 里,而不是 i18n/ 就像在 Pylons 上一样。您将注意到,在 Pyramid 项目的默认setup.cfg中,它具有使上述命令不带参数工作所需的所有设置。

Add locale directory to projects config

此时,您还需要将本地目录添加到项目的配置中:

def main(...):
   ...
   config.add_translation_dirs('YOURPROJECT:locale')

在我们的示例中,您的项目将是“ Chameleon 18N”。

Set a default locale

现在可以在中更改项目的默认区域设置。 development.ini 看看是否有人找到翻译。

1-  pyramid.default_locale_name = en
2+  pyramid.default_locale_name = de

当然,在本例中,您需要编辑相关的采购订单文件并添加相关字符串的翻译。 search_documentation 并将订单文件编译成一个mo文件。现在你可以启动你的应用程序并查看翻译的标题。