LocaleMiddleware未生效主因是中间件顺序错误,须置于SessionMiddleware之后、CommonMiddleware之前,且需启用USE_I18N=True;URL语言前缀需用i18n_patterns包裹路由;set_language视图仅支持POST并依赖next参数;翻译不显示则需检查LOCALE_PATHS及执行compilemessages。

为什么 LocaleMiddleware 没生效?检查中间件顺序和 USE_I18N
多数人配置完 LocaleMiddleware 发现语言不切换,根本原因是它被放在了错误位置。Django 要求它必须在 SessionMiddleware 之后、CommonMiddleware 之前。否则无法读取 session 或 cookie 中的语言偏好。
USE_I18N = True 和 USE_L10N = True 也必须显式开启(Django 4.0+ 默认为 True,但老项目或自定义 settings 可能关掉了)。
常见错误顺序:
middleware = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', # ← 必须在这之后
'django.middleware.common.CommonMiddleware', # ← 必须在这之前
'django.middleware.locale.LocaleMiddleware', # ✅ 正确位置
]
怎么让 URL 带语言前缀(如 /zh-hans/xxx)?用 i18n_patterns
如果希望用户通过 URL 切换语言(比如点击「English」跳转到 /en-us/home/),必须把 URLconf 包进 i18n_patterns(),否则 LocaleMiddleware 无法从路径解析语言代码。
示例(urls.py):
from django.conf.urls.i18n import i18n_patterns
from django.urls import path
<p>urlpatterns = [
path('admin/', admin.site.urls),
]</p><p>urlpatterns += i18n_patterns(
path('', include('myapp.urls')), # 这些路径会自动支持语言前缀
)</p>
注意:i18n_patterns 不影响 API 接口或静态资源路径,只作用于你明确包进去的路由。没包进去的路径(比如 /api/v1/)不会被重写,也不会触发语言检测。
用户手动切换语言时,set_language 视图怎么用才不跳错?
Django 自带 set_language 视图(路径默认为 /i18n/setlang/),但它**只处理 POST 请求**,且依赖 next 参数跳回原页面。很多人直接 GET 访问导致 405 错误或白屏。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
正确用法是提交一个表单:
关键点:
-
{% csrf_token %}必须有,否则 403 -
next字段建议动态传入(比如{{ request.get_full_path }}),不然会跳到首页 - 确保
LANGUAGES设置已声明支持的语言,例如:LANGUAGES = [('zh-hans', '简体中文'), ('en-us', 'English')]
为什么翻译文件加载了但界面还是英文?检查 LOCALE_PATHS 和编译状态
LocaleMiddleware 只负责“选语言”,不负责“加载翻译”。如果你改了 .po 文件但没重新编译,或 LOCALE_PATHS 指向错误目录,就会 fallback 到 LANGUAGE_CODE(通常是 en-us)。
确认步骤:
- 运行
django-admin makemessages -l zh-hans生成或更新.po - 运行
django-admin compilemessages生成.mo(必须!否则无效) - 检查
LOCALE_PATHS是否包含你的 locale 目录,例如:LOCALE_PATHS = [BASE_DIR / 'locale'] - 确保每个 app 的
locale/zh-hans/LC_MESSAGES/django.po路径层级正确(不是locale/zh_hans/...)
一个容易忽略的细节:Django 按照 LOCALE_PATHS → app/locale → django/conf/locale 顺序查找翻译文件,靠前的会覆盖靠后的。如果本地 django.po 缺少某条目,它可能悄悄用了 Django 自带的英文翻译。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










