Интернационализация (i18n) в Go (Golang): библиотека go-i18n

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Интернационализация (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."                    

Рекомендаций