文章目錄
- 一、國際化與本地化介紹
- 定義
- 相關概念
- 二、安裝配置
- 安裝 gettext
- 配置 settings.py
- 三、使用國際化
- 視圖中使用
- 序列化器和模型中使用
- 四、本地化操作
- 創建或更新消息文件
- 消息文件說明
- 編譯消息文件
- 五、項目實戰
一、國際化與本地化介紹
定義
國際化和本地化的目標,是允許一個單一的 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.valuelogin_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 tclass 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從入門到實戰》專欄!關注不迷路~