ThinkPHP语言侦测按URL参数、Cookie、Accept-Language头、Session、默认配置五级优先顺序执行,结果存于请求上下文,须用Lang::getLangSet()获取。

ThinkPHP 的语言侦测不是单一步骤,而是一套按优先级逐层尝试的流程。它会在请求初始化阶段自动执行,不依赖路由匹配,目的是尽早确定当前请求应使用的语言包。
语言检测顺序(从高到低)
URL 参数(如
?lang=zh-cn)
框架首先检查$_GET中是否包含配置项lang_detect_var指定的变量名(默认是lang)。该值必须在config/lang.php的allow_lang_list(或lang_list)中才被接受,否则忽略。Cookie 中的语言标识
若 URL 未提供有效语言,框架读取名为think_lang的 Cookie(可配置为其他名)。同样需在允许列表内才生效。HTTP 请求头
Accept-Language
解析浏览器发送的Accept-Language头(例如zh-CN,zh;q=0.9,en-US;q=0.8),取第一个语言标签(如zh-CN),标准化为小写并补全地区码(zh-cn),再比对允许列表。Session 中缓存的语言
如果前几项都未命中,且启用了 session,框架会尝试从 session 中读取之前保存的语言设置(键名默认为think_lang)。配置文件中设定的默认语言
最终 fallback 到config/lang.php中的default_lang值(如'zh-cn'),这是兜底选项。
关键细节说明
- 所有检测结果都会写入当前请求上下文,并通过
Lang::getLangSet()获取,不要用input('lang')或Request::get('lang')判断,因为它们可能已被覆盖或根本没触发检测。 - 伪静态 URL(如
/en-us/article/123)中若未显式保留 query string,lang=参数会被丢失,此时需改用路由变量方式传递并手动设置语言。 - 自动检测(
Lang::detect())会按上述顺序执行一次,但仅在未显式调用Lang::range()或未命中任何前置来源时才触发。
配置要点
立即学习“PHP免费学习笔记(深入)”;
- 确保
lang_switch_on => true -
lang_list必须包含所有支持的语言标识(如['zh-cn', 'en-us', 'ja-jp']) -
default_lang应设为其中之一 -
lang_detect_var可自定义,但要与前端传参一致
不复杂但容易忽略。



















