Django 多語言 i18n 範例教學
Django是一個開放原始碼的Web應用框架,
同時也支援多語言 i18n 的使用,
這就是今天的主題
Django 多語言 i18n 範例教學
Table of Contents
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 粉絲專頁
================================
1 Response
[…] 這部份各程式語言大同小異,之前也有介紹過 Django 的i18n處理, […]