Iris 不内置国际化支持,需自行集成 go-i18n/v2 等第三方库;应通过中间件解析语言标识并挂载 Localizer 到上下文,模板中调用 .Localizer.Tr 翻译,静态资源需按语言路径手动配置或动态服务处理。

Iris 框架本身**不内置国际化(i18n)支持**,也没有像 gin-i18n 或 echo-i18n 那样的官方配套 i18n 中间件。想在 Iris 项目中实现多语言,必须自行集成第三方库或手写轻量方案——这是最常被忽略的前提。
为什么 Iris 没有开箱即用的 i18n?
Iris 的设计哲学是「核心极简、功能按需扩展」。它把路由、中间件、模板渲染等关键路径做到极致优化,但主动将 i18n 这类业务耦合度高、策略差异大的能力交给用户决策。官方文档和源码中均无 i18n、localizer、translator 相关 API。
推荐用 go-i18n + 自定义中间件接入
目前社区最稳定、适配 Go 1.20+ 且支持 JSON/YAML 语言包的方案是 github.com/nicksnyder/go-i18n/v2(注意 v2 分支)。它不依赖框架,可干净注入到 Iris.Context 中。
实操要点:
- 语言标识优先从
Accept-Language请求头解析, fallback 到 URL 路径前缀(如/zh-CN/home)或 cookie(lang=zh-CN) - 不要在
app.Get("/xxx", handler)里重复加载 bundle —— 应在中间件中一次性解析并挂载到ctx.Values().Set("localizer", loc) - 模板中调用时,用
{{.Localizer.Tr "home.title"}}(需提前把Localizer传入模板上下文) - 避免在 handler 中用
loc.Localize(&i18n.LocalizeConfig{...})手动调用,易出错且难测试
常见错误:语言切换后静态资源路径没变
比如你用了 /en/css/app.css 和 /zh-CN/css/app.css 两套样式,但 Iris 的静态文件路由默认是 app.HandleDir("/css", "./public/css"),不会自动按语言分发。解决方式只有两个:
- 把语言前缀作为路径一部分注册独立静态路由:
app.HandleDir("/en/css", "./public/en/css")、app.HandleDir("/zh-CN/css", "./public/zh-CN/css") - 改用动态服务:写一个
GET /css/{file:string}handler,在里面根据当前语言选择读取对应目录下的文件
前者简单但冗余;后者灵活但需自己处理 MIME 类型和缓存头(ctx.ContentType("text/css")、ctx.Header("Cache-Control", "public, max-age=31536000"))。
模板中如何安全使用翻译文本
Iris 的 HTML 渲染器不自动识别 i18n 函数,必须显式传入 localizer 实例。例如:
func homeHandler(ctx iris.Context) {
loc := ctx.Values().Get("localizer").(*i18n.Localizer)
ctx.ViewData("Localizer", loc)
ctx.View("home.html")
}
然后在 home.html 里:
<h1>{{.Localizer.Tr "welcome.message" .Lang}}</h1>
注意:.Lang 是你中间件里存的当前语言 tag(如 zh-CN),用于传递给 Tr 方法做上下文变量替换,不是必须项,但建议带上以便支持带参数的翻译(如 "Hello {{.Name}}")。
go-i18n/v2 的 Bundle 初始化后不监听文件变化,修改 active.en.json 后必须重启服务。如果需要运行时生效,得自己加 fsnotify 监听 + 重新 bundle.ParseFS,这部分没有现成封装。


















