一、国际化与本地化介绍
定义
国际化和本地化的目标,是允许一个单一的 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从入门到实战》专栏!关注不迷路~
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |