在thinkphp 8.0中实现多语言切换,必须在语言包加载前通过中间件调用lang::setlang()设语言,且allow_url_lang必须为false;语言包需严格按小写目录名+common.php命名;前端切换须写think_lang cookie或调用接口。

在 ThinkPHP 8.0 中实现多语言切换,必须让语言标识在语言包加载前就生效,否则验证提示、模板默认文本、系统错误等全部维持初始语言——哪怕你点按钮后 lang('submit') 显示对了,表单报错仍弹中文。
配置语言开关与基础参数
打开 config/app.php,确认以下三项已明确设置:
将 'lang_switch_on' => true;【lang_switch_on 必须为布尔 true,不能是字符串 'true'】
设置 'default_lang' => 'zh-cn';
声明 'lang_list' => ['zh-cn', 'en-us', 'ja-jp'];
关键一步:设 'allow_url_lang' => false;【不关它,?lang=en-us 会劫持你的域名或 Cookie 切换逻辑】
创建标准语言包结构
在项目根目录下新建 lang/ 文件夹,严格按小写语言码建子目录:
lang/zh-cn/common.php → 内容必须是 return ['login' => '登录', 'submit' => '提交'];
lang/en-us/common.php → return ['login' => 'Login', 'submit' => 'Submit'];
lang/ja-jp/common.php → return ['login' => 'ログイン', 'submit' => '送信'];
注意:文件名必须是 common.php,不能是 index.php 或 Common.php;目录名必须全小写,ZH-CN 和 zh_CN 都不会被加载;Linux 服务器上大小写错误会导致静默失败——lang('login') 直接返回 'login' 字符串,不报错也不警告。
编写语言切换中间件
执行命令行创建中间件:php think make:middleware Lang,生成 app/middleware/Lang.php。
编辑该文件,在 handle() 方法开头插入以下逻辑:
第一步:解析 Host 去除端口干扰 —— $host = parse_url($_SERVER['HTTP_HOST'], PHP_URL_HOST) ?: $_SERVER['HTTP_HOST'];
第二步:读取用户首选语言 —— $lang = $request->cookie('think_lang', $request->session('lang', 'zh-cn'));
第三步:根据域名映射覆盖(可选)—— 若 config/lang_domains.php 存在且含 ['en.example.com' => 'en-us'],则 $lang = $domains[$host] ?? $lang;
第四步:立即生效 —— \think\Lang::setLang($lang);
第五步:确保中间件注册顺序 —— 将 \app\middleware\Lang::class 加入 app/middleware.php 的全局中间件数组,位置必须在 SessionInit 之后、路由调度之前。
前端触发语言切换
方法一:纯前端写 Cookie(需严格匹配键名与路径)
document.cookie = "think_lang=en-us; path=/; max-age=31536000";
方法二:调用后端接口(推荐,避免键名/路径/域出错)
fetch('/api/setlang?lang=ja-jp', { method: 'POST' });
后端接口内只需一行:cookie('think_lang', $request->param('lang'), ['expire' => 31536000, 'path' => '/']);
注意:Lang 中间件只认 cookie('think_lang'),设成 lang 或 language 完全无效;中间件读取是一次性的,请求进来后改 $_COOKIE 数组无用。
模板与代码中使用翻译
模板里直接写 {:lang('login')} 或 {__('submit')};
控制器中用 lang('welcome') 或 __('hello');
验证规则错误信息自动跟随当前语言,前提是语言已在中间件开头设好;
若验证提示仍是中文,请立刻检查中间件是否注册、是否在 handle() 开头调用 setLang()、以及 allow_url_lang 是否为 false。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











