Интернационализация (i18n) в Go (Golang) с библиотекой go-i18n
Интернационализация (i18n) — это процесс проектирования программного обеспечения таким образом, чтобы его можно было легко адаптировать для различных языков и регионов без изменений в исходном коде. В языке Go (Golang) одной из самых популярных и мощных библиотек для реализации i18n является go-i18n. Эта библиотека предоставляет разработчикам удобные инструменты для управления переводами, поддержки множественных форм (pluralization) и работы с контекстом.
В этой статье мы подробно разберем, как использовать 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/bundle
go 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 := i18n.NewBundle(language.English)
bundle.RegisterUnmarshalFunc("json", json.Unmarshal)
// Загружаем файлы переводов
bundle.MustLoadMessageFile("locales/active.en.json")
bundle.MustLoadMessageFile("locales/active.ru.json")
// Создаем локализатор для русского языка
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 CLDR (Common Locale Data Repository), что позволяет правильно склонять слова в зависимости от числа. В примере выше для русского языка мы определили формы: one (1), few (2-4), many (5-20) и other (для остальных случаев).
Работа с контекстом и шаблонами
Библиотека поддерживает передачу динамических данных через TemplateData. Вы можете использовать любые переменные внутри строк перевода, заключая их в двойные фигурные скобки:
{
"greeting": {
"other": "Hello, {{.Name}}! You are {{.Age}} years old."