Go (Golang) 中的国际化 (i18n):面向开发者的完整指南
国际化 (i18n) 是指设计软件,使其能够轻松适应不同语言和地区,而无需修改源代码的过程。在 Go (Golang) 中,有几种成熟的解决方案可用于此目的,但最流行且标准化的是 golang.org/x/text 包,它提供了强大的本地化工具。在本文中,我们将详细介绍如何使用官方库和最佳实践在 Go 应用程序中配置 i18n。
Go 中用于 i18n 的主要库
Go 生态系统提供了几种国际化的方法。让我们看看其中的关键库:
golang.org/x/text— Go 团队提供的主要包,支持 Unicode、CLDR(通用区域数据仓库)和复杂的复数规则。github.com/nicksnyder/go-i18n— 流行的第三方库,支持 JSON、TOML 和 YAML 翻译文件,API 简单,可自动检测语言。github.com/leonelquinteros/gotext— 轻量级替代方案,使用 GNU gettext 格式(.po/.mo 文件),非常适合小型项目。
在本指南中,我们将重点介绍 go-i18n,因为它对于 Web 应用程序来说是最平衡的解决方案,但这些概念适用于任何库。
安装和配置 go-i18n
首先,安装库和用于处理翻译的 CLI 工具:
go get github.com/nicksnyder/go-i18n/v2/i18ngo install github.com/nicksnyder/go-i18n/v2/goi18n@latest创建项目结构:
myapp/├── active.en.json├── active.ru.json├── main.go└── go.mod创建翻译文件
该库使用包含翻译的 JSON 文件。英语和俄语的示例:
active.en.json
{ "greeting": { "other": "Hello, {{.Name}}!" }, "cakes_count": { "one": "You have {{.Count}} cake.", "few": "You have {{.Count}} cakes.", "many": "You have {{.Count}} cakes.", "other": "You have {{.Count}} cakes." }}active.ru.json
{ "greeting": { "other": "Привет, {{.Name}}!" }, "cakes_count": { "one": "У вас {{.Count}} пирожное.", "few": "У вас {{.Count}} пирожных.", "many": "У вас {{.Count}} пирожных.", "other": "У вас {{.Count}} пирожных." }}请注意复数规则的使用:one、few、many 和 other。俄语有 4 种形式,而英语只有 2 种(one/other)。该库会根据数字自动选择正确的形式。
代码使用示例
现在,让我们编写加载翻译并显示本地化消息的代码:
package main
import ( "fmt" "log"
"github.com/nicksnyder/go-i18n/v2/i18n" "golang.org/x/text/language")
func main() { // 创建包含语言文件的包 bundle := i18n.NewBundle(language.English) bundle.RegisterUnmarshalFunc("json", json.Unmarshal)
// 加载翻译文件 _, err := bundle.LoadMessageFile("active.en.json") if err != nil { log.Fatal(err) } _, err = bundle.LoadMessageFile("active.ru.json") if err != nil { log.Fatal(err) }
// 为俄语创建本地化器 localizer := i18n.NewLocalizer(bundle, "ru")
// 示例 1:简单的问候 greeting, err := localizer.Localize(&i18n.LocalizeConfig{ MessageID: "greeting", TemplateD