为什么您的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
在Go应用程序国际化的上下文中,i18n是代码的准备(使用键而不是字符串),而l10n是用翻译填充这些键。
\n\n选择库:为什么是go-i18n?
\n\nGo中有几个流行的翻译库。在测试了各种选项后,对于大多数项目来说,最佳选择是来自nicksnyder的go-i18n。为什么?
\n\n- \n
- 使用简单 — 最少的样板代码。 \n
- 支持复数形式 — 正确处理“1条消息”、“2条消息”、“5条消息”的变格。 \n
- 支持TOML/YAML/JSON — 选择您喜欢的翻译格式。 \n
- 支持模板 — 可以直接在翻译字符串中插入变量。 \n
- 内置键提取工具 — 无需手动编写翻译。 \n
实践示例:制作一个多语言Go服务
\n\n让我们创建一个简单的Go Web服务器,用用户的语言问候他们。
\n\n步骤1:安装和项目结构
\n\n安装库并创建目录结构:
\n\ngo get github.com/nicksnyder/go-i18n/v2/i18n\ngo get golang.org/x/text/language\n\n项目结构:
\n\nmyapp/\n├── main.go\n└── locales/\n ├── active.en.toml\n ├── active.ru.toml\n └── active.de.toml\n\n步骤2:创建翻译文件
\n\nlocales/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\nlocales/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现在最有趣的部分——国际化