thinkphp多语言路由通过:lang变量捕获语言标识,配合正则校验、lang/目录下小写语言包、全局中间件动态设语言实现统一管理。需配置路由规则、规范语言包路径、注册lang中间件,并验证响应头、翻译效果及路由列表。

ThinkPHP 配置多语言路由规则,核心是用路由变量捕获语言标识(如 zh-CN、en-US),再结合语言包加载与请求前置处理,实现 URL 可读、逻辑可复用、安全有校验。不是靠写几十条重复路由,而是“一条规则覆盖所有语言”。
一、定义带语言变量的路由规则
在 route/app.php(单应用)或 app/{name}/route/app.php(多应用)中添加:
- 使用
:lang捕获语言码,并用__pattern__严格限制格式,防止路径遍历攻击:
- 支持更宽松匹配(如
zh、en)可改为:['lang' => '[a-z]{2}'] - 若需兼容根路径(如
/zh/dashboard和/dashboard默认中文),建议额外加一条无 lang 的路由,并在控制器里做 fallback
二、确保语言包目录结构正确
语言包必须放在项目根目录的 lang/ 下,按小写语言码建子目录:
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
-
lang/zh-cn/common.php→ 返回return ['login' => '登录']; -
lang/en-us/common.php→ 返回return ['login' => 'Login']; - 目录名必须全小写,
zh-CN或ZH-CN均不识别 - 不能放在
config/或app/下,也不能用 JSON/YAML
三、在中间件中动态设置语言环境
语言切换必须在任何 lang() 调用前完成,推荐在全局中间件中统一处理:
- 新建中间件
app\common\middleware\Lang.php - 在
handle()方法中读取:lang并设置:
- 务必注册该中间件到全局中间件队列(
app/middleware.php)或应用级分组 - 不要在控制器构造函数或
initialize()中设语言——此时翻译可能已触发
四、访问与验证要点
配置后验证是否生效,注意三个关键信号:
- 访问
/zh-cn/dashboard/login时,响应头应含X-Powered-By: ThinkPHP,说明请求进框架了 - 页面文字随 URL 中的
lang变化而变化,且lang('login')返回对应翻译 - 执行
php think route:list --with-route,确认该路由已出现在列表中 - 每次修改后运行
php think route:clear,避免缓存干扰
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










