thinkphp语言包必须为返回数组的php文件,路径严格小写(如lang/zh-cn/common.php),任何大小写错误、语法错误或多余输出均导致静默失效,lang()直接返回原key。

语言包必须是 PHP 文件,返回数组,路径和命名严格区分大小写,否则完全不生效——ThinkPHP 不报错,只静默忽略。
lang/目录结构与文件命名规则
语言包必须放在 lang/ 目录下,按小写语言码建子目录,例如 lang/zh-cn/、lang/en-us/;不能是 zh_CN、ZH-CN 或 lang.php 这类命名。
-
lang/zh-cn/common.php是最常用路径,必须返回return ['hello' => '你好'];这样的数组 - 支持分组,比如
lang/zh-cn/user.php,调用时需指定分组:lang('login_fail', [], 'user') - Linux 服务器上
zh-cn和zh-CN是两个不同目录,后者会被跳过 - 不能把语言包放在
config/lang.php或app/lang.php—— ThinkPHP 只扫描lang/子目录
语言包内容必须是合法 PHP 数组,不能含语法错误或输出
每个语言文件本质是一个可执行的 PHP 脚本,但只能做一件事:返回一个纯键值数组。任何 echo、print_r、var_dump、BOM 头、多余空格或未闭合括号都会导致加载失败(静默失败,lang() 返回原 key)。
- 正确写法:
return ['welcome' => '欢迎', 'item|items' => '条目|条目们']; - 错误写法:
echo 'test'; return [...];或return [...]; exit; - 复数语法仅支持
|分隔,不支持 gettext 的ngettext形式 - 占位符只认
{name}格式,lang('hello', ['name' => 'Tom'])对应'hello' => '你好,{name}!'
为什么 lang() 返回原字符串?常见失效原因
lang('missing_key') 返回 'missing_key' 并不表示语言包没加载,而是 key 不存在或语言包根本没被读取——这是最易误判的点。
- 检查当前请求是否已执行
Lang::setLang('en-us'),且在lang()调用之前 - 确认
config/app.php中设置了'lang_switch_on' => true和'default_lang' => 'zh-cn' - 中间件中调用
Lang::setLang()时,传入值是否在'lang_list'配置范围内(如配置了['zh-cn'],却传'en') - 用
Lang::getLangSet()打印当前语言码,验证是否真的切换成功
真正麻烦的是路径大小写和文件执行环境——PHP 加载失败不抛异常,只让 lang() 退化为回显 key。调试时先确认 lang/zh-cn/common.php 能被 include 手动执行且无报错,再查框架加载逻辑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











