Go (Golang) 中的国际化 (i18n):完整指南

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

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

开始课程

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

推荐