1. 这个中间件要解决什么问题?
想象您的网站需要支持多种语言:中文、英文、日文。用户访问时,网站需要知道:
- 用户想看哪种语言?
- 如何给用户显示正确的语言版本?
2. 最核心的两个功能
功能1:在请求开始时决定用户语言
1 2 3 4 5 6 7 8 9 10 11
| def process_request(self, request): language = "根据上面的线索得出的语言" translation.activate(language) request.LANGUAGE_CODE = language
|
功能2:在响应时处理特殊情况
1 2 3 4 5 6 7 8 9 10
| def process_response(self, request, response): if response.status_code == 404: response['Content-Language'] = language
|
3. 用生活例子理解
把这个中间件想象成一个智能翻译助手:
1 2 3 4 5 6 7 8 9 10 11
| 用户: "我想看产品页面" (访问 /products/) 助手: "我看看你想要什么语言..." 助手: "你的浏览器设置是中文,那我给你中文版本" 结果: 显示中文的产品页面
用户: "我想看产品页面" (访问 /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
概念3:404智能处理
5. 实际效果演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
用户浏览器: Accept-Language: zh-CN 用户访问: yoursite.com/products/ 实际看到: 中文版本的产品页面 URL变成: yoursite.com/zh-cn/products/ (如果配置了语言前缀)
用户浏览器: Accept-Language: en-US 用户访问: yoursite.com/products/ 实际看到: 英文版本的产品页面 URL可能: yoursite.com/products/ (如果英文是默认语言)
用户点击: "切换到日文" 系统记住: 在session/cookie里保存 "ja" 下次访问: 自动显示日文版本
|
6. 总结一句话
这个中间件就是一个智能的语言管家,它会猜测用户想要什么语言,然后自动提供对应语言的页面,如果用户访问了错误的URL,还会智能地帮用户跳转到正确的地址。
不需要理解每行代码的细节,只要知道它在做什么就够了:让多语言网站变得用户友好。
国际化的实现是同一页面,多个翻译文件,实时的进行页面渲染