Django国际化/本地化支持

好的 👍 我给你一个完整的 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.pyMIDDLEWARE 里加入 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.pyLANGUAGE_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 参数实现。

Scroll to Top