django国国际化和本地化

国际化的本质是开发者对要进行翻译的字符串进行标记,由翻译者进行翻译,当用户访问该 Web 时,Django 内部框架根据用户使用偏好进行 Web 呈现。设置USE_I18N=True开启django的国际化。

本地化是指使一个国际化的程序为了在某个特定地区使用而进行实际翻译的过程。 有时,本地化缩写为 L10N.

国际化需要三个步骤:

  • 在 Python 代码和模板中嵌入待翻译的字符串
  • 把那些字符串翻译成需要支持的语言,并进行相应的编译
  • 在 Django settings 文件中激活本地中间件

在模板中指定带翻译的字符串

1
<title>{\% trans "This is the title." \%}</title> ### markdown语法转义不了% 故在此多加了斜杠

创建语言文件:

创建的语言翻译文件都会放在conf/locale/下面,文件夹会按照语言分类保存
django-admin.py makemessages -l zh-CN #创建文中的翻译文件
django-admin.py makemessages -a #创建所有的翻译文件
上述命令完成之后,在对应的目录下面会产生.po 文件,形式如下

1
2
msgid "examplestring"
msgstr ""

编译运行

1
django-admin.py compilemessages

会编译生成.mo二进制文件,python的标准库gettext可以读取并进行翻译。以上工作准备完毕之后,国际化的翻译文件才算准备好了,在配置文件中指定 LANGUAGE_CODE,Django将使用这个语言作为翻译语言。
如果想让用户各自指定语言偏好,就需要使用LocaleMiddleware,在中间件中添加
django.middleware.locale.LocaleMiddleware,
注意中间件的顺序LocaleMiddleware会按照下面的算法确定用户的语言:

  • 首先,在当前用户的session中查找django_language键
  • 如未找到,他会找寻一个cookie,
  • 还找不到的话,他会在HTTP请求头部里查找Accept-Language,该头部是你的浏览器发送的,并且按优先顺序告诉服务器你的语言偏好。 Django会尝试头部中的每一个语种直到它发现一个可用的翻译。
  • 以上都失败了的话,就使用全局的LANGUAGE_CODE设定值、

总结,对于静态翻译(无中间件)而言,语言在settings.LANGUAGE_CODE中,而对于动态翻译(中间件),它在request.LANGUAGE_CODE中。

edx国际化和本地化

edx平台对django的国际化命令进行了封装,源码在下面的工具中

i18n-tools==0.1 https://github.com/edx/i18n-tools/tree/v0.1.0

默认在conf/locale/下面都已经有了编译好的mo文件,就不用再执行编译命令了,直接改配置文件就可以实现汉化
edx默认都是添加了django.middleware.locale.LocaleMiddleware
平台的语言会先从session中找django_language,但是从一个未登录状态session和cookie都是没有的,所以会默认使用配置文件中的language_code
从lms登录之后再登录到insights的时候会按照本地化的中间设定平台的语言,所以在insights中删除掉该中间件可以保证语言的一致性,
修改配置文件lms.env.json和cms.env.json文件的language_code即可