目录
基本定义
国际化
指为任何区域设置提供支持的程序设计过程。这个过程通常由软件开发者处理。国际化包括标记可翻译的文本(例如 UI 元素和错误消息);抽象日期和时间的显示方式,兼顾不同的区域标准;支持不同的时区;以及在代码中不对用户的区域位置做任何假设。国际化经常缩写为 I18N。(数字 18 表示省略了开头的 I 和末尾的 N 之间的 18 个字母。)
本地化
指把国际化的程序翻译成特定区域的语言。这个过程通常由翻译人员处理。本地化有时缩写为 L10N。
区域设置名称
ll 形式的语言规范码,或者 ll_CC 形式的语言和国家规范码。例如: it 、 de_AT 、 es 、 pt_BR 。语言部分始终小写,国家部分始终大写。中间以一个下划线分开。
语言代码
表示语言的名称。浏览器在 Accept-Language 首部中使用这种格式指定接受的语言。例如: it 、 de-at 、es 、 pt-br 。语言代码一般使用小写字母表示,但是 Accept-Language 首部不区分大小写。分隔符是一个连字符。
消息文件
表示一种语言的纯文本文件,包含所有可翻译的字符串,以及目标语言的表述。消息文件的扩展名是.po 。
翻译字符串
可以翻译的文本串。
格式文件
定义目标区域设置所用数据格式的 Python 模块。
国际化模板代码
Django 模板使用两个模板标签翻译,而且与在 Python 代码中的句法稍有不同。若想在模板中访问那两个标签,在模板顶部写上 {% load i18n %} 。与其他模板标签一样,每个需要翻译的模板都要有这么一个 load 标签,即便是扩展自已经加载了 i18n 标签的模板也是如此。
trans 模板标签
{% trans %} 模板标签既能用于翻译不变的字符串(放在单引号或双引号中),也能用于翻译变量的内容:
<title>{% trans "This is the title." %}</title>
<title>{% trans myvar %}</title>
如果指定 noop 选项,会查找变量,但不翻译。这么做只是为了占位,而把翻译留到未来某个时刻:
<title>{% trans "myvar" noop %}</title>
行间翻译在背后调用 ugettext() 函数。
如果传给 trans 标签的是一个模板变量,在运行时首先把变量解析成字符串,然后在消息目录中查找那个字符串。
在 {% trans %} 标签中,不能内插模板变量。如果需要变量中的字符串(占位符),使用 {% blocktrans%} 。如果想获取翻译后的字符串,但不将其显示出来,使用下述句法:
{% trans "This is the title" as the_title %}
在实际运用中,如果需要在多个地方使用翻译后的字符串,或者作为参数传给别的模板标签或过滤器,就可以这么做:
{% trans "starting point" as start %}
{% trans "end point" as end %}
{% trans "La Grande Boucle" as race %}
<h1>
<a href="/" title="{% blocktrans %}Back to '{{ race }}' homepage{% endblocktrans %}">{{ race
}}</a>
</h1>
<p>
{% for stage in tour_stages %}
{% cycle start end %}: {{ stage }}{% if forloop.counter|divisibleby:2 %}<br />{% else %},
{% endif %}
{% endfor %}
</p>
其他标签
这些标签也需要 {% load i18n %} 。
• {% get_available_languages as LANGUAGES %} 返回一个元组列表,元组的第一个元素是语言代码,第二个元素是语言名称(翻译成当前启用的语言)。
• {% get_current_language as LANGUAGE_CODE %} 返回一个字符串,表示当前用户选择的语言。例如:en-us 。(参见 18.10.2 节。)
• {% get_current_language_bidi as LANGUAGE_BIDI %} 返回当前区域设置的书写方向。为 True 时,表示由右向左书写的语言,如希伯来语和阿拉伯语;为 False 时,表示由左向右书写的语言,如英语、法语、德语,等等。
实现方式说明
Django 的翻译机制采用 Python 标准库中的 gettext 模块。如果你了解 gettext ,将会发现 Django 处理翻译的方式有些特别之处:
• 字符串域是 django 或 djangojs 。域用于区分不同程序在同一个位置(通常是 /usr/share/locale/ )存储的消息文件。 django 域针对 Python 和模板代码的翻译字符串,加载到全局翻译目录中。 djangojs 域只针对 JavaScript 翻译目录,目的是让 JavaScript 翻译目录尽量保持小体积。
• Django 不单独使用 xgettext ,而是使用 Python 对 xgettext 和 msgfmt 的包装程序。这样做基本上是为了操作方便。