lang()返回原文是因为它只查找已加载语言包中的键值,不自动加载语言包;常见原因包括语言包未加载、路径错误、文件结构不符或未设置回退语言。

lang() 函数在 TP6 中返回原文而非翻译内容的常见原因
不是配置没生效,而是 lang() 助手函数本身不触发语言包加载逻辑 —— 它只做「键值查找」,且默认查的是当前语言分组下已加载进内存的语言变量。如果对应语言包根本没被载入,lang('hello') 就只能原样返回 'hello'。
多语言包未自动加载的典型场景
TP6 默认不会自动加载所有语言包,只按需加载。以下情况会导致 lang() 查不到翻译:
- 没调用
\think\facade\Lang::load()或没触发自动加载(比如没设置lang_set请求参数、没写lang中间件) - 语言包路径错误,例如把
zh-cn.php放在lang/zh-cn/下,但实际目录结构是lang/zh-cn.php(扁平结构) - 语言包文件中用了
return ['key' => 'value'],但顶层键名与语言标识不一致(如文件叫en-us.php,却写了return ['zh-cn' => [...]]) - 使用了
Lang::setLocale('en-us'),但没紧接着调用Lang::load(),导致语言包仍为默认缓存(通常是zh-cn)
快速验证和修复 lang() 输出原文的问题
先确认当前语言环境和加载状态:
// 在控制器或调试位置插入 dump(\think\facade\Lang::getLangSet()); // 看当前 locale 是什么 dump(\think\facade\Lang::get()); // 看已加载的语言变量数组(是否为空?) dump(file_exists(app()->getAppPath() . 'lang/zh-cn.php')); // 检查文件是否存在
修复建议:
立即学习“PHP免费学习笔记(深入)”;
- 确保语言包放在
app/lang/zh-cn.php(单应用)或app/index/lang/zh-cn.php(多应用),且文件直接return ['login' => '登录']; - 在中间件或
app/common.php中显式加载:\think\facade\Lang::load(app()->getAppPath() . 'lang/' . \think\facade\Lang::getLangSet() . '.php'); - 避免在语言包里嵌套数组层级;TP6 的
Lang::load()不会递归合并,只取顶层键值对 - 若用
.env设置APP_LANG=zh-cn,要确认Lang::setLocale(Env::get('app.lang', 'zh-cn'))已执行(通常由LangMiddleware完成)
lang() 和 Lang::get() 的行为差异容易被忽略
lang() 是助手函数,本质是 Lang::get($name, $default, $lang) 的封装,但它**不自动 fallback 到默认语言包**。如果当前 locale 是 en-us,而 en-us.php 里没定义 login,lang('login') 就返回原文;但 Lang::get('login', null, 'zh-cn') 可以手动指定回退语言。
真正稳定的写法是:显式控制加载时机 + 明确 fallback 路径,而不是依赖 lang() 的“智能”行为。尤其在 CLI 命令或异步任务中,lang() 极易失效 —— 因为那里根本没有请求上下文驱动语言切换。



















