ThinkPHP多语言支持是模板层和提示文案的静态翻译机制,依赖严格规范的语言包文件、中间件加载、固定侦测顺序及lang()函数调用规则,不处理数据库或动态数据翻译。

ThinkPHP 的多语言支持本质是模板层和提示文案的静态翻译机制,不处理数据库内容、用户输入或动态数据的翻译。它依赖语言包文件(PHP 数组)、明确的加载时机和严格的路径/命名规范,配置稍有偏差就容易失效——不是报错,而是静默回退到键名。
语言包路径与文件结构必须精准
ThinkPHP 对语言包位置极其敏感,大小写、分隔符、目录层级缺一不可:
- 单应用项目:语言包统一放在 app/lang/zh-cn.php、app/lang/en-us.php,不能是
zh_CN.php、lang/zh-cn/common.php或config/lang.php - 文件必须以
return ['key' => 'value'];形式返回纯数组,开头不能有 BOM、空格、echo或注释 - 多应用模式下,路径为
app/应用名/lang/zh-cn.php,各应用语言包相互隔离 - Linux 服务器严格区分大小写,
zh-cn≠ZH-CN,部署时务必检查
启用与加载必须靠中间件驱动
ThinkPHP 6+ 不再靠行为(Behavior)或 tags.php,而是依赖中间件自动加载语言包:
- 在
app/middleware.php中添加'think\middleware\LoadLangPack' - 确保
config/lang.php中配置了'default_lang' => 'zh-cn'和'allow_lang_list' => ['zh-cn', 'en-us'] - 所有翻译调用(如
lang('welcome')或Lang::get('error'))必须发生在中间件执行之后——因此不能在控制器构造函数中设语言,应在中间件里提前调用Lang::setLang($lang)
语言侦测优先级固定,切换需主动控制
系统按固定顺序判断当前语言:GET 参数 → Cookie → 请求头 → 浏览器 Accept-Language,无法更改顺序,但可开关各渠道:
- 通过 URL 切换:设置
'detect_var' => 'lang',访问?lang=en-us即生效 - 通过请求头切换:设置
'header_var' => 'think-lang',前端发think-lang: zh-tw - 若想读取 Session 中保存的用户偏好,需自定义中间件,在
Lang::setLang()前从 Session 取值并设置 -
Lang::detect()默认不读 Session,只看 GET、Cookie 和 Header,这点常被忽略
翻译调用与占位符使用要点
核心函数 lang() 支持基本变量替换和简单复数,但语法有限:
- 占位符只认
{name}格式,不支持:name、%s或双大括号 - 复数用竖线分隔:
'item|items',传入数字1时取左边,其他值取右边 - 键不存在时默认返回原 key 字符串(如
lang('missing')输出missing),调试模式下会提示缺失,生产环境易误判为“已生效” - 错误码、提示语等必须全部解耦为语言键,禁止硬编码字符串,否则切换语言后这部分内容不会变化
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











