清除缓存后多语言切换失效,主因是loadlangpack中间件未加载、语言包路径不匹配或lang()调用被模板缓存固化;需清空全部缓存、验证中间件注册、检查语言包路径与命名规范、排除opcache及app_debug干扰。

清除缓存后多语言切换失效,大概率不是语言包丢了,而是 LoadLangPack 中间件没加载、语言包路径没对上,或者 lang() 调用被缓存残留逻辑绕过了。
确认 LoadLangPack 中间件是否真在运行
缓存清完后,中间件注册表可能没重载——哪怕你改了 app/middleware.php,旧的中间件链仍可能从 runtime 缓存里读出来。
- 先执行
php think clear:template和php think clear --all,确保模板和配置缓存都清空 - 检查
app/middleware.php是否包含'think\middleware\LoadLangPack',且位置在路由之后、控制器之前 - 临时在中间件构造函数或 handle() 里加
file_put_contents(runtime/log/lang_debug.log, 'loaded', FILE_APPEND),访问页面看日志有没有写入——没写入说明中间件根本没跑
验证语言包路径与 config/lang.php 是否一致
ThinkPHP6 查语言包只认固定路径,且大小写、分隔符、文件扩展名全错一个就静默失败,不报错也不 fallback。
- 语言包必须放在
app/lang/zh-cn.php、app/lang/en-us.php,不能是zh_CN.php或zh.php -
config/lang.php中'default_lang' => 'zh-cn'和'allow_lang_list' => ['zh-cn', 'en-us']必须和文件名完全一致(小写+短横线) - 每个语言文件开头不能有 BOM、空格或
echo,必须以<?php return ['welcome' => '欢迎'];开始
检查 lang() 调用是否被模板缓存“固化”
模板缓存清理不彻底时,{:lang('welcome')} 可能已被编译成固定字符串写死在 runtime/view/ 的 PHP 文件里,后续改语言包也无效。
- 删掉整个
runtime/view/目录(不是只删 .php 文件),再访问一次页面触发重建 - 在模板中临时改用
<?php echo lang('welcome'); ?>,绕过模板引擎解析,看是否即时生效——如果生效,说明原写法被缓存固化了 - 确认
config/template.php中'cache' => true且'cache_expire' => 0(开发时设为 0 更利于调试)
GET 参数 lang=xx 不生效?优先级和变量名要对得上
语言侦测顺序是 GET → Cookie → Header → HTTP_ACCEPT_LANGUAGE,但这个顺序不会自动生效,得靠配置项显式打开。
-
config/lang.php中必须设'detect_var' => 'lang',否则?lang=en-us完全被忽略 - 如果同时设置了
'use_cookie' => true且用户 Cookie 里已有think_lang=zh-cn,那即使 URL 带lang=en-us,也会因 Cookie 优先级低于 GET 而被覆盖——这是设计行为,不是 bug - 用浏览器开发者工具 Network 面板看请求头,确认是否真发了
think-lang: en-us(对应header_var配置)
最常被忽略的是:清完缓存后没重启 PHP-FPM 进程,OPCache 还在执行旧字节码;或者 APP_DEBUG=true 没关,导致 LoadLangPack 根本不注册。这两点不排查,调路径、改配置全是白忙。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











