Django 提供了强大的国际化 (i18n) 和本地化 (l10n) 支持,让开发者能够轻松创建多语言网站。

1、核心概念与配置

1.1 基本配置

在 settings.py中启用国际化支持:


# settings.py # 启用国际化
USE_I18N = True
USE_L10N = True # 本地化格式(数字、日期等)
USE_TZ = True # 时区支持 # 支持的语言
LANGUAGES = [
('en', 'English'),
('zh-hans', '简体中文'),
] # 默认语言
LANGUAGE_CODE = 'en' # 翻译文件位置
LOCALE_PATHS = [
os.path.join(BASE_DIR, 'locale'),
] # 中间件配置(确保顺序正确)
MIDDLEWARE = [
# ...
'django.middleware.locale.LocaleMiddleware', # 在SessionMiddleware之后,CommonMiddleware之前
# ...
]

1.2 项目结构建议

my_project/
├── locale/ # 翻译文件目录
│ ├── en/
│ │ └── LC_MESSAGES/
│ │ ├── django.po
│ │ └── django.mo
│ ├── zh_Hans/
│ └── ja/
├── templates/
│ ├── base.html
│ └── includes/
│ └── language_switcher.html
├── my_app/
│ ├── locale/ # 应用特定翻译(可选)
│ └── views.py
└── manage.py

2、模板中的国际化


{% load i18n %} <!DOCTYPE html>
<html lang="{{ request.LANGUAGE_CODE }}">
<head>
<title>{% trans "Welcome to our site" %}</title>
</head>
<body>
<h1>{% trans "Hello, World!" %}</h1> {# 带变量的翻译 #}
<p>{% blocktrans with name=user.name %}Hello, {{ name }}!{% endblocktrans %}</p> {# 复数形式 #}
<p>
{% blocktrans count counter=item_count %}
You have {{ counter }} item.
{% plural %}
You have {{ counter }} items.
{% endblocktrans %}
</p>
</body>
</html>

3、Python 代码中的国际化

3.1 视图和模型中的翻译


# views.py
from django.utils.translation import gettext as _
from django.utils.translation import gettext_lazy, ngettext
from django.http import JsonResponse
from django.shortcuts import render def welcome_view(request):
# 简单翻译
message = _("Welcome to our application") # 带变量的翻译
username = request.user.username
greeting = _("Hello, %(username)s") % {'username': username} # 复数形式
item_count = 5
items_message = ngettext(
"You have %(count)d item",
"You have %(count)d items",
item_count
) % {'count': item_count} return render(request, 'welcome.html', {
'message': message,
'greeting': greeting,
'items_message': items_message
}) # API响应国际化
def api_view(request):
return JsonResponse({
'message': _("Operation completed successfully"),
'error': _("Invalid input provided")
}) # models.py
from django.db import models
from django.utils.translation import gettext_lazy as _ class Product(models.Model):
name = models.CharField(_("Product name"), max_length=100)
description = models.TextField(_("Product description")) class Meta:
verbose_name = _("Product")
verbose_name_plural = _("Products") def __str__(self):
return _("Product: %(name)s") % {'name': self.name}

3.2 表单和验证错误

# forms.py
from django import forms
from django.utils.translation import gettext_lazy as _
from django.core.validators import ValidationError class ContactForm(forms.Form):
name = forms.CharField(label=_("Your name"))
email = forms.EmailField(label=_("Email address"))
message = forms.CharField(
label=_("Message"),
widget=forms.Textarea,
error_messages={
'required': _("Please enter your message")
}
) def clean_email(self):
email = self.cleaned_data.get('email')
if not email.endswith('.com'):
raise ValidationError(_("Email must be from a .com domain"))
return email # 表单级别的错误消息
def clean(self):
cleaned_data = super().clean()
# 自定义验证逻辑
if cleaned_data.get('name') == cleaned_data.get('email'):
raise ValidationError(_("Name and email cannot be the same"))

4、翻译文件

4.1 .po 文件

# locale/zh_Hans/LC_MESSAGES/django.po

# 清晰的注释说明上下文
#. This message appears on the homepage banner
msgid "Welcome to our site"
msgstr "欢迎访问我们的网站" # 带变量的翻译
msgid "Hello, %(username)s"
msgstr "你好,%(username)s" # 复数形式
msgid "You have %(count)d item"
msgid_plural "You have %(count)d items"
msgstr[0] "您有 %(count)d 个项目"
msgstr[1] "您有 %(count)d 个项目" # 包含开发者注释
# Translators: This message appears in the email subject
msgid "Password reset request"
msgstr "密码重置请求"

4.2 提取和编译翻译

# windows需要先安装gettext
django-admin makemessages -l zh_Hans # 简体中文
django-admin makemessages -l en # 编译翻译文件
django-admin compilemessages # 查看所有支持的语言
python manage.py show_languag

Django国际化的更多相关文章

  1. Django国际化注意事项

    涉及两部分内容: py/html文件国际化.外部js文件国际化 步骤 1. settings.py 激活相应的配置 2. 针对py文件,需要注意被翻译代码的编写方式 3. 针对html文件,需要注意被 ...

  2. Django 国际化和本地化

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

  3. Django国际化和本地化

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

  4. django国际化的简单设置

    设置国际化的具体步骤: 一.国际化 1)效果:针对不同的国家的人可以配置不同的语言(一般是英文和中文,  English  Chinese) 2)目的:增加项目的用户量 3)难度:不难 比较费劲的就是 ...

  5. django国际化总结

    转:http://blog.csdn.net/ybdesire/article/details/46806739

  6. Django分析之国际化处理

    最近在公司终于开始做web开发了,本以为会是简单的首页之类的小规模项目,结果上来就是一个处理大数据分析的项目,一个关于油品分析的系统,不过我接到的第一个任务是做这个网站的国际化处理,虽然项目还没有上线 ...

  7. Django:之安全、国际化和session

    Django 安全 以下是关于Django安全的一些特征,它包括如何使基于Django的网站的一些建议. 关于安全的官方文档:https://docs.djangoproject.com/en/dev ...

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

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

  9. Django rest_framework 实用技巧

    前言: 最近工作中需要用到Django rest_framework框架做API, 边学边写,记录了一些实际工作中需要用到的功能,不是很全也不系统,以后需要什么功能可以在这查询. 后续还会更新其它的用 ...

  10. 《Django By Example》第九章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag 注:哈哈哈,第九章终于来啦 ...

随机推荐

  1. HyperMesh视觉控制

    在HyperMesh中,模型视角控制可通过标准视图(Standard Views)工具栏.三维视图控制(3D View Controls)工具栏以及鼠标实现. (1) 标准视图工具栏图标.   (2) ...

  2. [UOJ618]【JOISC2021】聚会 2

    #618. [JOISC2021]聚会 2 就是相当于选中的点在整棵树上的重心 首先,当\(i\)为奇数时,答案为\(1\) 当\(i\)为偶数时,可以将选中的点分为两个子树,分别记其根节点为\(x\ ...

  3. [gym103860D]Tree Partition

    D - Tree Partition 考虑将树转换到一个序列上,钦定\(1\)为根节点,\(1\)的父亲为\(0\),在序列上,孩子向父亲连边 然后考虑设\(dp\)状态\(dp[i][j]\)表示前 ...

  4. .NET应用中的高效分布式同步解决方案

    前言 在分布式系统中,多个线程.进程或服务之间常常需要并发访问共享资源,这就带来了数据同步与一致性的挑战.今天大姚给大家分享一个.NET应用中的高效分布式同步解决方案:DistributedLock. ...

  5. AI大模型完全本地化部署指南——从零硬件开始

    本文将从基础硬件购置开始讲起,真正意义上从零开始,最终通过Ollama.LangChain.DeepSeek的一系列交互,输出本地大模型的第一声啼鸣,带你走进另一片广阔的世界.update:2025- ...

  6. .NET AI 模板

    引言 随着人工智能技术的快速发展,AI应用开发已成为开发者必备的技能之一.然而,对于许多.NET开发者来说,如何快速上手AI开发仍然是一个挑战.微软推出的.NET AI模板预览版正是为了解决这一问题而 ...

  7. java面向对象(this、static)

    this关键字 表示类中的属性和方法 调用本类中的构造方法 表示当前对象. 代码 public class text01_1 { public static void main(String[] ar ...

  8. Luogu P8112 [Cnoi2021]符文破译 题解

    P8112 [Cnoi2021]符文破译 借用 KMP 思想优化的动态规划. 首先,用 \(dp[i]\) 表示把前 \(i\) 位的字符完全匹配需要的最少词缀数(下标均从 \(1\) 开始).那么, ...

  9. POLIR-Society--Networking- {关系、理论与管理}: 权利 - Giving(给于)+Taking(取得)+运用好+"人性"

    POLIR-Society--Networking- {关系.理论与管理}: 权利 - Giving(给于)+Taking(取得) 运用好"权利"+"人性" E ...

  10. 数学: R连续性+Q稠密性与数系的完善历史

    R实数集合最重要的基本性质: 连续性(完备性: Q有理数+IR.无理数即无限不循环小数) 数系的扩充历史 自然数集合N: 关于 +加法 与 *乘法 运算是封闭的,但是 N 关于 -减法 运算并不封闭. ...