必须显式设置use_i18n=true,localemiddleware须位于sessionmiddleware之后、commonmiddleware之前,locale_paths指向locale父目录,语言码用zh-hans(非下划线/大写),模板需{% load i18n %}且用{% translate %},改.po后须运行compilemessages。

必须显式设置 USE_I18N = True,且 LocaleMiddleware 位置错误、LOCALE_PATHS 指向错误、语言代码写成 zh_CN 或 zh_Hans——这三类问题占实际失败的 80% 以上。
LocaleMiddleware 为什么没生效?顺序和依赖项缺一不可
LocaleMiddleware 不读取 URL 路径或 GET 参数,只按 session → cookie → Accept-Language 头顺序探测语言。但它能工作的前提是:session 和 cookie 必须可读。
-
SessionMiddleware必须在它之前(否则request.session为空) -
CommonMiddleware必须在它之后(否则中间件链提前终止,request.LANGUAGE_CODE根本不会被设) -
USE_I18N = True必须显式写在settings.py中(Django 4.0+ 默认为True,但老项目常被手动关掉) - 用了
i18n_patterns的路由,未包进去的路径(如/api/、/static/)完全不触发语言检测
makemessages -l zh-hans 报错或生成空 .po 文件?语言码和路径必须严格匹配
报 CommandError: Unknown language code "zh_Hans" 是最常见错误——Django 只认 BCP 47 格式:zh-hans(小写 + 连字符),不是下划线、不是大写、不是 zh_CN。
- 查合法语言码:运行
python manage.py makemessages --list,输出里列出的才是可用值 -
LOCALE_PATHS必须指向locale的**父目录**,例如[BASE_DIR / 'locale'],而不是[BASE_DIR / 'locale' / 'zh-hans'] - 必须手动创建
locale/目录(Django 不自动建) - 模板中必须先
{% load i18n %},再用{% translate "Login" %};直接写{{ _('Login') }}不会被提取
模型字段、表单、序列化器里的字符串为什么不切换语言?
模块加载时就执行的字符串(如 verbose_name、error_messages、label)会立刻求值并固化为启动时的 LANGUAGE_CODE,后续请求不再变化。
- 必须用
gettext_lazy替代gettext,例如:name = models.CharField(verbose_name=_('姓名'))→ 改为from django.utils.translation import gettext_lazy as _,再写verbose_name=_('姓名') - 别在模块顶层或
__init__.py里直接调用_(),除非你明确要静态翻译 - 拼接字符串时不能拆开调用
_():_('Hello') + _('World')是错的;应写成_('Hello World')或带插值的_('Hello {name}').format(name=_('World'))
切换语言后页面没变?compilemessages 和 Cookie 同步常被忽略
改完 .po 文件后不运行 compilemessages,Django 仍加载旧的 .mo 编译文件;而前端切换语言通常只发 GET 到 /i18n/setlang/,若该 URL 未配置或视图未启用,会直接返回 405 错误。
- 每次修改
.po后,必须执行:python manage.py compilemessages - 确保
set_language视图已启用(Django 自带,需在 URLconf 中挂载,如path('i18n/', include('django.conf.urls.i18n'))) - 检查浏览器是否发送了
django_languagecookie,且值为zh-hans或en(注意不是zh-CN)
最容易被忽略的是:语言切换本质是 session + cookie + 中间件协作的结果,任何一个环节断开(比如忘记挂载 i18n URL、cookie 被浏览器拦截、或 CommonMiddleware 错位导致中间件链中断),都会让整个流程静默失效,而错误日志里往往不报任何异常。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











