ThinkPHP6多语言切换后静态页面文案不变,根本原因是LoadLangPack中间件未启用、语言包路径/命名不规范(须为app/lang/zh-cn.php)、lang()调用未统一使用键名、伪静态未透传lang参数,或语言包文件存在语法错误导致返回空数组。

ThinkPHP6多语言切换后静态页面文案不变,基本就是语言包没加载、中间件没启用、或路径/键名对不上——不是缓存问题,也不是前端没刷新。
LoadLangPack中间件是否启用
没启用这个中间件,lang()调用永远返回键名,比如welcome而不是“欢迎”。它不报错,只静默失效。
- 检查
app/middleware.php中是否已加入'think\middleware\LoadLangPack' - 确认该中间件在数组靠前位置(不能放在
CheckRequestCache之类之后) - 如果用了多应用(如
app/admin),每个应用的middleware.php都要单独加
语言包路径和文件命名是否严格匹配
ThinkPHP6只认app/lang/zh-cn.php这种小写+短横线格式,zh_CN.php、zh.php、app/language/zh-cn.php全都不加载。
- 删掉所有非标准路径,重置为
app/lang/zh-cn.php和app/lang/en-us.php - 每个文件必须以
return [ 'welcome' => '欢迎' ];开头,不能有BOM、空行、echo或var_dump - 多应用下路径是
app/应用名/lang/zh-cn.php,不是app/lang/应用名/zh-cn.php
lang()调用时是否用了硬编码键名
如果模板里写的是<h1>欢迎</h1>,切换语言当然没反应。所有文案必须走lang('welcome')或$this->lang('welcome')。
立即学习“PHP免费学习笔记(深入)”;
- 检查所有
.html、.php模板,把中文/英文字符串全部替换成lang()调用 - 控制器里也一样:禁止
return ['msg' => '操作成功'],改用return ['msg' => lang('operate_success')] - 错误码文案尤其容易漏,比如
validate()->getError()返回的也是键名,需配合语言包里的validate命名空间
伪静态下lang参数是否被路由吃掉了
伪静态规则若把/zh-cn/index直接重写成/index.php而没透传路径,LoadLangPack就拿不到lang值,只能 fallback 到配置里的default_lang。
- 确保 Nginx 规则里有
try_files $uri $uri/ /public/index.php?$query_string;,且$query_string保留了lang=zh-cn - 如果用了路由变量方式(如
Route::rule('[:lang]/[:any]', ...)),中间件里要用$request->param('lang')取值,不能依赖$_GET['lang'] - 在中间件中加一行
dump($request->param('lang'));验证是否真拿到值
最常被忽略的一点:语言包文件本身有语法错误(比如末尾多了一个逗号),PHP 解析失败但不报错,return []实际返回空数组,lang()查不到键就原样返回——看着像“没切换”,其实是“没加载成功”。



















