最近因为项目的关系,需要汉化一个基于django的web应用。开发人员在初期没有考虑过i18n的问题,也没有这方面的经验,所以整个过程耗时接近一个星期。这篇文章是在懊恼和无奈心情下,记录一下这些踩过的坑。
声明:本文不包含任何对原理的解释。如果参照本文的步骤遇到了问题,可参考django的官方i18n文档,在理解后针对自己的应用进行修正。任何问题,也都欢迎在评论区交流指正。
特别鸣谢远在美国的Ralph同学的帮助
这次i18n的工作分为两部分。
第一部分是针对django的模板中的字符串。这部分的官方文档是比较细致的。基本的步骤如下:
- 在模板的前面加上
{%load i18n%}
,然后在模板中给需要翻译的字符串套上标签{%trans 'xxxx' %}
。 - 创建翻译文件。命令是
python django-admin.py makemessages ‐l [locale name]
。命令执行后会在locale文件夹下生成对应locale的django.po文件。- 这里有一个坑,就是locale name和language code的区别。在这个命令里需要的是locale name,而在下文提到的settings.py的配置里,则需要使用language code。对于很多语言,这个区别是不存在的,比如德语的locale name和language code都是de。但是根据官方文档,这是两个不同的概念,比如说简体中文在django中的locale name是zh_Hans,language code是zh-hans。命令
- 在生成的.po文件中加入对应locale的翻译字符串。
- 编译翻译文件。命令是
python django-admin.py compilemessages
。如果成功的话会生成对应的. mo文件 - 在settings.py文件中对本地化进行配置:
- 在
MIDDLEWARE_CLASSES
部分中加入中间件django.middleware.locale.LocaleMiddleware
- 在
TEMPLATE
的processor部分加入django.template.context_processors.i18n
- 在语言部分加入,如(注意!这里用到的是language code,是有短横的纯小写字符串)
LANGUAGES = ( ('zh-hans', _('Simplified Chinese')), ('en', _('English')), )
- 在
- 重启uwsgi和web server。发送
accept-language
为指定语言的GET
请求,查看设置是否成功。
第二部分,是对JavaScript中的字符串的翻译。基本的步骤如下:
- 在JavaScript脚本中给需要翻译的字符串套上函数
gettext('xxxx')
。gettext
函数为稍后会配置的django内建的JavaScript Catalog定义的全局函数。 - 创建翻译文件。命令是
django-admin makemessages -d djangojs ‐l [locale name]
。命令执行后会在locale文件夹下生成对应locale的djangojs.po文件。(在执行命令视需要执行build的脚本,比如本项目中在此处需要先运行webpack
) - 在生成的.po文件中加入对应locale的翻译字符串。
- 编译翻译文件。命令同上。
- 在模块的urls.py文件中加入
其中的app是settings.py中定义的from django.views.i18n import JavaScriptCatalog urlpatterns += [ url(r'^jsi18n/$', JavaScriptCatalog.as_view(packages=['app']), name='javascript-catalog'), ]
INSTALLED_APP
里当前web应用的名称 - 在模板中加入脚本tag:
<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>
- 重启uwsgi和web server,测试。
网友评论