使用 go-i18n 库在 Go (Golang) 中实现国际化 (i18n)
国际化 (i18n) 是一种软件设计过程,旨在使软件能够轻松适应不同的语言和地区,而无需修改源代码。在 Go (Golang) 语言中,实现 i18n 最流行且功能强大的库之一是 go-i18n。该库为开发者提供了便捷的工具来管理翻译、支持复数形式以及处理上下文。
在本文中,我们将详细讲解如何使用 go-i18n 对您的 Go 应用程序进行国际化:从安装到创建完整的本地化系统。
安装 go-i18n 库
要开始使用 go-i18n,首先需要使用 Go 的依赖管理器安装该包:
go get github.com/nicksnyder/go-i18n/v2/i18n您还需要一个用于解析翻译文件的包(例如 JSON 或 YAML):
go get github.com/nicksnyder/go-i18n/v2/i18n/bundlego get github.com/nicksnyder/go-i18n/v2/i18n/localizer本地化文件结构
go-i18n 库支持以 JSON、YAML 或 TOML 格式存储翻译。建议为每种语言创建单独的文件。目录结构示例:
locales/ active.en.json # 英语 active.ru.json # 俄语 active.fr.json # 法语翻译文件示例 (active.en.json)
创建一个包含一条消息并支持复数形式的英语文件:
{ "hello_world": { "other": "Hello, World!" }, "messages_count": { "one": "You have {{.Count}} new message.", "few": "You have {{.Count}} new messages.", "many": "You have {{.Count}} new messages.", "other": "You have {{.Count}} new messages." }}翻译文件示例 (active.ru.json)
考虑复数形式规则(一个、几个、许多)的俄语对应文件:
{ "hello_world": { "other": "Привет, мир!" }, "messages_count": { "one": "У вас {{.Count}} новое сообщение.", "few": "У вас {{.Count}} новых сообщения.", "many": "У вас {{.Count}} новых сообщений.", "other": "У вас {{.Count}} сообщений." }}在代码中初始化和使用
现在编写 Go 代码,加载翻译文件并根据所选语言显示消息。
package main
import ( "fmt" "github.com/nicksnyder/go-i18n/v2/i18n" "golang.org/x/text/language")
func main() { // 创建一个 bundle(翻译存储库) bundle := i18n.NewBundle(language.English) bundle.RegisterUnmarshalFunc("json", json.Unmarshal)
// 加载翻译文件 bundle.MustLoadMessageFile("locales/active.en.json") bundle.MustLoadMessageFile("locales/active.ru.json")
// 为俄语创建一个 localizer localizer := i18n.NewLocalizer(bundle, language.Russian.String())
// 使用简单消息的示例 helloMsg, _ := localizer.Localize(&i18n.LocalizeConfig{ MessageID: "hello_world", }) fmt.Println(helloMsg) // 输出:Привет, мир!
// 使用复数形式的示例 for _, count := range []int{1, 2, 5, 10} { msg, _ := localizer.Localize(&i18n.LocalizeConfig{ MessageID: "messages_count", PluralCount: count, TemplateData: map[string]interface{}{ "Count": count, }, }) fmt.Println(msg) }}复数形式支持 (Pluralization)
go-i18n 的关键特性之一是对复数形式的正确处理。该库使用 Unicode