Django分析之國際化處理


       最近在公司終於開始做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多語言處理的地方都介紹過了,這樣就成功的實現了多語言的處理了~~~

 


免責聲明!

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



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