默认语言切换无效的核心原因是框架未识别所选语言,需检查loadlangpack中间件启用、语言包路径命名规范、语言侦测顺序与参数名匹配、模板输出方式四方面。

默认语言切换无效,核心原因是框架没真正“认出”你选的语言——不是配置漏了,就是路径、中间件、侦测顺序三者没对齐。重点查这四块。
必须启用LoadLangPack中间件
TP6 不自动加载语言包,不加这个中间件,后面全白搭。
- 打开 app/middleware.php,确保数组里有 'think\middleware\LoadLangPack'
- 多应用项目(如 admin、api)要各自在对应应用的 middleware.php 中添加,全局配置不生效
- 若同时用了 Session 和多语言,SessionInit 必须排在 LoadLangPack 前面,否则语言偏好读不到 Session
语言包路径和命名必须严格规范
ThinkPHP6 只认一种格式:小写字母 + 短横线 + .php,且路径固定,大小写敏感(Linux 下 zh_CN.php ≠ zh-cn.php)。
- 单应用:语言包放 app/lang/zh-cn.php、app/lang/en-us.php,不能是
zh_CN或zh - 每个文件开头不能有 BOM、空格、echo 或 var_dump,只允许 return [ ]; 形式返回数组
- 执行
dump(file_exists(app()->getLangPath() . 'zh-cn.php'))返回 false?说明路径拼错了,检查app()->getLangPath()输出的实际绝对路径
语言侦测顺序和参数名要匹配
系统按固定优先级找语言:GET → Cookie → Header → HTTP_ACCEPT_LANGUAGE。你传的参数名必须和 config/lang.php 里配的一致。
- 在 config/lang.php 中确认:
'detect_var' => 'lang'(对应 ?lang=zh-cn)
'cookie_var' => 'think_lang'(对应 Cookie: think_lang=zh-cn)
'header_var' => 'think-lang'(对应请求头 think-lang: zh-cn) - 前端跳转带参时别漏掉
?lang=zh-cn;设 Cookie 时 key 名必须是think_lang,值为小写短横线格式 - 用
dump(Lang::getLangSet())查当前加载的语言键集,为空说明根本没进语言包
模板中调用必须输出,且后缀得是 .php
语言函数返回的是字符串,不 echo 或 = 就不会显示;.html 模板也不走语言编译流程。
- 模板文件后缀必须是 .php(如 index.php),不是 .html
- 写法只能是:
<?php echo lang('welcome'); ?>或= lang('welcome') ?>
不能只写<?php lang('welcome'); ?>(没输出) - 首次调试建议在控制器里直接
dump(lang('welcome')),绕过模板环节,快速定位是语言包问题还是渲染问题
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











