django i18n 笔记

最近因为项目的关系,需要汉化一个基于django的web应用。开发人员在初期没有考虑过i18n的问题,也没有这方面的经验,所以整个过程耗时接近一个星期。这篇文章是在懊恼和无奈心情下,记录一下这些踩过的坑。

声明:本文不包含任何对原理的解释。如果参照本文的步骤遇到了问题,可参考django的官方i18n文档,在理解后针对自己的应用进行修正。任何问题,也都欢迎在评论区交流指正。

特别鸣谢远在美国的Ralph同学的帮助

这次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:
  7. 重启uwsgi和web server,测试。

你可能感兴趣的:(django i18n 笔记)