Django--i18n国际化
i18n的工作分为两部分。
第一部分,是针对django的模板中的字符串。这部分的官方文档是比较细致的。基本的步骤如下:
1、在模板的前面加上{%load i18n%}
,然后在模板中给需要翻译的字符串套上标签{%trans 'xxxx' %}
。
2、创建翻译文件。命令是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。命令
3、在生成的.po文件中加入对应locale的翻译字符串。
4、编译翻译文件。命令是python django-admin.py compilemessages。如果成功的话会生成对应的. mo文件
5、在settings.py文件中对本地化进行配置:
1.在MIDDLEWARE_CLASSES部分中加入中间件django.middleware.locale.LocaleMiddleware
2.在TEMPLATE的processor部分加入django.template.context_processors.i18n
3.在语言部分加入,如(注意!这里用到的是language code,是有短横的纯小写字符串)
LANGUAGES = (
('zh-hans', _('Simplified Chinese')),
('en', _('English')),
)
6、重启uwsgi和web server。发送accept-language为指定语言的GET请求,查看设置是否成功。
第二部分,是对JavaScript中的字符串的翻译。基本的步骤如下:
1、在JavaScript脚本中给需要翻译的字符串套上函数gettext('xxxx')
。gettext函数为稍后会配置的django内建的JavaScript Catalog定义的全局函数。
2、创建翻译文件。命令是django-admin makemessages -d djangojs ‐l [locale name]
。命令执行后会在locale文件夹下生成对应locale的djangojs.po文件。(在执行命令视需要执行build的脚本,比如本项目中在此处需要先运行webpack)
3、在生成的.po文件中加入对应locale的翻译字符串。
4、编译翻译文件。命令同上。
5、在模块的urls.py文件中加入
from django.views.i18n import JavaScriptCatalog
urlpatterns += [
url(r'^jsi18n/$', JavaScriptCatalog.as_view(packages=['app']), name='javascript-catalog'),
]
其中的app是settings.py中定义的INSTALLED_APP
里当前web应用的名称
6、在模板中加入脚本tag:<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>
7、重启uwsgi和web server,测试。