Go (Golang) 中的国际化 (i18n):go-i18n 库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

使用 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

推荐