lang目录必须位于application/common/lang/下,仅识别zh-cn、en-us等小写连字符格式语言码;语言文件须以return数组结尾且无bom、空行或输出;url传参需用?l=en-us而非路径方式,模块级语言包会覆盖应用级同名键。

Lang 目录必须放在 application/common 下(TP5+)或 Common/Lang(TP3.x),不能放错位置,否则 L() 函数始终返回空字符串。
语言包目录结构必须严格按小写语言码命名
ThinkPHP 不识别 en、EN-US、en_US 这类写法。只认标准小写连字符格式:zh-cn、en-us、zh-tw。
常见错误是把文件夹建成了 En-us 或 EN-US,系统完全找不到——连日志都不会报错,只是静默失效。
-
application/common/lang/zh-cn.php✅ -
application/common/lang/en-us.php✅ -
application/common/lang/EN-US.php❌(大小写敏感) -
application/common/lang/en_us.php❌(下划线不被识别) -
application/common/lang/en.php❌(缺少地区码,TP5+ 不支持单语言码)
en-us.php 文件里必须返回数组,且不能有输出
语言包本质是 PHP 配置文件,执行后需返回一个关联数组。任何额外的 echo、print、BOM 头、空行或注释后换行,都会导致 include 失败,L('KEY') 返回 null。
- ✅ 正确写法(开头无空格/BOM,结尾无换行,仅 return):
return [
'LOGIN_TITLE' => 'Sign In',
'USER_NAME' => 'Username',
];
- ❌ 错误写法(含 UTF-8 BOM、末尾空行、var_dump):
<?php // 有 BOM return [...]; ?> // 文件末尾多了一行空行
路由中传参 lang=en-us 不会自动生效
TP 默认不从 URL 路径(如 /en/user/login)解析语言,而是依赖 VAR_LANGUAGE 配置项指定的 GET 参数名(默认是 l)。所以 /en/user/login 是无效的,除非你手动重写路由并调用 Lang::setLocale()。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- ✅ 有效切换方式:
?l=en-us(由CheckLangBehavior自动捕获) - ✅ 手动设置(中间件中):
Lang::setLocale('en-us') - ❌ 无效假设:
Route::rule('en/:controller/:action','{:controller}/index');不会触发语言切换 - ⚠️ 注意:
Lang::setLocale()必须在模板渲染前调用,否则视图里{\$Think.lang.KEY}仍为旧语言
模块级语言包优先级容易被忽略
ThinkPHP 按顺序加载三类语言包:系统级 → 应用级 → 模块级。模块级语言包路径取决于是否启用模块分组:
- 无分组项目(如
application/index/controller/Index.php):application/lang/zh-cn/index.php - 有分组项目(如
application/home/controller/User.php):application/lang/zh-cn/home.php - 模块级语言包中的键会覆盖应用级同名键,但不会覆盖系统级(框架内置)
- 如果同时存在
common.php和index.php,且都定义了'SUBMIT',则以index.php中的为准
最常踩的坑是:改了 common.php 却发现页面没变——其实是某个模块语言包里重复定义了同一 key,把它覆盖掉了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










