Iris 不内置 i18n 路由切换,需开发者手动解析语言标识;应显式注册语言 Party 而非通配符路由,通过中间件统一提取并注入标准化语言码(如 zh-CN)至 ctx.Values(),再结合路径映射实现无损语言切换。

Iris 本身不内置 i18n 路由切换逻辑,它只提供路由匹配、上下文和中间件能力;多语言路由必须由开发者基于 Context、Params 或请求头(Accept-Language)手动解析并分发——这是最容易误以为“框架支持开箱即用”却踩坑的地方。
怎么从 URL 路径提取语言标识(如 /zh-CN/users)
Iris 的路由系统支持动态参数和正则约束,但语言前缀需显式声明,不能靠通配符自动捕获所有可能值。常见错误是写成 app.Get("/{lang}/{path:path}", ...),这会导致 lang 参数无法校验、后续路由冲突、静态文件 404 等问题。
- 正确做法是为每种支持的语言显式注册路由组,例如:
app.Party("/zh-CN").Get("/users", zhUserHandler)、app.Party("/en-US").Get("/users", enUserHandler) - 若语言数量较多,可用循环 + 映射表统一注册:
for lang, handler := range langHandlers { app.Party("/" + lang).ConfigureRouter(handler) } - 避免使用
{lang:string}这类宽泛参数,否则攻击者可构造/../../../etc/passwd类路径穿越(Iris 不自动 sanitize 路径参数)
如何在中间件中统一解析并注入语言上下文
把语言解析逻辑下沉到中间件,比在每个 handler 里重复判断更可靠。关键点在于:必须调用 ctx.Next() 让流程继续,且语言信息要存进 ctx.Values() 而非局部变量。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 优先检查 URL 路径前缀(如
/zh-CN/xxx),其次 fallback 到Accept-Language头,最后才是默认语言(如"en-US") - 解析出语言码后,建议标准化为 BCP 47 格式(
zh-CN、en-US),避免大小写混用导致语言包加载失败 - 存入上下文:
ctx.Values().Set("lang", langCode);后续 handler 中用ctx.Values().GetString("lang")获取 - 注意:不要在中间件里直接调用
ctx.JSON或ctx.Redirect,除非你明确想中断流程并终止后续 handler 执行
怎么让语言切换不影响当前路由逻辑(如保持 /users → /zh-CN/users)
用户点击语言切换按钮时,目标 URL 应该保留原始路径,仅替换语言前缀。Iris 没有内置的 url_for 或 i18n_path 辅助函数,必须自己实现路径映射。
- 最简方案:前端 JS 提取当前
window.location.pathname,用正则去掉首段语言前缀(如^\/[a-z]{2}-[A-Z]{2}\/),再拼接新语言前缀 - 服务端方案:在中间件中解析原始路径后,缓存无语言版路径(如
/users)到ctx.Values(),供模板或 JSON 接口生成跳转链接 - 切忌硬编码跳转地址,比如写死
ctx.Redirect(302, "/zh-CN"+ctx.Request().URL.Path)—— 这会把查询参数(?page=2)丢掉 - 如果用了
Party分组,注意Party的路径前缀会影响ctx.Request().URL.Path值,需用ctx.Path()获取完整匹配路径
真正难的不是解析语言,而是让语言状态贯穿整个请求生命周期:从路由匹配、模板渲染、静态资源路径、再到重定向生成,每个环节都得显式处理。Iris 的轻量设计意味着它不会替你做这些决策,但这也正是它性能高的原因——没有隐藏的 i18n 中间件拖慢每次请求。


















