ThinkPHP语言包文件名不强制为common.php,但必须是PHP文件、返回数组、路径和命名严格匹配加载逻辑;可自定义如user.php,需显式加载或配置注册,且须满足全小写连字符目录名、无BOM、无额外输出等要求。

不是必须叫 common.php,但必须是 PHP 文件、返回数组、路径和命名要严格匹配框架加载逻辑。
语言包文件名可以自定义,但加载方式决定它是否生效
ThinkPHP 默认会尝试加载 common.php,但这只是约定,不是硬性要求。你完全可以使用 user.php、admin.php 或 error.php,前提是:
- 在调用 Lang::load() 时显式传入完整路径(如 Lang::load('lang/zh-cn/user.php'))
- 或在配置中通过 extend_list 注册该文件(例如 'zh-cn' => [app()->getBasePath() . 'lang/zh-cn/user.php'])
- 模块级语言包若按控制器名组织(如 lang/zh-cn/user.php),需确保控制器实际名为 User 且启用了模块化语言加载
为什么很多人误以为必须叫 common.php
因为框架默认加载行为只认这个文件名:
- LoadLangPack 中间件自动加载时,固定查找 lang/{lang}/common.php
- lang() 函数首次调用时,若未手动加载其他文件,也会 fallback 到 common.php
- 大多数文档示例、模板脚手架都用 common.php,久而久之成了事实标准
- 错误地改名后不报错,但翻译不生效——这是最坑的地方,静默失败
common.php 被忽略的常见原因
- 文件放在
config/lang.php里(应放lang/zh-cn/下) - 目录名写成
zh_CN或ZH-CN(必须全小写、连字符,Linux 区分大小写) - 文件带 BOM 头(PHP 解析失败,返回空数组或报错)
- 文件末尾有额外输出(如空行、空格),导致 header 已发送,后续语言加载异常
- 返回的不是纯数组,比如加了
echo、var_dump或注释外的文本
真正不能省的是这三点
无论你叫它 common.php 还是 ui.php:
- 它必须是 PHP 文件(不能是 JSON/YAML)
- 必须以 return [...]; 结尾,不能用 echo json_encode(...)
- 所在路径必须符合框架搜索顺序:模块/lang/{lang}/xxx.php → app/lang/{lang}/xxx.php → thinkphp/lang/{lang}/xxx.php



















