Django 实战:I18N 国际化与本地化配置、翻译与切换一步到位

一、国际化与本地化介绍

定义

国际化和本地化的目标,是允许一个单一的 Web 应用程序以适合受众的语言和格式提供其内容。 Django 提供了完整的国际化(i18n)和本地化(l10n)支持。

  • 国际化(i18n) :是指在软件开发过程中,将软件设计为可以支持多种语言和文化环境的过程。国际化为本地化准备软件。通常由开发者完成。
  • 本地化(l10n) :是指将软件根据特定语言和文化环境进行定制的过程。本地化编写翻译和本地格式化。通常由翻译者完成。

相关概念

  • 消息文件:消息文件(message file)是一个纯文本文件,代表一种语言,它包含所有可用的翻译字段以及如何以给定语言表示。消息文件扩展名是 .po 文件。

  • 惰性翻译:gettext_lazy会延迟翻译计算,直到实际渲染时才会根据当前请求语言动态加载,而 gettext 在模块加载时即固定翻译结果

参考资料:Django 国际化和本地化

二、安装配置

安装 gettext

下载地址,下载64位 share 安装包。双击安装,默认下一步。安装后检查是否可识别:

sh 复制代码
msguniq --version
# 上述命令如果在VSCode的终端无法识别,可以在CMD中运行

配置 settings.py

在 Django 项目的 settings.py 文件中进行如下配置:

python 复制代码
### 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() 来指定翻译字符串。按照惯例,将其作为下划线( _ )导入,以保存输入。

python 复制代码
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 实现惰性翻译,使翻译在运行时根据请求语言动态加载。
python 复制代码
# 示例:序列化器中
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选项指定。

sh 复制代码
# 进入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

sh 复制代码
locale
├── en
│   └── LC_MESSAGES
│       ├── django.mo
│       └── django.po  # 消息文件
└── zh_Hans
    └── LC_MESSAGES
        ├── django.mo
        └── django.po  # 消息文件

消息文件说明

*.po的是消息文件,必须使用 UTF-8 编码

  • msgid :显示在源代码中需要翻译的字符串。不要改动它。
  • msgstr :翻译后的字符串。
sh 复制代码
# 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 文件。

sh 复制代码
django-admin compilemessages
# 如果更新了消息文件,需要重新编译

生成的翻译文件应位于以下路径。需要重启一下Django项目,才生效。

sh 复制代码
locale
├── en
│   └── LC_MESSAGES
│       ├── django.mo  # 编译后的翻译文件
│       └── django.po  # 消息文件
└── zh_Hans
    └── LC_MESSAGES
        ├── django.mo  # 编译后的翻译文件
        └── django.po  # 消息文件

五、项目实战

用户登录功能,按上述步骤配置国际化与本地化

用户登录界面默认为中文,给出中文提示

修改浏览器语言偏好:设置 → 语言 → 添加"英语(美国)" → 拖到顶部作为首选语言

此时,给出英文提示

点击查看完成代码


您正在阅读的是《Django从入门到实战》专栏!关注不迷路~

相关推荐
牢七10 小时前
5655869
django
秋氘渔1 天前
智演沙盘 —— 基于大模型的智能面试评估系统
python·mysql·django·drf
jcsx2 天前
如何将django项目发布为https
python·https·django
百锦再2 天前
京东云鼎入驻方案解读——通往协同的“高架桥”与“快速路”
android·java·python·rust·django·restful·京东云
Warren982 天前
datagrip新建oracle连接教程
数据库·windows·云原生·oracle·容器·kubernetes·django
韩立学长3 天前
【开题答辩实录分享】以《跳蚤市场二手物品交易推荐平台》为例进行选题答辩实录分享
python·django
飞天小蜈蚣3 天前
django的ulr注意事项、模板渲染
python·django·sqlite
Q_Q5110082853 天前
python_django基于大数据技术旅游景点数据分析推荐系统现_wrqk1aes
大数据·python·django
心本无晴.4 天前
拣学--基于vue3和django框架实现的辅助考研系统
vue.js·python·mysql·考研·django·dify
Darenm1114 天前
关于AI 面试官项目:智选ai 基于 Vue3 + Django + Dify 的全栈开发实战
人工智能·python·django