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

相關文章
相關標籤/搜索