一、国际化与本地化介绍

定义

国际化和本地化的目标,是允许一个单一的 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从入门到实战》专栏!关注不迷路~

Django 实战:I18N 国际化与本地化配置、翻译与切换一步到位的更多相关文章

  1. django框架项目 国际化和本地化的实现方法

    转自 https://blog.csdn.net/scissors0707/article/details/79042458 Django国际化 所谓的国际化,是指使用不同语言的用户在访问同一个网站页 ...

  2. 26、Django实战第26天:配置全局导航

    1.编辑index.html,继承base.html 2.编辑base.html,根据是否登录不同显示 问题:当我们选中一个导航,选中样式并没有成为选中的状态 因此我们编辑base.html对导航中进 ...

  3. i18n,国际化翻译,excel与js互转

    背景 公司开发新产品时,要求适配多国语言,采用i18n国际化工具,但翻译字典(js的json)还是需要前端自己写的.字典最终需要转换成excel给专业人员翻译,翻译完成后再转换成js字典文件. 如果手 ...

  4. Django 国际化和本地化

    所谓的国际化,是指使用不同语言的用户在访问同一个网站页面时能够看到符合其自身语言的文本页面. 国际化的基本原理是: 浏览器通过LANGUAGE_CODE在HTTP请求头中告诉网站后台服务器用户所需要的 ...

  5. Django国际化和本地化

    把django的这篇文档看了一遍,基本弄懂了,讲的也挺详细的 https://docs.djangoproject.com/en/1.6/topics/i18n/ 首先是国际化和本地化概念: 1,国际 ...

  6. 第六章:Django 综合篇 - 18:国际化和本地化

    所谓的国际化,是指使用不同语言的用户在访问同一个网站页面时能够看到符合其自身语言的文本页面. 国际化的基本原理是: 浏览器通过LANGUAGE_CODE在HTTP请求头中告诉网站后台服务器用户所需要的 ...

  7. i18n 和 L10n (internationalization and localization) 国际化与本地化(具有全球战略眼光的公司企业的必由之路)

    i18n 和 L10n (internationalization and localization)  国际化与本地化(具有全球战略眼光的公司企业的必由之路) 1 1 https://zh.wiki ...

  8. 从源码MessageSource的三个实现出发实战spring·i18n国际化

    1.前言 互联网业务出海,将已有的业务Copy to Global,并且开始对各个国家精细化,本土化的运营.对于开发人员来说,国际化很重要,在实际项目中所要承担的职责是按照客户指定的语言让服务端返回相 ...

  9. i18n(国际化) 和l18n(本地化)时的地域标识代码

    i18n(国际化) 和l18n(本地化)时的地域标识代码 格式如 zh-CN(语言-国家) i18n(国际化) 和l18n(本地化)时的地域标识代码 格式如 zh-CN(语言-国家) 国家说明 语言说 ...

  10. Bootstrap-datepicker3官方文档中文翻译---I18N/国际化(原文链接 http://bootstrap-datepicker.readthedocs.io/en/latest/index.html)

    I18N/国际化 这个插件支持月份和星期名以及weekStart选项的国际化.默认是英语(“en”); 其他有效的译本语言在 js/locales/ 目录中, 只需在插件后包含您想要的地区. 想要添加 ...

随机推荐

  1. Redis安装-Docker版

    目录 Redis安装 docker版 拉取镜像 准备目录 编写配置文件 redis配置文件 redis启动命令 windows redis GUI管理工具redis-insight 配置连接 Redi ...

  2. SpringBoot配置@ConfigurationProperties(prefix = "pig")时中文乱码

    问题出现 通过@ConfigurationProperties(prefix = "pig")注解进行属性绑定的时候,application.properties文件中出现中文,从 ...

  3. bootstrap4下拉菜单无法显示问题

    刚才在菜鸟教程学习bootstrap4时在按钮组章节中遇到了下拉菜单,可是自己没有调试出来!!! 我把菜鸟的代码copy(全部)到本地发先可以运行!!! 找了半天原因,可能是自己导入的js文件有错!! ...

  4. 【记录】LangChain|Ollama结合LangChain使用的速通版(包含代码以及切换各种模型的方式)

    官方教程非常长,我看了很认可,但是看完了之后呢就需要一些整理得当的笔记让我自己能更快地找到需求.所以有了这篇文章.[写给自己看的,里面半句废话的解释都没有,如果看不懂的话直接看官方教程再看我的] 我是 ...

  5. 【ROS】1.2 创建工作空间与功能包

    创建流程 创建文件夹A,A下创建文件夹src:mkdir -p A/src src下:catkin_init_workspace A下:catkin_make src下,创建工作包learning_p ...

  6. [随记]-SpringMVC中的handler到底是什么东西

    HandlerMapping 初始化时候的 HandlerMapping 有,按顺序排列: requestMappingHandlerMapping beanNameHandlerMapping -& ...

  7. 集成学习双雄:Boosting和Bagging简介

    在机器学习的世界里,集成学习(Ensemble Learning)是一种强大的技术,它通过组合多个模型来提高预测性能. 集成学习通过组合多个基学习器的预测结果,获得比单一模型更优秀的性能.其核心思想是 ...

  8. 0x01 - 我的第一个 Object Visitor

    我的第一个 Object Visitor 预演准备 为了顺利的进行测试,你需要确保本地已经安装了以下这些必备的软件: dotnet 2.1 或者以上版本的 SDK,我们更建议直接安装 dotnet 5 ...

  9. TVM VLOG打印

    TVM 提供了详细日志记录功能,允许提交跟踪级别的调试消息,而不会影响生产中 TVM 的二进制大小或运行时.你可以在你的代码中使用 VLOG 如下: void Foo(const std::strin ...

  10. AutoCAD 逆向工程中 Shx 字体文件解析

    数据格式相关的文章 https://wenku.baidu.com/view/8abbfc33eefdc8d376ee32a1.html 代码实现 https://blog.csdn.net/qq_2 ...