django框架带有完善的I18N和L10N支持,其实现是基于GNU gettext的。最近看着文档研究了一下,在这里概要总结一下django国际化的处理流程。
经典用法是把ugettext_lazy导为_使用,该函数标记要翻译的符号,并在要输出该符号的时候进行翻译,返回
unicode对象:
例:
from django.utils.translation import ugettext_lazy as _
spam=_('User')
需要输出spam的地方,"User"这个单词会以本地化语言显示。
在对应app目录创建locale目录,并按此格式
/LC_MESSAGES/创建好欲支持的语言目录,转到app目录下执行django-admin.py makemessages --all
--settings=path.to.settings 命令, 把所有标记的翻译符号导出为po文件,vi打开各个
/LC_MESSAGES/django.po文件,把符号翻译为对应的本地言语,再执行django-admin.py compilemessages
--settings=path.to.settings 把po文件编译为mo文件,
这两个命令一定要在locale的当前目录执行。
要启用国际化支持需设置settings文件以下几项:
USE_I18N = True
USE_L10N = True
MIDDLEWARE_CLASSES增加'django.middleware.locale.LocaleMiddleware',该中间要出现在SessionMiddleware和CacheMiddleware后,其他所有中件间之前
TEMPLATE_CONTEXT_PROCESSORS 增加 'django.core.context_processors.i18n'
django按照如下顺序决定使用哪种语言:
- 在用户session里查找django_language key
- 如果不存在session,查找django_language cookie
- 查找http头 Accept-Language
- 以后都未设置,使用settings.LANGUAGE_CODE
决定了使用哪种语言后,按如下找顺序查找mo文件:
- settings LOCALE_PATHS变量指定的路径
- 每个app目录下的locale目录
- 工程目录下的locale目录
- 最后是django/conf/locale目录
当有重复的mo文件时,mo优先级同查找顺序一致,即先找到的会屏蔽其后边的mo项
阅读(3816) | 评论(0) | 转发(0) |