首页调用多语言需满足三条件:语言环境就绪、语言包加载、lang()调用时机正确;常见失败因LoadLangPack中间件未启用或配置错误、语言包路径/命名/格式不合规、locale未提前设置且未reload。

首页能调用多语言内容,前提是语言环境已就绪、语言包已加载、lang() 调用发生在正确时机——三者缺一不可。直接在控制器或模板里写 lang('welcome') 却返回键名,90% 是语言包根本没加载进来,不是函数写错了。
确认 LoadLangPack 中间件已在首页所属应用中启用
首页属于哪个应用?比如是 app/index/ 下的控制器,那就要检查 app/index/middleware.php 是否存在且包含 think\middleware\LoadLangPack::class。根目录 app/middleware.php 的配置对子应用无效。
- 若
app/index/middleware.php为空或不存在,手动创建并填入:return [think\middleware\LoadLangPack::class];
- 确保该文件中没有其他中间件(如
SessionInit)放在LoadLangPack之后——它必须是首批执行的中间件之一,否则Lang::getLang()可能读不到 cookie 或参数 - 别把
think\middleware\Lang和LoadLangPack混用;前者只做侦测,后者才真正加载语言包
验证语言包路径与格式是否严格合规
首页用的是 index 应用,框架默认只扫描 app/index/lang/zh-cn.php(注意不是 app/lang/zh-cn.php)。路径错、命名错、格式错,都会导致静默失败。
- 文件必须位于
app/index/lang/zh-cn.php,命名必须小写+短横线:zh-cn,不能是zh_CN、ZH-CN或zh.php - 文件内容必须以
return [];开头,不能有 BOM、空格、echo、var_dump或注释;Linux 服务器上大小写敏感,本地测试通过不等于线上可用 - 若想复用公共语言项,可在
app/index/lang/zh-cn.php中写:return array_merge(require APP_PATH . 'lang/zh-cn.php', ['home_title' => '首页']);
确保 lang() 调用前语言环境已设置
lang('welcome') 不会自动探测语言——它只查当前已激活的语言包。如果没提前设好 locale,哪怕语言包存在也查不到。
立即学习“PHP免费学习笔记(深入)”;
- 不要在控制器
__construct()里调Lang::setLang(),此时中间件已执行完毕,语言环境已固化 - 切换语言时,必须校验白名单:
in_array($lang, config('lang.allow_lang_list')),否则非法值会被静默重置为default_lang - 设完 locale 后立即 reload:
Lang::load();,否则已缓存的翻译不会更新 - 调试建议:在首页控制器方法开头加
dump(Lang::isLoaded());,返回false就说明加载链断了
最易被忽略的是:多应用模式下,app/config/lang.php 对首页(index 应用)完全无效,必须在 app/index/config/lang.php 中单独配置 default_lang 和 allow_lang_list。漏掉这个,?lang=en-us 在首页永远不生效。



















