把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