lang_switch_on必须设为true,否则多语言机制不启动;app.php中需同时配置lang_switch_on、default_lang和lang_list三项;语言包路径为lang/zh-cn/等小写短横线命名;切换语言须在中间件早期调用lang::setlang()和lang::load()。

lang_switch_on 必须设为 true,否则整个多语言机制不会启动——这不是可选配置,是开关。
app.php 中必须启用的三项配置
ThinkPHP 6.x(及主流 5.1+ LTS 版本)只认 config/app.php 里的语言相关键,其他位置(如 config.php 或单独的 lang.php)无效或被忽略。
以下三项必须同时存在且写对:
-
'lang_switch_on' => true:硬性开关,缺则无语言切换逻辑 -
'default_lang' => 'zh-cn':值必须是小写、短横线分隔(zh-cn,不是zh_CN或ZH-CN) -
'lang_list' => ['zh-cn', 'en-us']:明确列出允许切换的语言码,未在此数组中的语言即使有文件也不会被加载
常见错误:'lang_list' => 'zh-cn,en-us'(字符串而非数组)会导致 Lang::detect() 解析失败,静默回退到 default_lang,不报错但切不动。
语言包路径和文件名必须严格匹配
ThinkPHP 不支持 JSON/YAML,只读取 PHP 返回数组的文件;且路径结构不能错。
- 根目录下建
lang/(不是language/、langpack/或config/lang/) - 子目录名必须全小写 + 短横线,例如:
lang/zh-cn/、lang/en-us/——lang/zh_CN/在 Linux 服务器上完全失效 - 每个子目录里至少有一个
common.php(默认分组),内容必须是return ['key' => 'value'];,末尾不能漏分号,不能 echo 或 exit
示例:lang/zh-cn/common.php 正确内容:
return [
'hello' => '你好',
'submit' => '提交'
];
如果想用自定义分组(比如 user.php),调用时得写 lang('submit', 'user'),否则默认只加载 common.php。
切换语言必须在请求早期完成
Lang::setLang() 不能在控制器方法末尾或模板里调用——此时语言包已加载完毕,再设只是改了当前会话的 lang 值,不影响本次响应。
- 推荐放在全局中间件中,例如
app/middleware/LangSwitchMiddleware.php - 中间件内优先级顺序应为:
GET 参数(?lang=en-us)→ Cookie(think_language)→ Session → default_lang - 设置后必须立即调用
Lang::load()手动重载语言包,否则仍显示旧语言内容
错误写法(控制器中):
public function index()
{
Lang::setLang('en-us'); // ❌ 太晚,common.php 已加载
return view();
}
正确写法(中间件中):
public function handle($request, \Closure $next)
{
$lang = $request->param('lang', cookie('think_language', config('default_lang')));
Lang::setLang($lang);
Lang::load(); // ✅ 强制重载对应语言包
return $next($request);
}
lang() 函数的占位符和复数语法容易被忽略
lang() 支持动态填充和简单复数,但需语言包配合,否则原样输出占位符。
- 占位符写法:
lang('welcome_to', ['name' => 'Tom']),对应语言包中'welcome_to' => '欢迎 {name} 来到站点' - 复数语法:
lang('item|items', 1)输出item,lang('item|items', 5)输出items,前提是语言包里写成'item|items' => ['item', 'items'](数组形式) - 别直接拼接字符串:
__('Hello ' . $name)会破坏翻译上下文,应统一用占位符
最易踩的坑:语言包里写了 'item|items' => 'item/items'(字符串),但 lang() 只识别数组格式,结果永远返回第一个字。
lang_switch_on 是闸门,lang/ 目录结构是地基,中间件时机是命脉——三者任一出错,现象都是“看起来配好了,但页面文字就是不换”。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











