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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM