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文件。现在你可以启动你的应用程序并查看翻译的标题。