Django LocaleMiddleware 中间件

1. 这个中间件要解决什么问题?

想象您的网站需要支持多种语言:中文、英文、日文。用户访问时,网站需要知道:

  • 用户想看哪种语言?
  • 如何给用户显示正确的语言版本?

2. 最核心的两个功能

功能1:在请求开始时决定用户语言

1
2
3
4
5
6
7
8
9
10
11
def process_request(self, request):
# 简单说就是:根据各种线索猜测用户想要什么语言

# 线索1: URL里有语言吗? /zh-cn/products/ → 中文
# 线索2: 用户之前选过语言吗?(存在session/cookie里)
# 线索3: 浏览器偏好什么语言?(Accept-Language头)
# 线索4: 都没有?用默认语言(英文)

language = "根据上面的线索得出的语言"
translation.activate(language) # 告诉Django:"现在用这个语言!"
request.LANGUAGE_CODE = language # 把语言信息存到请求里

功能2:在响应时处理特殊情况

1
2
3
4
5
6
7
8
9
10
def process_response(self, request, response):
# 简单说就是:如果页面404了,看看是不是缺少语言前缀

if response.status_code == 404:
# 用户访问 /products/ → 404错误
# 但是 /zh-cn/products/ 存在
# 就自动重定向用户到 /zh-cn/products/

# 设置一些HTTP头,告诉浏览器和缓存这个页面的语言信息
response['Content-Language'] = language

3. 用生活例子理解

把这个中间件想象成一个智能翻译助手

1
2
3
4
5
6
7
8
9
10
11
# 场景1:用户访问网站
用户: "我想看产品页面" (访问 /products/)
助手: "我看看你想要什么语言..."
助手: "你的浏览器设置是中文,那我给你中文版本"
结果: 显示中文的产品页面

# 场景2:用户访问错误的URL
用户: "我想看产品页面" (访问 /products/ 但这个URL不存在)
助手: "这个页面不存在,但是我发现 /zh-cn/products/ 存在"
助手: "我帮你跳转过去"
结果: 自动跳转到 /zh-cn/products/

4. 几个关键概念简化解释

概念1:语言检测优先级

1
2
3
4
5
# 就是一个优先级列表,从高到低:
1. URL里明确写了语言 (/zh-cn/products/) → 最优先
2. 用户之前选择过语言 (存在session/cookie) → 其次
3. 浏览器语言偏好 → 再次
4. 网站默认语言 → 最后兜底

概念2:i18n_patterns

1
2
3
# 就是告诉Django哪些URL需要语言前缀
# 普通URL: /products/
# 国际化URL: /en/products/, /zh-cn/products/, /ja/products/

概念3:404智能处理

1
2
3
4
# 用户访问: /products/ → 404
# 中间件想: "让我试试加上语言前缀"
# 检查: /zh-cn/products/ → 存在!
# 动作: 自动跳转到 /zh-cn/products/

5. 实际效果演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 配置了这个中间件后的用户体验:

# 情况1:中文用户访问
用户浏览器: Accept-Language: zh-CN
用户访问: yoursite.com/products/
实际看到: 中文版本的产品页面
URL变成: yoursite.com/zh-cn/products/ (如果配置了语言前缀)

# 情况2:英文用户访问
用户浏览器: Accept-Language: en-US
用户访问: yoursite.com/products/
实际看到: 英文版本的产品页面
URL可能: yoursite.com/products/ (如果英文是默认语言)

# 情况3:用户手动选择语言
用户点击: "切换到日文"
系统记住: 在session/cookie里保存 "ja"
下次访问: 自动显示日文版本

6. 总结一句话

这个中间件就是一个智能的语言管家,它会猜测用户想要什么语言,然后自动提供对应语言的页面,如果用户访问了错误的URL,还会智能地帮用户跳转到正确的地址。

不需要理解每行代码的细节,只要知道它在做什么就够了:让多语言网站变得用户友好

国际化的实现是同一页面,多个翻译文件,实时的进行页面渲染


Django LocaleMiddleware 中间件
https://luffy997.github.io/2025/07/16/Django-LocaleMiddleware-中间件/
作者
Luffy997
发布于
2025年7月16日
许可协议