Django国际化和本地化
把django的这篇文档看了一遍,基本弄懂了,讲的也挺详细的 https://docs.djangoproject.com/en/1.6/topics/i18n/
首先是国际化和本地化概念:
1,国际化
这是程序员做的工作,在代码中,模板中,做好相应的准备
1.1代码中
使用, ugettext或者ugettext_lazy
from django.utils.translation import ugettext as _
在代码中对需要进行翻译的字符串,通常是英文,使用这个函数
如
result.error = _(u'Invalid Captcha')
然后这个字符串就会被翻译为我们需要的语言, 翻译后的结果还是一个普通的字符串,没什么区别
只是在这里, _(u'Invalid Captcha') 已经不是原来的字符串了,这个函数返回了一个对象. Trans()类对象,具体去看django.utils.translation模块源代码吧
1.2模板中
要注意,代码中翻译的字符串,可能是用来填充模板的,也可能是比如Ajax接口的返回结果.
如果我们要直接翻译模板中的字符串,那么使用django template的这两个tags : trans 和 blocktrans
比如
<title>{% trans 'This is the title' %}</title>
那blocktrans用于, 混合了字符串和变量的翻译.
[注意]在模板中使用了 trans 或 blocktrans时
要在开头加
{% load i18n %}
不然会报错
2, 本地化
本地化是翻译做的工作,把原语言的目标翻译写出来
那首先我们要使用一个工具,在app的根目录或整个工程的根目录,运行
django-admin.py makemessages -l zh_CN
会生成如下的一个文件目录
locale/
├── zh_CN
│ └── LC_MESSAGES
│ ├── django.mo
│ └── django.po
zh_CN指简体中文, 每种语言都有自己的目录,在django中,每个语言都有自己的LANGUAGE_CODE
这时候打开django.po, 内容格式如下
#: views.py:169 msgid "Invalid CAPTCHA" msgstr "" #: templates/login.html: 15 msgid "This is the title" msgstr ""
把msgstr填上我们的翻译
然后运行另一个命令
django-admin.py compilemessages
就生成了编译好的django.mo,是个二进制文件,然后就OK了,最终出现的页面就是我们要的中文了
如果我们在代码或模板中增加或删除了相关的国际化代码,需要从新运行
makemessages 和 compilemessages
如果只是改了django.po中的翻译,当然只需 compile 就行了.
重启服务
完成以上之后,需要重启一下django服务
和国际化有关的setting
1,USE_I18N = True/False
有关的代码是这样的,在django.utils.translation的__init__.py中
1 class Trans(object); 2 def __getattr__(self, real_name): 3 from django.conf import settings 4 if settings.USE_I18N: 5 from django.utils.translation import trans_real as trans 6 else: 7 from django.utils.translation import trans_null as trans 8 setattr(self, real_name, getattr(trans, real_name)) 9 return getattr(trans, real_name)
而trans_null其实就没做什么事
2,LANGUAGE_CODE
比如中文是
LANGUAGE_CODE = 'zh_cn'
.po 文件中的 fuzzy str translation
有时候, 用makemessages生成的.po文件中有些msgid会被标记为 fuzzy
比如
#: models.py:35 #, fuzzy msgid "hdapp_leader" msgstr "领队"
这是因为对于 "hdapp_leader", msgmerge工具认为这个和之前的一个msgid很相似,这个翻译可能不靠谱,于是标记fuzzy; msgfmt就会把这个msgid给略过,也就是这个翻译不会生效,当然如果我们确认是对的, 就手动删掉那行fuzzy,重新compilemessages就好.
------------
下一篇
探讨ugettext和ugettext_lazy的区别
blocktrans