2021年1月10日 星期日

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 

即可完成翻譯。



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


執行結果如下,

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 來定義要翻譯的文字

也能夠以 TAG 

{% language 'en' %}{% endlanguage %}

直接切換語言,

或者使用TAG

{% get_current_language as LANGUAGE_CODE %}

來取得目前使用的語言



其他尚有許多不同的應用,

就需要時間打磨了,

這就是今天的主題

Django 多語言 i18n 範例教學




沒有留言: