Django 實戰:I18N 國際化與本地化配置、翻譯與切換一步到位

文章目錄

    • 一、國際化與本地化介紹
      • 定義
      • 相關概念
    • 二、安裝配置
      • 安裝 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從入門到實戰》專欄!關注不迷路~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89551.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89551.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89551.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過國內扣子(Coze)搭建智能體并接入discord機器人

國內的扣子是無法直接授權給discord的,但是用國外的coze的話,大模型調用太貴,如果想要接入國外的平臺,那就需要通過調用API來實現。 1.搭建智能體(以工作流模式為例) 首先,我們需要在扣子平臺…

【辦公類-107-02】20250719視頻MP4轉gif(削減MB)

背景需求 最近在寫第五屆智慧項目結題(一共3篇)寫的昏天黑地,日以繼夜。 我自己《基于“AI技術”的幼兒園教學資源開發和運用》提到了AI繪畫、AI視頻和AI編程。 為了更好的展示AI編程的狀態,我在WORD里面插入了MP4轉gif的動圖。 【教學類-75-04】20241023世界名畫-《蒙…

一文講清楚React的render優化,包括shouldComponentUpdate、PureComponent和memo

文章目錄一文講清楚React的render優化,包括shouldComponentUpdate、PureComponent和memo1. React的渲染render機制2. shouldComponentUpdate2.1 先上單組件渲染,驗證state變化2.2 上父子組件,驗證props2. PureComponent2.1 單組件驗證state2.…

物聯網iot、mqtt協議與華為云平臺的綜合實踐(萬字0基礎保姆級教程)

本學期的物聯網技術與應用課程,其結課設計內容包含:mqtt、華為云、PyQT5和MySQL等結合使用,完成了從華為云配置產品信息以及轉發規則,到mqtt命令轉發,再到python編寫邏輯代碼實現相關功能,最后用PyQT5實現面…

使用IntelliJ IDEA和Maven搭建SpringBoot集成Fastjson項目

使用IntelliJ IDEA和Maven搭建SpringBoot集成Fastjson項目 下面我將詳細介紹如何在IntelliJ IDEA中使用Maven搭建一個集成Fastjson的SpringBoot項目,包含完整的環境配置和代碼實現。 一、環境準備 軟件要求 IntelliJ IDEA 2021.x或更高版本JDK 1.8或更高版本&#x…

Java從入門到精通!第九天, 重點!(集合(一))

十一、集合1. 為什么要使用集合(1) 數組存在的弊端1) 數組在初始化之后,長度就不能改變,不方便擴展。2) 數組中提供的屬性和方法比較少,不便于進行添加、刪除、修改等操作,并且效率不高,同時無法直接存儲元素的個數。3…

為什么使用時序數據庫

為什么使用時序數據庫? 時序數據庫(Time-Series Database, TSDB)是專為時間序列數據優化的數據庫,相比傳統關系型數據庫(如MySQL)或NoSQL數據庫(如MongoDB),它在以下方面…

計算機網絡:(十一)多協議標記交換 MPLS

計算機網絡:(十一)多協議標記交換 MPLS前言一、傳統網絡的問題二、MPLS:給數據包貼個“標簽”三、MPLS的工作流程1. 入站2. 中間3. 出站四、MPLS的能力前言 前面我們講解了計算機網絡中網絡層的相關知識,包括網絡層轉發…

docker run elasticsearch 報錯

谷粒商城 p103 前提條件: 下載鏡像文件 #存儲和檢索數據 docker pull elasticsearch:7.4.2 #可視化檢索數據 docker pull kibana:7.4.2 創建掛載的文件和配置 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "http.h…

巧用Callbre RVE生成DRC HTML report及CTO的使用方法

對于后端版圖人員,在芯片TO前的LV signoff階段,猶如一段漫長而有期待的朝圣之旅,需要耐心,毅力和信心,在龐雜的DRC中找到一條收斂之路。為了讓此路更為清晰收斂,Calibre提供了一套可追溯對比的富文本方式-H…

產品需求文檔(PRD)格式全解析:從 RP 到 Word 的選擇與實踐

產品需求文檔(PRD)的形式多種多樣,但核心目標始終一致:清晰傳遞產品需求,讓團隊高效協作。不同公司對 PRD 的格式要求可能不同,有的偏愛直接在原型工具中撰寫,有的則習慣用 Word 整理歸檔。本文…

【C++】入門階段

一、初始化C中的初始化指為變量賦予初始值的過程。初始化方式多樣,適用于不同場景。char cha0; char chb{0}; char chc(\0); char chdcha; char che{};注意事項優先使用列表初始化({}),避免窄化轉換風險。在c11中{ }在變量&#x…

tailscale在ubuntu22.04上使用

支持 x86 和 ARM 架構 CPU 的軟件包已提供 32 位和 64 位版本。 添加 Tailscale 的軟件包簽名密鑰及倉庫: curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null c…

深入解析Linux文件重定向原理與dup2系統調用

在Linux中,重定向(Redirection)是一種強大的功能,允許用戶控制命令的輸入來源(stdin)和輸出目標(stdout和stderr)。通過重定向,你可以將命令的輸出保存到文件、從文件讀取…

QGIS制作的儀表盤工程

在QGIS的官方資源庫下載了一個QGIS制作的儀表盤工程,感覺非常炫酷!分享給大家!下面的儀表盤會將選中的道路數及長度,動態顯示在相應的儀表項中!下面的儀表盤會將選中的道路數及長度,動態顯示在相應的儀表項…

Python高級數據類型:集合(Set)

集合是Python中一種非常有用的數據結構,它與列表類似但具有獨特的特性。本文將全面介紹集合的所有知識點,從基礎概念到高級用法,幫助初學者徹底掌握集合的使用。1. 集合簡介1.1 什么是集合?集合(Set)是Pyth…

【Unity編輯器開發GUI.Window】

Unity GUI.Window 筆記 根據官方文檔2021版本的,點擊鏈接跳轉記錄 概述 GUI.Window 是 Unity IMGUI 系統中用于創建彈出窗口的核心方法,具有以下關鍵特性: 浮動窗口:浮于普通 GUI 控件之上焦點控制:可通過點擊獲得焦…

CAN通信驅動開發注意事項

以下是CAN通信驅動開發的關鍵注意事項相關的整理,涵蓋硬件配置、協議實現、錯誤處理及性能優化等方面: 一、硬件層配置要點 引腳復用與時鐘 確認MCU的CAN控制器引腳是否與GPIO復用,正確配置復用模式。 檢查CAN控制器時鐘源,確保波特率計算基準準確。 收發器(Transceiver)…

CCF編程能力等級認證GESP—C++8級—20250628

CCF編程能力等級認證GESP—C8級—20250628單選題(每題 2 分,共 30 分)判斷題(每題 2 分,共 20 分)編程題 (每題 25 分,共 50 分)樹上旅行遍歷計數單選題(每題 2 分,共 30…

135. Java 泛型 - 無界通配符

文章目錄135. Java 泛型 - 無界通配符 (?)**1. 什么是無界通配符 (?)&#xff1f;****2. 為什么使用無界通配符&#xff1f;****3. 示例&#xff1a;使用 ? 處理任意列表****? 錯誤示例****? 正確示例****4. 為什么 List<Object> 和 List<?> 不一樣&#xff…