ThinkPHP 实现语言自动保存需启用 Cookie 存储:设置 'use_cookie' => true、'cookie_var' => 'think_lang',并配置白名单;用户切换语言时校验后调用 Lang::setLang() 并写入 Cookie;LoadLangPack 中间件按优先级自动加载对应语言包。

ThinkPHP 实现语言自动保存,核心是让用户选择的语言偏好在后续请求中持续生效,而不是每次都要重新传参或检测。这通常通过 Cookie 或 Session 实现,其中 Cookie 更常见、更轻量,也符合多语言自动侦测的默认设计逻辑。
启用 Cookie 保存语言设置
在 config/lang.php 中开启并配置 Cookie 相关选项:
-
开启 Cookie 存储:设置
'use_cookie' => true -
指定 Cookie 名称:如
'cookie_var' => 'think_lang'(可自定义,但需全局一致) -
确保允许语言白名单:配置
'allow_lang_list' => ['zh-cn', 'en-us'],防止非法值写入 Cookie
启用后,系统在自动侦测到有效语言(如通过 URL 参数 ?lang=en-us 或 HTTP Header)时,会自动把该语言码写入 Cookie,并在后续请求中优先读取该 Cookie 值来加载对应语言包。
手动切换语言并保存到 Cookie
当用户点击“切换为英文”等按钮时,你需主动设置语言并写入 Cookie:
立即学习“PHP免费学习笔记(深入)”;
- 获取用户选择的语言(如从 GET 参数或 AJAX 请求中):
$lang = input('lang', 'zh-cn'); - 校验是否在白名单内:
in_array($lang, config('lang.allow_lang_list')) - 设置当前请求语言:
\think\Lang::setLang($lang); - 写入 Cookie(注意有效期和路径):
cookie(config('lang.cookie_var'), $lang, 3600 * 24 * 30, '/', '', false, true);
这样下次访问时,LoadLangPack 中间件会自动从 Cookie 读取 think_lang 并加载对应语言包,无需额外代码。
配合中间件确保加载时机正确
语言包必须在任何 lang() 调用前加载,所以推荐使用官方中间件:
- 确认已注册
think\middleware\LoadLangPack到全局中间件(app/middleware.php) - 该中间件默认支持从 Cookie、GET 参数、HTTP Header 和 Accept-Language 自动识别,且按此顺序优先级处理
- 若需自定义逻辑(如优先读 Session),可在中间件中手动调用
\think\Lang::setLang($lang),但必须放在$next($request)之前
验证是否生效
最直接的验证方式是检查响应 Cookie 和语言输出:
- 浏览器开发者工具 → Application → Cookies,确认存在
think_lang且值为你设置的语言码 - 在控制器中调用
lang('hello'),看返回的是翻译值还是原 key;返回原 key 说明语言包未加载成功 - 临时加一行
dump(\think\Lang::getLangSet());查看当前生效的语言标识



















