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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…