Django国际化和本地化

把django的这篇文档看了一遍,基本弄懂了,讲的也挺详细的 https://docs.djangoproject.com/en/1.6/topics/i18n/html

 

首先是国际化和本地化概念:程序员

 

1,国际化django

这是程序员作的工做,在代码中,模板中,作好相应的准备app

 

1.1代码中函数

使用,  ugettext或者ugettext_lazy工具

from django.utils.translation import ugettext  as _

在代码中对须要进行翻译的字符串,一般是英文,使用这个函数spa

翻译

result.error = _(u'Invalid Captcha')

 

而后这个字符串就会被翻译为咱们须要的语言, 翻译后的结果仍是一个普通的字符串,没什么区别code

只是在这里, _(u'Invalid Captcha') 已经不是原来的字符串了,这个函数返回了一个对象.  Trans()类对象,具体去看django.utils.translation模块源代码吧htm

 

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

相关文章
相关标签/搜索