最近在公司終於開始做web開發了,本以為會是簡單的首頁之類的小規模項目,結果上來就是一個處理大數據分析的項目,一個關於油品分析的系統,不過我接到的第一個任務是做這個網站的國際化處理,雖然項目還沒有上線,還差的很多,但是國際化這個東西使用的是Django自帶的來處理的,所以在一邊寫項目的時候就要寫好國際化的代碼,所以我現在就開始處理我的國際化了.
大家可以在Django Doctment上看官方的說明,我在這里就不復制官方文檔了,django框架帶有完善的I18N和L10N支持,其實現是基於GNU gettext的。最近看着文檔研究了一下,在這里概要總結一下django國際化的處理流程。
經典用法是把ugettext_lazy導為_使用,該函數標記要翻譯的符號,並在要輸出該符號的時候進行翻譯,返回unicode對象:
1 from django.utils.translation import ugettext as _ 2 from django.utils.translation import ugettext_lazy 3 4 label=ugettext_lazy(u"日期") 5 ...... 6 opt = {"data": [], "name": _(u'銷售額({first},{last})')
需要輸出label和opt的地方就會自動轉成對應的國際化語言了,現在是在代碼里面改好了,那么接下來該怎么使用呢?
緊接着在對應app目錄創建locale目錄,並按此格式<language>/LC_MESSAGES/創建好欲支持的語言目錄,轉到app目錄下執行django-admin.py makemessages --all 命令, 把所有標記的翻譯符號導出為po文件,打開各個<language>/LC_MESSAGES/django.po文件,把符號翻譯為對應的本地言語,再執行django-admin.py compilemessages把po文件編譯為mo文件,這兩個命令一定要在locale的當前目錄執行。
那么接下來,就要在settings文件中配置關於國際化的設置了,我們需要在settings文件中這樣配置:
1 USE_I18N = True 2 3 USE_L10N = True 4 5 LANGUAGE_CODE = 'zh-cn' 6 7 TIME_ZONE = 'Asia/Shanghai' 8 9 LANGUAGES = ( 10 ('en', ugettext_lazy(u"英文")), 11 ('zh-cn',ugettext_lazy(u"中文")), 12 ) 13 14 #是否自動判斷Accept-Language頭轉換語言 15 LOCALEURL_USE_ACCEPT_LANGUAGE=False 16 17 #是否顯示語言前綴 18 PREFIX_DEFAULT_LOCALE = True 19 20 #是否在session中保存用戶指定的語言 21 LOCALEURL_USE_SESSION=True 22 23 MIDDLEWARE_CLASSES = ( 24 'django.middleware.gzip.GZipMiddleware', 25 'django.middleware.common.CommonMiddleware', 26 'django.contrib.sessions.middleware.SessionMiddleware', 27 'django.middleware.locale.LocaleMiddleware', 28 'django.middleware.csrf.CsrfViewMiddleware', 29 'django.contrib.auth.middleware.AuthenticationMiddleware', 30 'django.contrib.messages.middleware.MessageMiddleware', 31 ) 32 33 TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages")
注意:MIDDLEWARE_CLASSES中要增加'django.middleware.locale.LocaleMiddleware',該中間見要出現在SessionMiddleware和CacheMiddleware后,其他所有中間件之前,而TEMPLATE_CONTEXT_PROCESSORS 中要增加 'django.core.context_processors.i18n'.
當你做完以上這些操作你就可以讓你的項目成功的顯示多語言了,那接下來呢?你會發現實際上項目中還會有一些是無法翻譯過來的,那是為什么呢?因為他們都是通過外部的js來渲染進模板中的,這樣的話你再使用上面提到的方法就不行了,那么該怎么辦呢?下面我就來介紹如何在外部js中做多語言的翻譯.
首先,我們要在urls.py文件中這樣配置:
url(r'^jsi18n/(?P<packages>\S+?)/$', 'django.views.i18n.javascript_catalog'),
然后在需要國際化的模板頁中引入:
<script type="text/javascript" src="/jsi18n/userauth"></script>
那么,在這個頁面中可以用javascript調用gettext方法實現國際化。/userauth是locale文件所在的路徑(可以是app路徑,此app應該在settings.py的INSTALL_APP中配置好)。接着,在userauth的locale路徑下,如/zh_CN路徑下新建djangojs.po文件,將msgid和msgstr的對應關系寫入。再利用django-admin.py compilemessages即可以在javascript中利用gettext('bug.manage')獲得它對應的國際化值。
對於Djangojs.py文件的建立我們采用這樣的命令:
django-admin.py makemessage -d djangojs -l en
這樣,就會在之前我們生成django.py文件的目錄里產生一個djangojs.py文件了,這樣就可以直接進行翻譯了.而對於js文件中的字符串我們采用什么樣的方式呢?
var name = String.format("xxxxxx{0}",gettext('xxx'))
到此為止就基本不會再出現什么問題了,那么Django是按照什么樣的順序來確定應該是使用什么樣的語言呢?
1,在用戶session里查找django_language key
2,如果不存在session,查找django_language cookie
3,查找http頭 Accept-Language
4,以后都未設置,使用settings.LANGUAGE_CODE
決定了使用哪種語言后,按如下找順序查找mo文件:
1,settings LOCALE_PATHS變量指定的路徑
2,每個app目錄下的locale目錄
3,工程目錄下的locale目錄
4,最后是django/conf/locale目錄
當有重復的mo文件時,mo優先級同查找順序一致,即先找到的會屏蔽其后邊的mo項
OK!!基本上關於Django多語言處理的地方都介紹過了,這樣就成功的實現了多語言的處理了~~~