Django 多語言 i18n 範例教學

首頁 >> Research >> 網頁設計 >> Django 多語言 i18n 範例教學

Django是一個開放原始碼的Web應用框架,

同時也支援多語言 i18n 的使用,

這就是今天的主題

Django 多語言 i18n 範例教學

i18n 是什麼?
其實這個名字來自於 internationalization
字母 i 與 n 中間共有18的字母
也就是國際化的意思。
要在 Django 使用 i18n 需要經過幾個步驟,
要使用翻譯的字詞同樣也需要相應的 TAG 或語法。
此處使用 Django 2.2 版本作為範例,
不同版本的 Django 各有差異需要特別注意。
首先要到 settings 確認下列這些設定值是否正確

  • LANGUAGE_CODE = ‘zh-Hant’
  • USE_I18N = True
  • USE_L10N = True
  • LOCALE_PATHS = [os.path.join(BASE_DIR, ‘locale’)]
  • USE_TZ = True

接著找到 MIDDLEWARE 在 session 與 common 中間新增一行:
'django.middleware.locale.LocaleMiddleware',
如果要在 template 使用 i18n的話需要在 TEMPLATES 的 context_processors 新增
'django.template.context_processors.i18n',

如果需要限定支援的語言的話可新增
_ = lambda s: s

LANGUAGES = (    ('en', ('English')),   

('zh-hant', _('Traditional Chinese')),

)
最後就能夠到 console 以命令
python manage.py makemessages -l [語言]
來新增,
它會在上述的 LOCALE_PATHS 中新增該語言,
前往該語言的資料夾找到附檔名為 PO 的文件,
在 msgstr 新增或修改該字詞的翻譯,
最後再執行
python manage.py compilemessages -l zh_Hant 
即可完成翻譯。

語言資料夾前後字串的連結必須使用底線,否則不會出現翻譯

這是由於Django 的 i18n 使用 GNU gettext 標準,其語言的目錄結構為:

路徑/語言_區域碼/LC_MESSAGES/*.mo

這就造成在 settings.py 中 LANGUAGE_CODE = ‘zh-Hant’ ,

但在建立 i18n 翻譯的時候卻使用

python manage.py makemessages -l zh_Hant 

來建立,

第一次使用非常容易中招。

此處以資料庫的說明文字作為範例,

執行結果如下,
ugettext_lazy()的字串會隨著語言的切換而改變,在 models, forms, model forms 中均使用此方法

ugettext()的字串只會隨著 settings 中的 LANGUAGE_CODE 而改變

i18n_patterns 提供了在 url 快速切換語言的方法,
需要在 urls.py 中加上 
from django.urls import path, include

from django.conf.urls.i18n import i18n_patterns

urlpatterns = [    path('i18n/', include('django.conf.urls.i18n')),    path('admin/', admin.site.urls),]
urlpatterns += i18n_patterns(    path('', home, name='home'),)


將需要快速切換的 url 放在 i18n_patterns 中,
就能讓使用者直接由 url 切換語言。
在 templates 使用 i18n 同樣是支援的,
只要該網頁有使用 i18n 就必須加上
{% load i18n %}
並且以
{% trans "target string" %}和{% blocktrans %} {% endblocktrans %}
這兩個 TAG 來定義要翻譯的文字

{% trans "target string" %}

若有引號,表示要翻譯的就是引號中的字串;沒有引號表示要翻譯的是來自 Views 的變數。


也能夠以 TAG 
{% language 'en' %}{% endlanguage %}
直接切換語言,
或者使用TAG
{% get_current_language as LANGUAGE_CODE %}
來取得目前使用的語言

其他尚有許多不同的應用,
就需要時間打磨了,
這就是今天的主題

Django 多語言 i18n 範例教學



================================
分享與讚美,是我們繼續打拼的原動力.
若文章對您有幫助,望請不吝按讚或分享.
或者對影片有興趣可以訂閱頻道接收通知
================================
YouTube 頻道
FB 粉絲專頁
================================

guangyaw

重點主題: 程式設計: Python , Django,Android 工具與軟體: Open edX,Linux工具,Blender教學 分享各地美景與產品使用心得,遊戲實況,甚至影視戲劇等, 您的訂閱就是頻道成長的原動力。 YouTube 頻道: https://youtube.com/xyawli

You may also like...

1 Response

  1. 2022-08-19

    […] 這部份各程式語言大同小異,之前也有介紹過 Django 的i18n處理, […]

發表迴響