Lang中间件未注册导致语言切换无效,需在app/middleware.php中显式启用think\middleware\Lang且位置正确,多应用模式下各应用目录均需单独配置,顺序须在SessionInit之后、路由调度之前。

Lang中间件没注册,语言切换就注定无效。它不报错、不提示,只是默默跳过整个加载流程,Lang::get()返回空或默认值——这是最常被忽略的起点。
Lang中间件必须显式启用且位置正确
ThinkPHP不会自动加载Lang中间件,哪怕你写了lang_switch_on => true也没用。
- 打开
app/middleware.php,确认think\middleware\Lang在数组中,且**不是被注释掉的状态** - 多应用模式下,每个应用目录(如
app/admin/middleware.php)都要单独配一次 - 中间件顺序不能错:
Lang必须在SessionInit之后、路由调度之前执行;否则$_COOKIE['think_lang']读不到,Lang::detect()也拿不到上下文
Cookie键名和写入方式必须严格匹配
ThinkPHP只认think_lang这个Cookie键,写成lang、language或think_var都无效。
- 前端用
document.cookie = "think_lang=zh-cn; path=/;"写时,务必带上path=/,否则子路径请求读不到 - 后端推荐用
cookie('think_lang', 'zh-cn'),别手写setcookie()——后者容易漏掉domain、secure等关键参数 -
Lang::set('ja-jp')只改当前请求语言,**不写Cookie**;要持久化,必须额外调一次cookie('think_lang', 'ja-jp')
语言包路径和文件结构必须完全合规
ThinkPHP按lang/{lang}/目录结构加载,不是看配置里的别名,也不按文件扩展名或大小写容错。
- 想切到
en-us,就必须存在lang/en-us/common.php,缺一个文件就静默回退,默认语言也不报错 - 目录名大小写敏感:
LANG/EN-US/或lang/En-us/都会失败 - 如果用了
Lang::set('zh_cn')但实际只有lang/zh-cn/,那Lang::get('submit')永远拿不到翻译
跨域或HTTPS环境下Cookie极易失效
开发时切语言正常,上线后全变默认语言?大概率是Cookie没发出去或没存住。
立即学习“PHP免费学习笔记(深入)”;
- HTTPS环境必须配
'secure' => true,否则浏览器拒绝发送 - 跨子域(如
admin.example.com→api.example.com)要设'domain' => '.example.com'(注意开头的点) - 前端发请求时,fetch需加
credentials: 'include',axios要设withCredentials: true;否则Cookie根本不会随XHR发出 - 调试时别只看响应头
Set-Cookie,去浏览器Network面板的Request Headers里确认Cookie:字段是否真有think_lang=xxx
cookie_prefix为空、session未开启这些基础问题,往往比语言逻辑本身更早卡住切换流程。先确保$_COOKIE['think_lang']在控制器入口处能打印出来,再往下查翻译文件和Lang::get()调用。



















