Django如何支持網(wǎng)站多語言切換?

分為models, views和模版(templates)三處的英文轉(zhuǎn)化。


首先修改settings

1.中間件中增加一個(gè)django.middleware.locale.LocaleMiddleware的中間件,并且它的順序要靠前,筆者的是放第二個(gè)。

settings中間件配置截圖

2.增加LANGUAGES和LOCALE_PATHS,并且手動(dòng)在項(xiàng)目根目錄下創(chuàng)建locale文件夾


增加LANGUAGES和LOCALE_PATHS

修改template目錄下的html文件

1.每一個(gè)html前面都要加上 {% load i18n %},當(dāng)然如果嫌麻煩,可以把它放在已經(jīng)存在公共頁面里面。
2.在需要翻譯的地方加上{% trans ‘XXXXX’ %},XXXXX是需要翻譯的文本

{% trans ‘XXXXX’ %}

3.多次重復(fù)翻譯的內(nèi)容可以像設(shè)置常量那樣

{% trans "This is the title" as the_title %}
<title>{{ the_title }}</title>
<meta name="description" content="{{ the_title }}">

3.如果翻譯的內(nèi)容有django模板輸出的變量,例如{{username}}的內(nèi)容,就需要用{% blocktrans %}和{% endblocktrans%}

#普通用法
{% blocktrans %}This string will have {{ value }} inside.{% endblocktrans %}
#增加過濾器
{% blocktrans with amount=article.price %}
That will cost $ {{ amount }}.
{% endblocktrans %}
{% blocktrans with myvar=value|filter %}
This will have {{ myvar }} inside.
{% endblocktrans %}
#多個(gè)過濾器
{% blocktrans with book_t=book|title author_t=author|title %}
This is {{ book_t }} by {{ author_t }}
{% endblocktrans %}
#注意:其他bolck tags (例如 {% for %} or {% if %}) 不允許在 blocktrans tag內(nèi)部.

生成翻譯文件,并且翻譯

1.執(zhí)行如下命令生成翻譯文件

python manage.py makemessages -l en
#en 指的是English,其他以此類推

接下來看到local文件夾下面生成了en/LC_MESSAGES/


local/en/LC_MESSAGES/

2.修改django.po文件,對每一個(gè)msgid進(jìn)行翻譯,翻譯內(nèi)容填在msgstr中。


修改django.po文件

3.然后編譯
python manage.py compilemessages -l en

修改url,此url文件
#之前的url
urlpatterns = patterns('',)
#修改后
from django.conf.urls.i18n import i18n_patterns
urlpatterns += i18n_patterns('',)
重啟服務(wù)并訪問查看效果

http://localhost:端口號(hào)/en/adminbd/ap_list
http://localhost:8080/zh-hans/adminbd/ap_list


最后來添加切換語言的功能

1.添加切換語言的url:

url(r'^i18n/',include('django.conf.urls.i18n')),

2.頁面上添加如下的form表單(必須是POST請求)

html

還有JavaScript代碼

切換語言JavaScript代碼

如果涉及到登錄的系統(tǒng),需要記住用戶選擇的語言,那么就需要存儲(chǔ)session,session名為"_language"
request.session['_language']='zh-hans'
views的多語言,具體可以參考官方文檔
from django.utils.translation import ugettext as _
#……
MSG={1:'成功',0:'失敗'}
context['msg']=_(MSG[1])
return render(request,RESPONSE_URL,context)

關(guān)于javascript的國際化

官方文檔
在根urls.py 中添加如下代碼,your.app.package替換成app名稱

from django.views.i18n import javascript_catalog
js_info_dict = { 'packages': ('your.app.package',),}
urlpatterns += [ url(r'^jsi18n/$', javascript_catalog, js_info_dict, name='javascript-catalog'),]
配置JavaScript的url

在模板中先于需要漢化js引用如下js

<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>

1.然后在使用gettext方法標(biāo)記需要國際化的內(nèi)容

539181.png

2.涉及到單數(shù)復(fù)數(shù)形式的用 ngettext
var object_count = 1 // or 0, or 2, or 3, ...s = ngettext('literal for the singular case’, //單數(shù) 'literal for the plural case’, object_count);//復(fù)數(shù)

3.涉及到格式化輸出內(nèi)容的用interpolate,與ngettext搭配使用
fmts = ngettext('There is %s object. Remaining: %s', 'There are %s objects. Remaining: %s', 11);s = interpolate(fmts, [11, 20]);// s 輸出結(jié)果為為復(fù)數(shù)形式 'There are 11 objects. Remaining: 20'

還有其他方法

  • get_format
  • gettext_noop
  • pgettext
  • npgettext
  • pluralidx

最后與makemessages一樣,js也需要生產(chǎn)翻譯文件,得到djangojs.po文件,在里面添加翻譯

django-admin makemessages -d djangojs -l en

編譯還是與上面的命令一樣。
重啟服務(wù)器可以看到效果


著重強(qiáng)調(diào)一點(diǎn),在JavaScript多語言這里遇到個(gè)坑,js的翻譯不管是中文還是英文都是顯示英文翻譯。原因是變異的時(shí)候應(yīng)該用 zh_Hans 而不是zh_hans 或者zh_cn等等。
  django-admin.py makemessages -l zh_Hans 

上面圖中也是錯(cuò)的

93438.png

最后一個(gè)坑是多語言國際化的時(shí)候渲染模板的方法要用render(request,’xxxxx.html’,{})而不是render_to_response(’xxxx.html’,{})方法

中文文檔

作為默認(rèn), django-admin.py makemessages
檢測每一個(gè)有 .html
擴(kuò)展名的文件。 以備你要重載缺省值,使用 --extension
或 -e
選項(xiàng)指定文件擴(kuò)展名來檢測。

django-admin.py makemessages -l de -e txt```
用逗號(hào)和(或)使用-e
或--extension
來分隔多項(xiàng)擴(kuò)展名:

django-admin.py makemessages -l de -e html,txt -e xml```
當(dāng)創(chuàng)建JavaScript翻譯目錄時(shí),你需要使用特殊的Django域:not -e js

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容