ThinkPHP多语言中间件需手动注册、规范路径、控制执行时机:在app/middleware.php中添加'think\middleware\Lang'::class并置于SessionInit后;语言包路径为lang/zh-cn/common.php,命名须小写短横线;切换语言需通过cookie('think_lang','en-us')并在handle()开头调用Lang::setLang();同时config/app.php中lang_switch_on等配置须设为布尔值。

ThinkPHP多语言中间件不是开箱即用的,必须手动注册、规范路径、控制执行时机,否则语言包不加载、切换无效、报错提示仍是默认语言。
必须注册到全局中间件栈
ThinkPHP 不会自动启用 Lang 中间件。你得在 app/middleware.php 的全局中间件数组中显式添加:
-
'think\middleware\Lang'::class(TP6/8 推荐写法) - 或
\think\middleware\Lang::class(带命名空间全称)
注意:它必须排在 SessionInit 之后、路由调度之前;若顺序靠后,Cookie 和 Session 就读不到,语言设置就失效。
语言包路径和命名要严格合规
中间件只按约定路径找语言包,错一个字母都不行:
立即学习“PHP免费学习笔记(深入)”;
- 目录结构:
lang/zh-cn/common.php、lang/en-us/common.php - 语言码必须全小写、短横线分隔(zh-cn ✔️,zh_CN、ZH-CN、zh ❌)
- 文件名必须是 common.php(不能是 index.php、Common.php 或 zh-cn.php)
- 每个文件内容为纯 PHP 数组:
return ['login' => '登录', 'submit' => '提交'];
切换语言必须在请求最开始设值
Lang 中间件本身只负责“读取并设语言”,不负责“动态切换”。用户点击换语言时,你要自己存语言标识,并在中间件里提前读取生效:
- 前端切换可写 Cookie:
cookie('think_lang', 'en-us')(键名必须是 think_lang) - 中间件中读取优先级建议:Cookie → Session → 默认值
- 关键代码放在
handle()开头:\think\Lang::setLang($lang); - 这一步必须在任何
lang()或Lang::get()调用之前完成,否则该请求全程用初始语言
配置文件要同步开启开关
仅注册中间件还不够,config/app.php 中这几项必须明确设置为布尔值:
-
'lang_switch_on' => true(不能是字符串'true') 'default_lang' => 'zh-cn''lang_list' => ['zh-cn', 'en-us', 'ja-jp']-
'allow_url_lang' => false(强烈建议关掉,避免 ?lang=en-us 干扰 Cookie 切换逻辑)



















