---
title: "Internationalization (i18n) и Localization (l10n) в Go"
date: 2022-10-02T14:59:08+03:00
tags: [go, программирование]
---

Информация взята [отсюда](https://phraseapp.com/blog/posts/internationalization-i18n-go)

[Альтернативный пакет (https://github.com/nicksnyder/go-i18n)](https://github.com/nicksnyder/go-i18n).

{{< toc >}}

## Internationalization (i18n)

Для форматирования вывода информации в национальном формате (например, чисел) используются следующие пакеты:

* [golang.org/x/text/language](https://pkg.go.dev/golang.org/x/text/language)
* [golang.org/x/text/message](https://pkg.go.dev/golang.org/x/text/message)

По-умолчанию, они не установлены. Необходимо их скачать:

```shell
go get -u golang.org/x/text/language
go get -u golang.org/x/text/message
```

Для вывода информации на основании языка используется тип `message.Printer`.
Используется он следующий образом:

```go
package main

import (
    "fmt"

    "golang.org/x/text/language"
    "golang.org/x/text/message"
)

func main() {
    p = message.NewPrinter(language.Russian)
    p.Printf("Вы получили %.2f монет.\n", 16521.56)
}
```

---

## Localization (l10n)

Для локализации используются те же пакеты. Чтобы выводить сообщение в зависимости от языка необходимо задать шаблоны используя метод _message.SetString()_.

Пример кода:

```go
package main

import (
    "fmt"

    "golang.org/x/text/language"
    "golang.org/x/text/message"
)

func init() {
    message.SetString(language.Russian, "You've got %.2f coins.", "Вы получили %.2f монет.")
    message.SetString(language.English, "You've got %.2f coins.", "You've got %.2f coins.")
}

func main() {
    p := message.NewPrinter(language.English)
    p.Printf("You've got %.2f coins.", 16521.56)
    fmt.Println()

    p = message.NewPrinter(language.Russian)
    p.Printf("You've got %.2f coins.", 16521.56)
    fmt.Println()
}
```
