thinkphp6多语言需中间件、路径、侦测三者对齐:必须显式启用loadlangpack中间件,config/lang.php中配置detect_var、allow_lang_list、use_cookie三项,语言包严格按app/lang/zh-cn.php路径和return ['key'=>'val']格式存放。

ThinkPHP6 多语言不是靠改几个变量就能跑通的,核心在于「中间件加载 + 语言包路径 + 自动侦测逻辑」三者对齐。配错任意一环,lang() 返回空、Lang::get() 报错、URL 切换不生效,都是常态。
中间件必须显式启用 LoadLangPack
很多人以为只要写好语言包、改了配置就完事,但 TP6 默认不自动加载多语言中间件。不加这行,整个多语言机制就是摆设。
- 在
app/middleware.php(单应用)或对应应用的middleware.php中,确认已加入:'think\middleware\LoadLangPack' - 别手误写成
think\facade\Lang或漏掉命名空间前缀think\ - 如果用了第三方扩展如
tlingc/think-lang,中间件名要换成'tlingc\lang\middleware\LoadLangPack',不能混用
lang.php 配置里这三项不能少
只设 default_lang 不够,系统根本不会去解析 URL 或 Cookie 里的语言参数。
-
detect_var => 'lang':指定 GET 参数名,比如访问/index?lang=en-us才能触发切换 -
allow_lang_list => ['zh-cn', 'en-us']:不在这个数组里的语言标识,一律 fallback 到default_lang,防非法输入 -
use_cookie => true和cookie_var => 'think_lang':否则用户切一次语言,刷新就回退
注意:这些配置项必须放在 config/lang.php,不是 config/app.php —— 放错文件等于没配。
语言包路径和文件名必须严格匹配
TP6 对语言包路径非常敏感,大小写、中划线、目录层级错一个字符,Lang::get() 就静默失败。
- 标准路径是:
app/lang/zh-cn.php、app/lang/en-us.php(单应用) - 文件必须返回数组:
return ['hello' => '你好'];,不能有 echo/print、不能用短数组语法[](PHP 版本兼容问题) - 若用多应用模式,路径变成:
app/index/lang/zh-cn.php,其中index是应用名,需和实际目录一致 - 扩展包如
tlingc/think-lang会额外支持app/lang/zh-cn/common.php这类子文件,但原生 TP6 不认
lang() 助手函数失效?先查这三处
模板或控制器里调 lang('welcome') 没反应,90% 是以下原因:
- 当前请求没触发语言侦测:检查 URL 是否带
?lang=xxx,或 Cookie 是否已存think_lang值 - 语言包键名不一致:中文包写
'welcome_msg',英文包写'welcome',lang('welcome')在中文环境就找不到 - 缓存没清:修改了
lang.php或语言文件后,运行php think clear清除 runtime/cache/ 下的配置和语言缓存
最易被忽略的是:语言包文件里不能包含 BOM 头,Windows 记事本保存的 PHP 文件极易带 BOM,导致解析失败且无报错 —— 用 VS Code 或 Notepad++ 确认编码为 UTF-8 无 BOM。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











