语言包加载失败主因是路径命名不规范、中间件未启用或顺序错误、语言标识不在白名单、文件内容含BOM/输出等;正确格式为app/lang/zh-cn.php,需启用think\middleware\Lang中间件且置于SessionInit后,白名单须包含请求语言标识,文件须纯return数组且无任何前置输出。

语言包文件缺失不是“找不到翻译”,而是框架压根没加载到任何语言文件——lang('welcome') 返回原字符串、Lang::get('error') 为空,基本都卡在这一步。
确认语言包路径和命名是否完全合规
ThinkPHP6只认一种格式:app/lang/zh-cn.php 或 app/lang/en-us.php。大小写、分隔符错一个就静默失败:
- ❌ 错误示例:
app/lang/zh_CN.php、app/lang/zh-cn/index.php、app/lang/zh-cn/common.php(TP6默认不走common.php子级) - ✅ 正确结构:直接放在
app/lang/下,文件名全小写+短横线,如zh-cn.php,内容为return ['welcome' => '欢迎']; - Linux服务器区分大小写:
app/lang/ZH-CN.php和app/lang/zh-cn.php是两个不同文件,前者永远加载不到
检查中间件是否启用且顺序正确
语言包不会自动加载,必须靠 think\middleware\Lang 中间件触发扫描。没注册=没加载:
- 打开
app/middleware.php,确认数组中包含think\middleware\Lang::class(不是注释状态) - 多应用模式下,每个应用的
middleware.php都要单独加 - 中间件顺序不能乱:
SessionInit必须在Lang之前,否则读不到cookie('think_lang')
验证语言配置与白名单是否匹配
即使路径对了,如果请求的语言标识不在白名单里,框架会直接跳过加载:
- 检查
config/lang.php中'default_lang' => 'zh-cn'和'allow_lang_list' => ['zh-cn', 'en-us'] - URL传参如
?lang=ja或 Cookie 写了think_lang=zh,但白名单里没有ja或zh,语言包就不会加载 - 动态切换时务必先校验:
$lang = input('lang'); if (in_array($lang, config('lang.allow_lang_list'))) { Lang::setLocale($lang); }
排除文件内容和编码问题
语言包是 PHP 文件,加载失败常因“看不见”的细节:
- 文件开头不能有 BOM、空格、
<?php前不能有任何输出(包括空行) - 不能用
echo、var_dump或其他执行语句,必须以return [ ... ];结尾 - 不要嵌套:❌
return ['zh-cn' => ['welcome' => '欢迎']];✅return ['welcome' => '欢迎'];
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











