ThinkPHP如何配置多语言_ThinkPHP国际化支持设置方法【说明】

梦宇酱_2617

梦宇酱_2617

2026-03-23

276人浏览

原创

thinkphp多语言配置须放lang/目录下,按小写语言码(如zh-cn)建子目录,内含common.php等返回数组的php文件;动态切换需在中间件中用lang::setlang()提前设置,lang()函数支持{name}占位符和item|items复数语法。

thinkphp如何配置多语言_thinkphp国际化支持设置方法【说明】

多语言配置文件放哪、叫什么名

ThinkPHP 的多语言配置必须放在 lang/ 目录下,按语言代码命名子目录,比如 zh-cn、en-us;每个子目录里放 PHP 返回数组的文件,固定叫 common.php(或你指定的分组名,如 user.php),不能是 JSON 或 YAML。

常见错误:把语言包放在 config/lang.php 里,或者用 zh_CN.php 这种大写命名——ThinkPHP 会直接忽略,不报错但也不生效。

  • lang/zh-cn/common.php 必须返回 return ['hello' => '你好'];
  • 语言目录名区分大小写,zh-CN ≠ zh-cn,Linux 服务器上尤其容易踩坑
  • 如果用模块化项目,语言包路径优先级是:模块 lang/ → 应用 lang/ → 框架默认

如何动态切换语言而不重启请求

ThinkPHP 不靠 Cookie 或 Session 自动识别语言,得手动设。核心是调用 Lang::setLang() 或在请求开始时用 Lang::detect() 主动探测。

典型场景:用户在个人设置里选了“English”,你得把选择存到 Session,然后在 app\common\middleware\Lang.php 中间件里读取并设置:

public function handle($request, \Closure $next)
{
    $lang = $request->session('lang', 'zh-cn');
    \think\Lang::setLang($lang);
    return $next($request);
}

注意:Lang::setLang() 必须在任何语言翻译调用前执行,比如 lang('hello') 之前;否则该次请求还是用默认语言。

  • 不要在控制器构造函数里调用 Lang::setLang(),因为中间件执行更早
  • Lang::detect() 默认只看 URL 参数 lang= 和浏览器 Accept-Language,不读 Session,得自己扩展
  • 切换后不会自动重载语言包,已加载的翻译项不会刷新,所以务必在请求最开始就设好

lang() 函数怎么传参、支持哪些语法

lang() 是核心翻译函数,不是模板标签,它在控制器、模型、中间件里都能用。支持占位符和复数,但语法很精简,不兼容 gettext 那套。

示例:lang('welcome_to_site', ['name' => 'Tom']) 对应语言包里 'welcome_to_site' => '欢迎来到 {name} 的站点';复数用竖线分隔:'item|items',传入数字 1 就取左边,其他取右边。

  • 占位符只认 {key} 格式,不支持 :key 或 %s
  • 如果 key 不存在,lang() 默认返回原 key 字符串(如 lang('missing') 返回 'missing'),不是空或异常,容易误以为生效了
  • 开启调试模式时,缺失 key 会在日志里记录,但线上默认静默,建议上线前跑一遍语言包完整性检查

多语言 + 路由绑定时 URL 怎么带语言标识

ThinkPHP 路由本身不感知语言,要实现 /zh-cn/user/login 这种路径,得靠路由变量 + 中间件配合,不能只靠 lang 参数。

在 route/route.php 里定义带语言前缀的路由组:

Route::group(['prefix' => '<lang>'], function () {
    Route::rule('user/login', 'user/login');
})->ext('html');</lang>

然后中间件里从 $request->param('lang') 提取值,校验是否在白名单(如 ['zh-cn','en-us']),再调用 Lang::setLang()。关键点:这个 lang 变量必须参与路由匹配,否则无法反解析 URL。

  • 别在路由规则里写死 zh-cn,否则生成 URL 时 url('user/login') 会丢掉语言前缀
  • url() 函数默认不携带当前语言参数,需手动传:url('user/login', ['lang' => app('lang')->getLangSet()])
  • 如果用了多应用模式,语言前缀可能和应用名冲突,建议统一用二级域名(如 en.example.com)更稳妥

语言切换本质是请求上下文的初始化时机问题,不是配几个文件就能跑通;最容易漏的是中间件执行顺序和 lang() 调用时机,这两处一错,整条链路就静默失效。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

2024.05.11

609

5

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

2025.12.18

604

18

ThinkPHP中间件机制与请求拦截处理实践
ThinkPHP中间件机制与请求拦截处理实践

本专题围绕 ThinkPHP 中间件体系展开,深入讲解中间件的定义、注册与执行流程。内容包括全局中间件与路由中间件的区别、请求前后处理逻辑、自定义中间件开发以及权限验证与日志处理应用。通过实际案例,帮助开发者掌握中间件在项目中的核心作用与最佳实践。

2026.03.31

418

17

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2035

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

2922

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

996

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3299

7

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.10

3721

7

thinkphp性能怎么样
thinkphp性能怎么样

thinkphp 是一款高性能的 php 框架,具备缓存机制、代码优化、并行处理和数据库优化等优势。官方性能测试显示,它每秒可处理超过 10,000 个请求,实际应用中被广泛用于京东商城、携程网等大型网站和企业系统。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.10

1260

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习