Django 實戰:I18N 國際化與本地化配置、翻譯與切換一步到位
一、國際化與本地化介紹
定義
國際化和本地化的目標,是允許一個單一的 Web 應用程序以適合受眾的語言和格式提供其內容。 Django 提供了完整的國際化(i18n)和本地化(l10n)支持。
- 國際化(i18n) :是指在軟件開發過程中,將軟件設計為可以支持多種語言和文化環境的過程。國際化為本地化準備軟件。通常由開發者完成。
- 本地化(l10n) :是指將軟件根據特定語言和文化環境進行定制的過程。本地化編寫翻譯和本地格式化。通常由翻譯者完成。
相關概念
-
消息文件:消息文件(message file)是一個純文本文件,代表一種語言,它包含所有可用的翻譯字段以及如何以給定語言表示。消息文件擴展名是 .po 文件。
-
惰性翻譯:gettext_lazy會延遲翻譯計算,直到實際渲染時才會根據當前請求語言動態加載,而 gettext 在模塊加載時即固定翻譯結果
參考資料:Django 國際化和本地化
二、安裝配置
安裝 gettext
下載地址,下載64位 share 安裝包。雙擊安裝,默認下一步。安裝后檢查是否可識別:
msguniq --version
# 上述命令如果在VSCode的終端無法識別,可以在CMD中運行
配置 settings.py
在 Django 項目的 settings.py 文件中進行如下配置:
### I18N 配置
USE_I18N = True
LOCALE_PATHS = [BASE_DIR / "locale"]
LANGUAGES = (
("zh-hans", "簡體中文"),
("en", "English"),
)
MIDDLEWARE = [
# ...
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.locale.LocaleMiddleware", # I18N多語言支持,注意放置順序
"django.middleware.common.CommonMiddleware",
# ...
]
三、使用國際化
視圖中使用
視圖中使用:使用函數 gettext() 來指定翻譯字符串。按照慣例,將其作為下劃線( _ )導入,以保存輸入。
from django.utils.translation import gettext as _
# ...
# 檢查用戶名與密碼是否正確
if not user:
# 登錄失敗,記錄登錄日志
log_data["result"] = LoginResultEnum.BAD_CREDENTIALS.value
login_log_task.delay(log_data)
return CommonResponse.error(code=111201, msg=_("賬號或密碼錯誤"))
序列化器和模型中使用
序列化器和模型中使用:使用惰性翻譯函數 gettext_lazy() 來指定翻譯字符串。
- 序列化器的
error_messages中直接使用_()函數時,Django 會在啟動時立即計算翻譯值(基于默認語言),而非根據請求動態切換。需改用ugettext_lazy實現惰性翻譯,使翻譯在運行時根據請求語言動態加載。
# 示例:序列化器中
from django.utils.translation import gettext_lazy as _
error_messages={
"required": "密碼不能為空",
"min_length": _("密碼長度至少為8位"),
"max_length": "密碼長度不能超過16位",
},
# 示例:模型
from django.db import models
from django.utils.translation import gettext_lazy as t
class MyThing(models.Model):
name = models.CharField(help_text=t("This is the help text"))
四、本地化操作
創建或更新消息文件
下面命令會遍歷項目源代碼,并抽出所有要被翻譯的字符串。默認情況下,腳本檢查具有 .html、.txt 或 .py 文件擴展名的每個文件。可通過-e選項指定。
# 進入Django 項目的根目錄(就是包含 manage.py 的那個目錄),或進入Django app的根目錄
django-admin makemessages -l zh_Hans
django-admin makemessages -l en
# 只檢查 *.py 文件(可選)
django-admin makemessages -l zh_Hans -e py
# 以后使用下面命令,重新檢查并更新所有語言的消息文件
django-admin makemessages -a
生成對應的消息文件*.po
locale
├── en
│ └── LC_MESSAGES
│ ├── django.mo
│ └── django.po # 消息文件
└── zh_Hans
└── LC_MESSAGES
├── django.mo
└── django.po # 消息文件
消息文件說明
*.po的是消息文件,必須使用 UTF-8 編碼
- msgid :顯示在源代碼中需要翻譯的字符串。不要改動它。
- msgstr :翻譯后的字符串。
# mysite\locale\en\LC_MESSAGES\django.po
msgid "賬號或密碼錯誤"
msgstr "Account or password error"
# mysite\locale\zh_Hans\LC_MESSAGES\django.po
msgid "賬號或密碼錯誤"
msgstr "賬號或密碼錯誤"
編譯消息文件
下面命令會根據 .po 文件內容,編譯并創建對應的 .mo 文件。
django-admin compilemessages
# 如果更新了消息文件,需要重新編譯
生成的翻譯文件應位于以下路徑。需要重啟一下Django項目,才生效。
locale
├── en
│ └── LC_MESSAGES
│ ├── django.mo # 編譯后的翻譯文件
│ └── django.po # 消息文件
└── zh_Hans
└── LC_MESSAGES
├── django.mo # 編譯后的翻譯文件
└── django.po # 消息文件
五、項目實戰
用戶登錄功能,按上述步驟配置國際化與本地化

用戶登錄界面默認為中文,給出中文提示

修改瀏覽器語言偏好:設置 → 語言 → 添加"英語(美國)" → 拖到頂部作為首選語言

此時,給出英文提示

您正在閱讀的是《Django從入門到實戰》專欄!關注不迷路~

Django國際化與本地化指南,涵蓋i18n和l10n的定義、配置、視圖與模型中的翻譯使用、消息文件生成與編譯,以及多語言登錄實戰。助你打造多語言支持的Web應用。
浙公網安備 33010602011771號