Golang怎么做国际化多语言_Golang i18n教程【核心】

go-i18n/v2 是最稳选择,因 golang.org/x/text/message 不支持运行时语言切换,其 Printer 一旦创建格式即固化;它适合短文本格式化,而非按请求绑定语言的页面文案场景。go-i18n/v2 是目前最稳的选择,别用 golang.org/x/text/message 做运行时语言切换它压根不是为动态语言切换设计的:message.NewPrinter 一创建,格式规则就固化了。改 language.Tag 或系统 locale 都没用,printer.Printf("Hello") 还是输出英文------你看到的不是"没切成功",而是"根本没打算支持"。常见错误现象:注册了翻译但始终 fallback 到源字符串,因为漏了 message.Catalog 绑定以为 reload 文件就能生效,结果静默失败(message.Printer 不支持热重载)golang.org/x/text/message 适合短文本格式化(如数字、日期),但不适合页面文案、错误提示这类需按请求绑定语言的场景真正要的是按请求绑定语言:go-i18n/v2 自带 Bundle 管理、Localizer 实例化、热重载(注意:仅对文件系统有效,embed.FS 中需手动检查 fs.Stat)资源文件命名和结构必须严格符合 BCP 47 + JSON Schema错一个字符,bundle.ParseFS 就会静默失败,返回空字符串而非报错。文件名必须是 active.zh-CN.json,不能是 zh.json、zh_CN.json 或 cn.json路径必须匹配 os.DirFS("./locales") 下的真实层级,比如 ./locales/active.en-US.jsonJSON 内容必须严格:{"welcome": {"description": "homepage greeting", "translation": "欢迎"}} ?{"welcome": "欢迎"} ?(缺少 description 和外层对象结构){"welcome": {"msg": "欢迎"}} ?(字段名必须是 translation)只加载 active.* 前缀的文件,inactive.* 会被忽略------这是故意设计,避免误加载未审核翻译Accept-Language 解析不能直接信 r.Header.Get("Accept-Language")原始 header 可能为空、超长、含非法 tag(如 en;q=0.9, fr-XX;q=0.8),甚至触发 panic。正确做法是用 language.ParseAcceptLanguage,它自动排序、过滤无效项、做标准化再配合已注册语言集做安全匹配:先调 language.ParseAcceptLanguage(r.Header.Get("Accept-Language")) 得到有序候选列表遍历该列表,用 language.MatchStrings(supportedLangs, candidate.String()) 查第一个合法匹配没匹配上就 fallback 到默认语言(如 language.Make("en")),别硬 fallback 到 en-US缓存解析结果,避免每次请求都重复调 language.Parse------它不是纯函数,内部有 map 查找开销HTTP 请求中怎么动态切换语言而不重启服务不能每次请求都新建 *i18n.Localizer,它不是 goroutine-safe 的,且初始化开销大;也不能全局单例一个 localizer,因为语言要随请求变化。 Mokker AI AI产品图添加背景

相关推荐
威哥爱编程17 小时前
Python 智能体开发实战 03:聊十轮就“失忆”,账单还翻倍?管好上下文,Token 立省一半
python·agent
情 九17 小时前
MCP 开发环境搭建:Mac 与 Windows 跑通 Python 服务和 stdio 客户端
windows·python·macos·mcp
梦幻通灵17 小时前
MybatisPlus使用数据库递增ID实现方案【持续更新】
数据库·oracle
l1t17 小时前
DeepSeek总结的从 SQL 桥梁到智能体基础设施:Hex 的 DuckDB 实践
数据库·sql·duckdb
代码派17 小时前
PostgreSQL 同构迁移上云方案|NineData 数据复制、实时增量与一致性校验
数据库·postgresql·上云·ninedata·迁移·数据库迁移·版本升级
孙琦Ray17 小时前
Speedb 数据引擎转向开源,RocksDB 替代方案迎来新竞争
数据库·开源·rocksdb·键值存储·speedb
SEO_juper17 小时前
Bash 交叉验证 robots.txt 和 sitemap:两个文件自相矛盾,页面永远收录不了
开发语言·python·node.js·json·bash
与数据交流的路上17 小时前
一次 redis 幽灵内存的分析
数据库·redis·缓存
日日大王学编程17 小时前
LangGraph 基本用法详解:从入门到实战
python·语言模型·langchain
威哥爱编程17 小时前
Python 智能体开发实战 04:模型答得挺漂亮,程序却读不懂?让回答直接变成能入库的 JSON
python·agent