根本原因是多应用下语言配置完全独立,每个应用必须单独配置lang.php、loadlangpack中间件及app/应用名/lang/语言包路径,否则语言包不加载。

多应用下语言包不生效,根本原因不是语言包写错了,而是每个应用的语言配置完全独立,且默认不会继承根目录的 lang.php 设置——你改了根目录的 config/lang.php,对 app/admin 或 app/api 一点作用都没有。
每个应用必须有自己的 lang.php 配置文件
ThinkPHP6 多应用模式中,语言配置不走“继承”,只走“就近加载”。框架在解析请求时,会先尝试加载当前应用目录下的 config/lang.php,找不到才 fallback 到根目录。但这个 fallback 仅限于配置项(如 default_lang),不包括语言包路径、中间件开关等关键项。
- 检查
app/admin/config/lang.php是否存在;若不存在,复制根目录的config/lang.php过去,并确保其中'default_lang' => 'zh-cn'和'allow_lang_list' => ['zh-cn', 'en-us']已按需修改 - 确认
app/admin/config/lang.php中的'lang_path'指向的是app/admin/lang/,而非app/lang/(否则语言包仍从全局路径加载) - 若该文件存在但内容为空或被注释,框架会静默使用默认值(
zh-cn+app/lang/),导致你改了app/admin/lang/en-us.php却始终不生效
LoadLangPack 中间件必须在应用级启用
根目录的 app/middleware.php 启用的 LoadLangPack 只作用于默认应用(index),其他子应用的中间件栈是独立的,必须各自声明。
- 在
app/admin/middleware.php中添加'think\middleware\LoadLangPack',而不是只依赖根目录配置 - 若子应用没有
middleware.php文件,需手动创建,内容为:return ['think\middleware\LoadLangPack']; - 不要在子应用的
config/app.php中设置'middleware'数组——TP6 不识别该写法,中间件只认middleware.php文件
语言包路径必须与应用名严格匹配
多应用下语言包路径不是 app/lang/zh-cn.php,而是 app/{app_name}/lang/zh-cn.php。哪怕你只打算让 admin 应用支持多语言,也必须把语言文件放在 app/admin/lang/ 下,否则 lang('title') 在 admin 控制器里永远返回键名。
- 删除
app/lang/zh-cn.php(它只对index应用有效) - 新建
app/admin/lang/zh-cn.php和app/admin/lang/en-us.php,两个文件都必须以return [ ... ];开头,无 BOM、无空行、无输出 - 检查
app/admin/lang/目录权限是否允许 PHP 读取(常见坑:FTP 上传后权限变成 600) - 调用时保持一致:
lang('welcome')在app/admin/controller/Index.php中,才会去查app/admin/lang/下对应语言文件
GET 参数 lang 切换在多应用下要带前缀
你访问 /admin?lang=en-us 时,框架会把 lang 当作全局参数处理,但实际语言侦测逻辑是在应用初始化阶段完成的——此时请求还没进入 admin 应用上下文,lang 参数可能被忽略或误判。
- 正确做法是把语言参数绑定到应用路由上:访问
/admin/index/index?lang=en-us,确保 URL 中包含完整应用+控制器+操作路径 - 更可靠的方式是改用 Cookie 或 Header:前端在请求
/admin/xxx时带上think-lang: en-us请求头,前提是app/admin/config/lang.php中已设'header_var' => 'think-lang'且'use_header' => true - 如果用了域名绑定(如
admin.example.com),则lang参数在该域名下才有效;跨域名切换语言需同步 Cookie 域名或改用 JWT 存储语言偏好
最容易被忽略的一点:多应用语言隔离不是“开个开关就自动分治”,而是每个应用都得当成一个全新项目来配一遍 lang.php、中间件、语言包路径和侦测参数——少一个环节,lang() 就退化成回声函数,只返回键名。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











