Fiber框架本身不内置i18n支持,需借助go-i18n或golang.org/x/text等第三方库实现多语言;推荐用go-i18n管理UI文本、x/text处理日期/数字/货币格式,并通过中间件统一解析语言标识注入c.Locals。

Fiber 框架本身不内置 i18n 支持
Fiber 是 Go 语言的轻量级 Web 框架,它没有像 React 的 react-i18next 或 Ant Design 那样的开箱即用国际化模块。所有语言切换、翻译加载、本地化格式(如日期/数字)都得靠你自己组合中间件 + 第三方库实现。别指望 fiber.App 上直接调用 .useI18n() —— 这个方法根本不存在。
推荐用 go-i18n 或 golang.org/x/text 实现基础多语言
目前最常用、维护活跃的是 github.com/nicksnyder/go-i18n/v2(注意 v2 分支),它支持 JSON 翻译文件、动态语言切换、复数规则和占位符。另一个更底层但更灵活的选择是 golang.org/x/text,适合需要深度控制格式化(比如货币符号位置、时区缩写)的场景。
-
go-i18n更适合业务逻辑层:定义en.json、zh.json,用T("login_button")渲染文本 -
x/text更适合展示层:用message.Printer格式化带参数的字符串,或用language.Make("zh-CN")构建本地化上下文 - 两者可共存:用
go-i18n管理 UI 文本,用x/text处理时间/数字/货币
关键:语言标识必须从请求中可靠提取
用户语言不能只依赖浏览器 Accept-Language,尤其在移动端或代理后容易丢失。你得明确决定优先级,比如:
- URL 路径前缀优先(
/zh/login>Cookie: lang=zh>Header: Accept-Language) - 避免只靠 Cookie:无状态 API 场景下失效;避免只靠 Header:CDN 可能剥离或覆盖
- 在 Fiber 中,建议统一用中间件解析语言,并注入到
c.Locals,例如:c.Locals("lang", "zh-CN") - 别在每个 handler 里重复解析 —— 中间件做一次就够了,后续直接取
c.Locals("lang")
翻译文件热加载需手动处理,别默认认为会自动刷新
go-i18n 默认加载一次后就缓存全部翻译,改了 JSON 文件不会自动生效。开发期可以加个定时重载逻辑,但生产环境强烈建议禁用:
- 用
i18n.NewBundle(language.English)初始化后,调用bundle.RegisterUnmarshalFunc("json", json.Unmarshal) - 首次加载用
bundle.MustLoadMessageFile("locales/en.json"),之后更新需调用bundle.ReloadMessageFile - 如果用了 Fiber 的
c.Render渲染 HTML 模板,记得把localizer传进去,而不是在模板里重新创建 —— 否则每次渲染都 new 一个,无法共享缓存 - JSON 文件路径错误时,
MustLoadMessageFile会 panic,不是静默失败;上线前务必检查locales/目录是否随二进制一起打包
T("xxx") 调用都带对参数、所有新文案都被扫描进 JSON、所有语言包版本和代码分支严格对齐”——这些没法靠框架解决。


















