ThinkPHP6多语言失效最常见原因是语言包路径错误:单应用必须为app/lang/zh-cn.php等小写短横线格式,多应用需放对应app/应用名/lang/下,禁用下划线、大写、简写及非标准路径。

语言包路径错误是ThinkPHP多语言失效最常见原因,尤其在TP6中,框架对路径大小写、层级、文件命名极其敏感,错一个字符就静默不加载。
确认默认路径与实际存放位置是否一致
ThinkPHP6默认语言包路径是app/lang/,不是application/lang/、Common/Lang/或lang/。如果你把zh-cn.php放在application/lang/zh-cn.php,它永远不会被加载。
- 单应用模式:必须放在app/lang/zh-cn.php、app/lang/en-us.php
- 多应用模式(如admin、api):对应应用下建lang子目录,如app/admin/lang/zh-cn.php
- 切勿使用中文路径、空格路径、上层路径(如../lang/)或软链接,框架不识别
严格校验文件名格式
语言标识必须为小写字母+短横线(kebab-case),且全程小写。系统会将zh_CN、ZH-CN、zh等全部转为小写连字符再匹配,但原始文件名若不规范,加载直接失败。
- ✅ 正确:zh-cn.php、en-us.php、ja-jp.php
- ❌ 错误:zh_CN.php(下划线)、Zh-CN.php(大写)、zh.php(简写)、zh_cn.php
- 文件内不能有BOM头、不能有echo/var_dump、不能有空行或空格在
检查配置项lang_path是否被意外修改
虽然默认是app/lang/,但config/lang.php中可能被手动改过。如果项目里存在'lang_path' => app()->getAppPath() . 'language/'这类自定义配置,而你却把语言包仍放在app/lang/下,那自然找不到。
立即学习“PHP免费学习笔记(深入)”;
- 打开config/lang.php,搜索lang_path,确认值指向你实际放包的目录
- 若未设置该选项,就按默认路径走;若已设置,请确保语言包物理位置与之完全匹配
- 多应用时,各应用的lang_path可不同,需分别检查对应应用的config/lang.php
验证是否真被加载(快速定位静默失败)
框架不报错,只静默fallback。可用以下方式验证语言包是否真正载入:
- 在控制器中调用Lang::getLoaded(),返回数组为空说明没加载任何语言包
- 临时在zh-cn.php开头加file_put_contents('/tmp/lang_load.log', 'zh-cn loaded', FILE_APPEND);,看日志是否写入
- 用Lang::load('app/lang/zh-cn.php', 'zh-cn')手动加载测试,若成功说明路径本身可读,问题出在自动加载逻辑



















