ThinkPHP 7 语言切换依赖 CheckLangBehavior 行为,在 app_begin 阶段自动读取 URL 参数(如 ?lang=zh-cn)、Cookie(think_lang)或 Accept-Language 头来设置语言,需开启 lang_switch_on 并配置 detect_var;语言包路径为 application/lang/zh-cn.php,支持单文件结构,控制器调用 lang('login') 时若未设置语言则 fallback 到 default_lang 且不报错。

ThinkPHP 7 语言切换依赖行为检测链
ThinkPHP 7 的多语言机制围绕 CheckLangBehavior 行为展开,该行为在 app_begin 阶段触发,自动读取 URL 参数(如 ?lang=zh-cn)、Cookie(think_lang)或浏览器 Accept-Language 头来设置当前语言。
必须在 config/lang.php 中开启 'lang_switch_on' => true,并配置 'detect_var' => 'lang' 才能启用 URL 参数识别;若关闭,则只认 Cookie 或 header。
语言包路径默认为 application/lang/zh-cn.php,支持单文件结构,common.php 不是强制要求;可直接放 zh-cn.php,内容为 return ['login' => '登录'];。
控制器中调用 lang('login') 时,框架会按当前语言标识自动加载对应文件,但若语言尚未被 CheckLangBehavior 设置,就会 fallback 到 default_lang——【此时不会报错,但所有翻译都显示键名】。
立即学习“PHP免费学习笔记(深入)”;
PHP 8 对多语言运行环境的影响
PHP 8 本身不提供多语言功能,但它改变了 ThinkPHP 7 运行时的行为边界:DateTime 构造、字符串解析、数组遍历等底层操作更快更严格,间接影响语言包加载性能与错误反馈粒度。
例如,PHP 8 解析语言包 common.php 时,若文件开头含 BOM 或 echo 输出,会直接抛 ParseError;而 PHP 7 可能静默忽略并导致 lang() 返回空值。
PHP 8.5.5 版本对 opcache.jit 的强化不加速语言包 include,但提升后续模板中 {$Think.lang.login} 渲染速度约 12%——前提是语言已正确加载。
ThinkPHP 8 强制语言前置注入机制
ThinkPHP 8 彻底移除了 CheckLangBehavior,改由 think\middleware\Lang 中间件统一接管,且【语言标识必须在语言包加载前就通过 Lang::setLang() 设定】,否则验证提示、系统错误、模板默认文本全部锁定在初始语言。
第一步:打开 config/app.php,确认 'allow_url_lang' => false;若为 true,?lang=en-us 会绕过中间件逻辑,劫持整个语言上下文。
第二步:创建中间件 app/middleware/Lang.php,在 handle() 开头插入 $lang = $request->cookie('think_lang', 'zh-cn'); → \think\Lang::setLang($lang);。
第三步:语言包结构升级为两级目录 lang/zh-cn/common.php,不再接受 zh-cn.php 单文件;ZH-CN、zh_CN、Lang 目录名全无效,Linux 下大小写错误即静默失败。
第四步:插件语言必须独立注册中间件,不能复用主应用 Lang;插件内 cookie 键名需加 plugin_ 前缀,如 plugin_wechat_lang,否则切换会污染全站。



















