语言包文件必须为无bom的utf-8编码且以return [开头,否则lang()返回键名而非翻译内容;需用vs code等工具确认编码、用file/xxd命令验证、禁用记事本编辑、删除所有前置输出与php标签。

语言包文件编码错误会导致 lang() 返回键名本身(如 'welcome'),而不是对应翻译内容,常见于 Windows 编辑器保存为 GBK/BOM UTF-8、或上传后文件编码被破坏的场景。
语言包文件必须是无 BOM 的 UTF-8
ThinkPHP6 加载语言包时不做编码转换,直接 include 或 require,若文件含 UTF-8 BOM(字节序标记)或实际为 GBK 编码,PHP 解析会失败,导致返回空数组或解析报错(如 Parse error: syntax error, unexpected 'return')。
- 用 VS Code / Sublime Text 打开
app/lang/zh-cn.php,右下角确认编码显示为 UTF-8(无 BOM),不是 UTF-8 with BOM 或 GBK - 在终端执行:
file -i app/lang/zh-cn.php,输出应含charset=utf-8;若为charset=iso-8859-1或charset=gbk,说明编码已损坏 - 用
xxd app/lang/zh-cn.php | head -n1检查开头三字节:正常 UTF-8 无 BOM 应以72 65 74(即ret)开头;若为ef bb bf,就是带 BOM,需另存为无 BOM UTF-8 - Windows 记事本默认保存为 GBK 或带 BOM UTF-8,严禁用它编辑语言包
文件开头不能有任何输出
语言包文件必须严格以 return [ 开头,前面不能有空格、空行、<?php 标签、echo、dump() 或任何注释——哪怕一个 UTF-8 不可见字符(如零宽空格)也会让 include 失败,最终 Lang::load() 返回 false。
- 打开文件,把光标移到最开头,按 ← 方向键确认无隐藏字符;用十六进制编辑器检查首字节是否为
72(r) - 删除所有
<?php——ThinkPHP 语言包约定不写标签,只写return [ ... ]; - 禁止在语言包里调用函数、读配置、拼接字符串,只允许纯数组字面量
- 验证方式:在控制器中临时加一行
var_dump(include app()->getAppPath() . 'lang/zh-cn.php');,应直接输出数组;若报错或输出int(1),说明文件未被正确解析
多应用模式下路径与编码需双重校验
多应用项目(如 app/admin/ 和 app/api/)中,每个应用的语言包路径独立,且都必须满足无 BOM UTF-8 要求。即使主应用语言包正常,app/admin/lang/zh-cn.php 编码出错也会导致后台界面全显键名。
- 确认当前请求命中的是哪个应用:查看 URL 路由、
$this->app->getName()或日志中的应用名 - 对应检查该应用下的语言包路径,例如 admin 应用需检查
app/admin/lang/zh-cn.php,而非app/lang/zh-cn.php - 不同应用的语言包可复用,但必须分别保存为无 BOM UTF-8;不能直接复制粘贴,需用编辑器另存
- 如果使用软链接或部署脚本同步语言包,确保同步过程不改变文件编码(如
rsync默认保留编码,但某些 FTP 工具会强制转码)
最容易被忽略的是:BOM 错误不会在浏览器里报 PHP 错误,只会静默让 lang('xxx') 返回 'xxx';而文件开头多一个空格,Lang::load() 就返回 false,但框架不抛异常,也不记录日志——你得手动 var_dump() 加载结果才能发现。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











