Go应用程序国际化:从$到€无痛切换

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

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

开始课程

为什么您的Go应用程序需要国际化(i18n)?

\n\n

您用Go编写了一个很酷的服务。它快速、并发、编译只需几秒。但有一个问题:其中的所有消息、按钮和提示都是俄语(或英语)。而世界希望用他们的母语来使用您的产品。正是在这里,Go应用程序国际化(i18n)登场了。

\n\n

许多人认为Go本地化是使用JSON文件和临时解决方案的噩梦。但事实并非如此。Go生态系统提供了优雅的解决方案,让您能够添加任意数量的语言支持,而不会使代码膨胀或损失性能。在本文中,我们将探讨如何正确地在Go中实现i18n,让您的应用程序能说上百种语言。

\n\n

什么是i18n和l10n?术语解析

\n\n

在编写代码之前,让我们先理清术语:

\n\n
    \n
  • i18n(国际化) — 设计应用程序的过程,使其能够适应不同的语言和地区而无需重写代码。这关乎架构。
  • \n
  • l10n(本地化) — 针对特定区域(例如en-US、ru-RU、de-DE)调整内容(文本翻译、日期格式、货币)。
  • \n
\n\n

在Go应用程序国际化的上下文中,i18n是代码的准备(使用键而不是字符串),而l10n是用翻译填充这些键。

\n\n

选择库:为什么是go-i18n?

\n\n

Go中有几个流行的翻译库。在测试了各种选项后,对于大多数项目来说,最佳选择是来自nicksnyder的go-i18n。为什么?

\n\n
    \n
  • 使用简单 — 最少的样板代码。
  • \n
  • 支持复数形式 — 正确处理“1条消息”、“2条消息”、“5条消息”的变格。
  • \n
  • 支持TOML/YAML/JSON — 选择您喜欢的翻译格式。
  • \n
  • 支持模板 — 可以直接在翻译字符串中插入变量。
  • \n
  • 内置键提取工具 — 无需手动编写翻译。
  • \n
\n\n

实践示例:制作一个多语言Go服务

\n\n

让我们创建一个简单的Go Web服务器,用用户的语言问候他们。

\n\n

步骤1:安装和项目结构

\n\n

安装库并创建目录结构:

\n\n
go get github.com/nicksnyder/go-i18n/v2/i18n\ngo get golang.org/x/text/language
\n\n

项目结构:

\n\n
myapp/\n├── main.go\n└── locales/\n    ├── active.en.toml\n    ├── active.ru.toml\n    └── active.de.toml
\n\n

步骤2:创建翻译文件

\n\n

locales/active.en.toml:

\n\n
[greeting]\ndescription = "用户问候"\none = "Hello, {{.Name}}!"\nother = "Hello, {{.Name}}!"\n\n[inbox]\ndescription = "收件箱中的消息数量"\none = "You have {{.Count}} new message."\nother = "You have {{.Count}} new messages."
\n\n

locales/active.ru.toml:

\n\n
[greeting]\ndescription = "用户问候"\none = "Привет, {{.Name}}!"\nother = "Привет, {{.Name}}!"\n\n[inbox]\ndescription = "收件箱中的消息数量"\none = "У вас {{.Count}} новое сообщение."\nfew = "У вас {{.Count}} новых сообщения."\nmany = "У вас {{.Count}} новых сообщений."\nother = "У вас {{.Count}} сообщений."
\n\n

请注意俄语中的复数形式:one、few、many、other。Go复数形式是一个强大的功能,能够正确处理复杂的变格规则。

\n\n

步骤3:编写Go代码

\n\n

现在最有趣的部分——国际化

博客

书籍推荐