TP6彻底重构多语言机制,移除Lang类、L()函数等TP5组件,需新建config/lang.php配置、改用lang/zh-cn/common.php分层路径、统一调用lang('key')或__('key'),并设'switch_on'=>true才能使?lang参数持久生效。

TP5 的多语言机制在 TP6 中已彻底重构,Lang 类、L() 函数、CheckLangBehavior 行为等全部移除,直接沿用旧配置会静默失效——不是报错,而是语言不切换、lang() 返回空字符串。
config/app.php 里 lang 相关配置全失效
TP5 中常见的 'LANG_SWITCH_ON' => true、'DEFAULT_LANG' => 'zh-cn' 等写法,在 TP6 的 config/app.php 中完全被忽略。TP6 不再从全局配置读取语言开关或语言列表。
- 必须改用
config/lang.php(需手动创建),内容格式为:return [ 'default_lang' => 'zh-cn', 'allow_lang_list' => ['zh-cn', 'en-us'], 'detect_var' => 'lang', // 对应 ?lang=en-us 'cookie_var' => 'think_lang', ]; -
lang_switch_on这类键名已不存在,开关逻辑由allow_lang_list非空隐式控制 - 若仍保留 TP5 风格的配置项,框架不会警告,但也不会加载任何语言包
语言包路径和加载方式变了
TP5 支持 lang/zh-cn.php 扁平结构,TP6 强制要求按目录分层,且只扫描 lang/{lang}/ 下的 PHP 文件,不再识别根目录下的单文件。
- 旧路径
lang/zh-cn.php必须改为lang/zh-cn/common.php(或其他模块名,如admin.php) - 每个语言包文件必须返回数组,例如:
return [ 'hello' => '你好', 'welcome' => '欢迎访问', ]; - TP6 默认只加载
common.php;如需加载admin.php,得显式调用lang('admin.title')或在控制器中用Lang::load(lang_path() . 'zh-cn/admin.php') - 路径拼接错误(比如漏掉
/common.php)会导致lang('hello')始终返回'hello'字面量
模板和控制器里调用方式不兼容
TP5 的 L('key') 和 {:L('key')} 在 TP6 中不可用,也没有自动别名。所有调用必须统一为 lang('key') 或 __('key'),且它们的行为有细微差别。
立即学习“PHP免费学习笔记(深入)”;
-
lang('key')是函数,支持多级键(如lang('menu.home')),但要求语言包是嵌套数组:return [ 'menu' => ['home' => '首页'] ]; -
__('key')是助手函数,只支持一级键,性能略高,但无法处理点号分隔 - 模板中不能写
{:L('key')},必须改用{:lang('key')}或{:__('key')} - 控制器中直接用
$this->assign('msg', lang('error'))即可,无需提前加载
自动检测逻辑被重写,URL 参数优先级变了
TP5 中 ?lang=en 会写入 Cookie 并持久化,TP6 默认仅做单次生效,不自动存 Cookie,除非你显式开启。
- 检测顺序固定为:
GET→POST→Cookie→Session→配置 default_lang - 要让
?lang=en持久生效,需在config/lang.php中加:'switch_on' => true,
否则参数只影响当前请求 -
detect_var默认是lang,但如果你用了?l=en,就得同步改这个值,否则不识别 - 中间件中切换语言必须调用
Lang::set('en-us'),不能再用session('think_lang', 'en-us')—— TP6 的 session 与语言状态已解耦
最易被忽略的是语言包路径层级和 switch_on 开关:没建 common.php,lang() 就永远回退到键名本身;不设 switch_on => true,?lang=xx 就只是“这次有效”,下次刷新就回到默认语言。



















