ThinkPHP多语言需确保语言包路径正确(lang/zh-cn/common.php)、格式规范(return数组)、配置完整(lang_switch_on、default_lang、lang_list等),并在中间件中尽早调用Lang::setLang(),避免切换失效。

在ThinkPHP中实现多语言,关键不是堆功能,而是让语言包“被看见”、语言设置“赶在翻译前”、切换逻辑“稳住不翻车”。配置本身简单,但任一环节出错(比如路径大小写、执行时机晚了半步),lang('submit') 就会原样返回 'submit',还不报错。
语言包必须放对位置、写对格式
框架只认一种结构:项目根目录下的 lang/ 文件夹,里面按标准小写语言码建子目录,每个子目录里必须有 common.php,且内容只能是 PHP 数组并以 return []; 结尾。
-
正确路径:
lang/zh-cn/common.php、lang/en-us/common.php -
错误示例:
app/lang/、lang/zh_CN/、lang/zh-cn.php、lang/zh-cn/index.php -
文件内容必须这样写:
return ['login' => '登录', 'welcome' => '欢迎'];,不能是 JSON、不能有 BOM、不能 echo 或输出任何东西 - Linux 服务器严格区分大小写,
zh-cn和ZH-CN是两个完全不同的语言标识
配置开关要开全、干扰项得关掉
仅设 'lang_switch_on' => true 不够,必须组合配置才能让切换真正生效。所有设置都在 config/app.php 中完成:
- 开启多语言:
'lang_switch_on' => true - 设默认语言:
'default_lang' => 'zh-cn' - 限定可选语言:
'lang_list' => ['zh-cn', 'en-us'](数组或逗号分隔字符串均可) - 若用域名或 Session 切换,务必关闭 URL 自动识别:
'allow_url_lang' => false,否则?lang=en-us会劫持你的逻辑
语言必须在请求最开始就设好
语言包在应用初始化阶段就已加载完毕。一旦错过这个窗口,后续调用 Lang::setLang() 只改标识,不重载文本——验证提示、系统错误、模板默认值都还是旧语言。
立即学习“PHP免费学习笔记(深入)”;
- 创建中间件
app/middleware/Lang.php - 在
handle()方法开头就读取用户偏好:$lang = $request->session('lang', 'zh-cn');(也可读 Cookie 或 Host) - 立即执行:
\think\Lang::setLang($lang); - 把该中间件加进
app/middleware.php的全局中间件数组里 - 切记:不能放在控制器
initialize()或操作方法里,那时已太晚
切换方式按需选,但要统一来源
常见切换方式有 Session、Cookie、子域名三种,选一种主路径,避免混用导致冲突:
-
Session 方式:前端点击后,后端写入
$request->session('lang', 'en-us'),中间件读取即可 -
Cookie 方式:TP 默认读
think_lang这个 Cookie 名,前端设时注意path=/和域名匹配 -
子域名方式:如
en.example.com→en-us,需在config/lang_domains.php中定义映射,并确保allow_url_lang关闭
不复杂但容易忽略



















