ThinkPHP 6 不支持在 .env 中直接设置默认语言,必须在 config/app.php 中配置 'default_lang' 和 'lang_switch_on';若需从 .env 读取,须手动用 env() 获取并赋值,且需确保中间件 think\middleware\LangDetect 正确注册和执行顺序。

ThinkPHP 6 的 .env 文件里不能直接设默认语言
ThinkPHP 6 不支持在 .env 中用类似 APP_LANG=zh-cn 这种方式启用多语言或切换默认语言。框架本身没预留这个配置项,.env 里写上也不会被自动读取生效。
config/app.php 才是控制默认语言的正确位置
TP6 的语言包加载逻辑由 app.lang_switch_on 和 app.default_lang 控制,这两个必须在 PHP 配置文件中显式定义:
-
app.lang_switch_on设为true才会启用语言检测与切换 -
app.default_lang指定初始语言标识,比如'zh-cn'或'en-us' - 语言包目录需按规范放在
lang/zh-cn/、lang/en-us/下,且含common.php等翻译文件
示例(config/app.php):
'default_lang' => 'zh-cn', 'lang_switch_on' => true,
想从 .env 动态控制?得手动读取并覆盖
如果确实需要把语言配置抽到 .env,必须自己在 config/app.php 中读取并注入,不能依赖框架自动绑定:
- 在
config/app.php开头加$lang = env('APP_LANG', 'zh-cn'); - 然后把
'default_lang' => $lang替换原值 - 确保
think\Env已加载(TP6 默认已加载,无需额外引入) - 注意:环境变量值不会自动转小写,
EN-US和en-us在语言包路径上不等价,建议统一用小写
错误写法:default_lang => env('APP_LANG')(没设默认值,env 返回 null 会导致语言加载失败)
语言切换后 Cookie 或 Session 不生效?检查中间件顺序
TP6 多语言依赖 think\middleware\LangDetect 中间件,它必须在路由和控制器执行前运行:
- 确认该中间件已注册在
app/middleware.php的全局中间件列表中 - 位置不能太靠后,否则
$this->request->lang()可能拿不到正确值 - 若使用了自定义语言检测逻辑(如从 URL 参数或 Header),需确保中间件里调用了
Lang::setLangSet($lang) - Cookie 存储语言标识时,键名默认是
think_lang,不要跟其他系统冲突
容易忽略的一点:LangDetect 默认只检查 Cookie 和 Session,不检查 GET 参数,要支持 ?lang=en-us 得重写中间件或手动调用 Lang::detect()。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











