ThinkPHP 8.0 多语言支持关键在于语言标识须在加载语言包前确定,否则验证提示等仍为默认语言;需正确配置 lang_switch_on、default_lang、lang_list 和 allow_url_lang,并严格按小写短横线格式建立 lang/zh-cn/common.php 等语言包目录与文件。

ThinkPHP 8.0 实现多语言支持,关键不在“怎么调用 lang()”,而在于**语言标识必须在框架加载语言包之前就确定好**。否则表单验证提示、系统错误、模板默认文本等仍会显示初始语言,哪怕按钮文字切换成功了。
配置基础开关与语言列表
打开 config/app.php,确认以下几项已明确设置(注意类型和大小写):
-
开启语言切换:
'lang_switch_on' => true(必须是布尔值true,不能是字符串) -
设默认语言:
'default_lang' => 'zh-cn'(推荐小写短横线格式) -
声明可用语言:
'lang_list' => ['zh-cn', 'en-us', 'ja-jp'](所有语言码必须小写) -
禁用 URL 参数劫持:
'allow_url_lang' => false(不关它,?lang=en-us会覆盖 Cookie 或中间件设定)
严格按规范建语言包目录
在项目根目录新建 lang/ 文件夹,子目录名和文件名必须完全符合要求:
- 目录名全小写,如
lang/zh-cn/、lang/en-us/——ZH-CN、zh_CN、zh_CN都不会被识别 - 每个语言目录下只放 common.php(不能是
index.php、Common.php或其他名字) -
common.php返回关联数组,例如:return ['login' => '登录', 'submit' => '提交']; - Linux 服务器上大小写错误不会报错,只会静默失败——
lang('login')直接返回字符串'login'
前端切换语言的两种可靠方式
用户点击切换语言时,不能只改前端,必须让服务端提前感知到新语言:
立即学习“PHP免费学习笔记(深入)”;
-
写入 think_lang Cookie:前端发请求(如 POST /lang/set)后,后端调用
Lang::setLang('en-us')并设置 Cookie:cookie('think_lang', 'en-us', 3600); -
通过中间件预设语言:在全局中间件中读取用户偏好(如 Cookie、Header、数据库),调用
Lang::setLang($lang),且该中间件必须排在LoadLang之前 - 切记:不能靠
?lang=en-us切换,因为allow_url_lang必须为false



















