lang()在模板中需确保语言包已加载且语言切换生效,否则返回原始key;常见失效原因包括路径错误、大小写不符、未启用多语言开关、语言包未正确返回数组、模板调用早于语言设置。

lang() 函数在前台模板里能直接用,但必须确保语言包已加载、语言切换逻辑已生效——否则返回的永远是原始 key 字符串,比如 lang('hello') 输出 hello,而不是“你好”或“Hello”。
lang() 在模板里不生效的常见原因
- 语言包路径放错:必须是
lang/zh-cn/common.php,不是config/lang.php或lang/zh_CN.php - 目录名大小写错误:
zh-CN≠zh-cn,Linux 服务器上直接失效,且无报错 - 没启用多语言开关:
'lang_switch_on' => true必须在config/app.php中显式配置 - 语言包文件没返回数组:
lang/zh-cn/common.php必须以return ['hello' => '你好'];开头,不能是echo、print或空文件 - 模板中调用早于语言设置:比如在中间件里用
Lang::setLang(),但模板渲染时该中间件还没执行(典型于某些自定义模板引擎或前置输出场景)
前台 URL 切换语言怎么配伪静态
ThinkPHP 默认支持 ?lang=en-us 这种 GET 参数切换,但要伪静态成 /en-us/index,得配合路由和语言中间件:
- 先在
config/app.php中设好:'default_lang' => 'zh-cn'、'lang_switch_on' => true - 路由定义里加变量捕获:
Route::get(':lang/<name?>', 'index/index')->pattern(['lang' => '[a-z]{2}-[a-z]{2}']); - 中间件里读取
:lang并设语言:Lang::setLang($request->param('lang', $request->session('lang', 'zh-cn'))); - 注意:伪静态路径中的语言码必须在
allow_lang_list配置里,否则会被忽略回退到默认语言
不推荐把语言码硬编码进每个路由规则,而是统一在中间件里处理,避免漏配或冲突。
lang() 在模板里怎么传参和写复数
lang() 是函数,不是标签,模板里直接写就行,支持两种常用扩展语法:
立即学习“PHP免费学习笔记(深入)”;
- 占位符只认
{key}格式:lang('welcome_to_site', ['name' => 'Tom'])→ 语言包中对应'welcome_to_site' => '欢迎来到 {name} 的站点' - 复数用竖线分隔:
lang('item|items', 1)返回左边,lang('item|items', 5)返回右边;语言包里写成'item|items' => '条|条'或'item|items' => 'item|items' - 键不存在时静默返回原字符串,线上环境不会报错也不会提示——建议上线前跑一次脚本比对所有
lang()调用和语言包 keys 是否全覆盖
别用 :name 或 %s,ThinkPHP 不识别。
语言包加载时机很关键:它发生在请求生命周期早期,一旦加载完成就不会重载。所以中间件里 Lang::setLang() 必须在任何 lang() 调用之前执行,包括模板自动渲染阶段。这点容易被忽略,尤其在使用自定义视图组件或提前 echo 的场景下。



















