thinkphp多语言包必须严格置于lang/{lang_code}/目录下,以php关联数组形式返回,文件名如common.php;键名需完全匹配调用字符串,不支持通配或路径解析;禁止bom、短标签及额外输出,否则静默失效。

语言包必须放在 lang/ 目录下,按语言代码分文件夹存放,且每个语言包文件必须返回一个 PHP 关联数组 —— 少一个环节,lang() 就会返回空字符串或原始键名。
lang/ 目录结构必须严格遵循 lang/{lang_code}/ 格式
ThinkPHP 不识别扁平结构(如 lang/zh-cn.php)或错位路径(如 application/lang.php)。只有以下结构才被自动加载:
lang/zh-cn/common.phplang/en-us/user.phplang/ja-jp/verify.php
注意:zh-cn 和 en-us 是标准语言代码,不能写成 zh_CN 或 english;大小写敏感,ZH-CN 会导致加载失败。
lang() 查找语言变量时依赖键名完全匹配
语言包中定义的键(key)就是调用时传入的字符串,不支持通配、前缀自动补全或嵌套路径解析。例如:
lang/zh-cn/common.php 返回: <pre class="brush:php;toolbar:false;">return ['user.login_title' => '用户登录', 'login_button' => '登录'];
那么:
lang('user.login_title') → 正确返回「用户登录」-
lang('login_title')→ 找不到,返回空或原字符串(取决于配置) -
lang('user/login_title')→ 斜杠不是分隔符,会被当作完整键名查找,找不到
建议统一用英文点号分隔(如 user.login),但框架本身不做任何解析,纯字符串匹配。
多语言文件必须是合法 PHP 文件,且末尾不能有输出
常见错误包括:
- 文件以
<?php开头,但结尾多了>或空白行后跟不可见字符(如 BOM) - 语言包里写了
echo、var_dump或调试语句 - 用了短标签
(PHP 8+ 默认禁用,导致解析失败)
正确写法只有一行有效内容:
return ['welcome' => '欢迎', 'submit' => '提交'];
任何额外字符都可能导致整个语言包加载失败,lang() 静默失效 —— 这个问题最难排查,因为无报错、无日志提示。
模块级语言包需配合中间件和路径约定
如果项目有多个模块(如 index、admin),想让各模块独立维护语言包,必须满足三个条件:
- 模块下存在
lang/{lang_code}/子目录(如app/index/lang/zh-cn/common.php) - 该模块的
middleware.php中注册了\think\middleware\LoadLangPack::class -
config/lang.php中未禁用扩展语言包('extend_list' => []留空或显式包含模块路径)
否则模块语言包不会被加载,即使路径存在也无效。模块语言包和应用级 lang/ 下的语言包是并行加载的,键名冲突时后者覆盖前者。
最易被忽略的是语言包文件的 PHP 语法合法性与 BOM 问题 —— 它不会报错,但会让整组翻译失效,且没有任何提示。编辑时务必用 UTF-8 无 BOM 编码保存,并禁用所有自动插入的注释或空行。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











