把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