好的 👍 我给你一个完整的 Django 国际化/本地化 (i18n & l10n) 示例,你可以直接在项目里实验。
1️⃣ 开启国际化/本地化支持
在 settings.py
里确保有以下配置:
LANGUAGE_CODE = 'en-us' # 默认语言
TIME_ZONE = 'Asia/Shanghai' # 默认时区
USE_I18N = True # 开启国际化
USE_L10N = True # 开启本地化
USE_TZ = True # 使用时区
2️⃣ 添加中间件
在 settings.py
的 MIDDLEWARE
里加入 LocaleMiddleware
:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware', # 👈 必须在 CommonMiddleware 之前
'django.middleware.common.CommonMiddleware',
...
]
3️⃣ 配置语言文件存放目录
LOCALE_PATHS = [
BASE_DIR / 'locale', # 翻译文件目录
]
4️⃣ 标记需要翻译的文本
在视图或模板里用 翻译函数:
- Python 代码里:
from django.utils.translation import gettext as _ def home(request): text = _("Welcome to my site!") return HttpResponse(text)
- 模板里:
<h1>{% trans "Hello World" %}</h1>
5️⃣ 生成翻译文件
在项目根目录运行:
django-admin makemessages -l zh_Hans
这会在 locale/zh_Hans/LC_MESSAGES/
下生成 django.po
文件。
打开它,找到对应的英文文本,写上中文翻译:
msgid "Welcome to my site!"
msgstr "欢迎来到我的网站!"
msgid "Hello World"
msgstr "你好,世界"
6️⃣ 编译翻译文件
django-admin compilemessages
会生成 .mo
文件,Django 才能识别。
7️⃣ 切换语言
有两种方式:
- 全局默认语言:修改
settings.py
的LANGUAGE_CODE
。 - 用户动态切换:在视图里使用
translation.activate()
:from django.utils import translation def chinese_view(request): translation.activate('zh-hans') return HttpResponse(_("Welcome to my site!"))
8️⃣ 效果
- 当
LANGUAGE_CODE='en-us'
时:显示Welcome to my site!
- 当切换到
zh-hans
时:显示欢迎来到我的网站!
👉 这样,你就能在一个项目里支持多语言文本、日期和数字的本地化了。
👌 如果是 前后端分离,Django 后端就不要再负责模板渲染({% trans %}
用不到了),而是作为 API 提供多语言文本,由前端决定切换语言。
我给你分三步说明:
🔹 1. 后端(Django + DRF)国际化处理
1.1 settings.py
和传统模式一样,开启 i18n/l10n:
USE_I18N = True
USE_L10N = True
USE_TZ = True
LANGUAGE_CODE = 'en-us'
LANGUAGES = [
('en', 'English'),
('zh-hans', '简体中文'),
('fr', 'Français'),
]
LOCALE_PATHS = [
BASE_DIR / "locale",
]
中间件:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware', # 👈 必须在 CommonMiddleware 之前
'django.middleware.common.CommonMiddleware',
...
]
1.2 API 返回翻译后的文案
from django.utils.translation import gettext as _
from rest_framework.views import APIView
from rest_framework.response import Response
class WelcomeView(APIView):
def get(self, request):
data = {
"message": _("Welcome to my site!"),
"tip": _("Click here to continue"),
}
return Response(data)
🔹 2. 语言切换方式
前后端分离时,常见做法是 前端在请求头里带语言信息:
2.1 通过 Accept-Language
请求头
前端请求时:
GET /api/welcome
Accept-Language: zh-hans
Django 的 LocaleMiddleware
会自动识别,并用对应语言翻译。
2.2 手动参数切换
也可以定义 API 参数:
GET /api/welcome?lang=zh-hans
在 APIView
里强制激活:
from django.utils import translation
class WelcomeView(APIView):
def get(self, request):
lang = request.GET.get("lang", "en")
translation.activate(lang)
return Response({"message": _("Welcome to my site!")})
🔹 3. 前端处理
前端不再写死文案,而是通过 API 拿多语言结果:
例子(Vue/React):
// 请求时指定 Accept-Language
fetch("/api/welcome", {
headers: { "Accept-Language": "zh-hans" }
})
.then(res => res.json())
.then(data => {
console.log(data.message) // 输出 "欢迎来到我的网站!"
})
🔑 总结
- 后端负责翻译:Django 按请求头/参数返回对应语言的 JSON。
- 前端负责展示:只管渲染 API 结果,不需要维护多语言文案。
- 语言切换:靠
Accept-Language
或 URL 参数实现。