必须完成配置开关、创建语言包、注册中间件、URL切换四环节:开启lang_switch_on并设default_lang和lang_list;在app/lang下建zh-cn/en-us目录及common.php;注册\think\middleware\Lang::class中间件;通过?lang=en-us切换语言。

要在ThinkPHP5项目中让同一套代码自动根据用户语言环境显示对应中文或英文界面,必须完成配置开关、创建语言包、注册中间件、URL切换这四个环节,缺一不可。
开启多语言开关并设定白名单
打开 config/app.php 文件,在 return 数组中添加或修改以下三项配置:
'lang_switch_on' => true,
'default_lang' => 'zh-cn',
立即学习“PHP免费学习笔记(深入)”;
'lang_list' => ['zh-cn', 'en-us'],
【lang_list必须是小写连字符格式,且值必须与后续语言包目录名完全一致】。如果写成 'zh_CN' 或 'EN-US',框架将无法加载对应语言包。
创建标准语言包目录结构
在项目根目录下新建 app/lang 目录;
在 app/lang 下分别创建 zh-cn 和 en-us 两个子目录;
在每个子目录中新建 common.php 文件;
zh-cn/common.php 内容示例:
return ['welcome' => '欢迎使用系统', 'logout' => '退出登录'];
en-us/common.php 内容示例:
return ['welcome' => 'Welcome to the system', 'logout' => 'Log out'];
注意:文件必须以 return [ ]; 形式返回关联数组,不能有 echo、print 等输出语句,也不能嵌套层级。
注册Lang中间件启用自动检测
打开 app/middleware.php 文件;
将 \think\middleware\Lang::class 添加到全局中间件数组中,例如:
return [
\think\middleware\Lang::class,
// 其他中间件
];
这一步确保每次请求开始时就完成语言识别和语言包加载,避免控制器中调用 lang() 时返回原始键名。
【禁止在控制器构造函数中重复调用 Lang::detect(),该操作已由中间件接管】。
在模板中输出多语言文本
方法一:使用 {$Think.lang.键名} 语法
例如:{$Think.lang.welcome} → 中文环境下显示“欢迎使用系统”,英文环境下显示“Welcome to the system”
方法二:使用助手函数 {:lang('键名')}
例如:{:lang('logout')} → 根据当前语言自动渲染
两种方式效果等价,但 {$Think.lang.xxx} 在模板中更简洁,{:lang()} 更适合带变量的动态场景。
通过URL参数切换当前语言
第一步:确认已在 app.php 中设置了 'var_language' => 'lang'(默认即为 lang);
第二步:访问地址末尾追加 ?lang=en-us 即可临时切换为英文;
第三步:浏览器会自动将该选择存入 Cookie,后续请求无需重复传参;
第四步:刷新页面后,所有 {:lang()} 和 {$Think.lang.xxx} 输出内容立即变为英文。



















