django i18n 笔记

作者: hy9be | 来源:发表于2017-09-15 12:05 被阅读940次

    最近因为项目的关系,需要汉化一个基于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:<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>
    7. 重启uwsgi和web server,测试。

    相关文章

      网友评论

        本文标题:django i18n 笔记

        本文链接:https://www.haomeiwen.com/subject/sghjsxtx.html