Internacionalização (i18n) em Go (Golang): Guia Completo para Desenvolvedores
Internacionalização (i18n) é o processo de projetar software de forma que ele possa ser facilmente adaptado para diferentes idiomas e regiões sem alterações no código-fonte. Em Go (Golang), existem várias soluções maduras para esse fim, mas a mais popular e padronizada é o pacote golang.org/x/text, que fornece ferramentas poderosas para trabalhar com localização. Neste artigo, vamos detalhar como configurar i18n em uma aplicação Go, usando bibliotecas oficiais e melhores práticas.
Principais Bibliotecas para i18n em Go
O ecossistema Go oferece várias abordagens para internacionalização. Vamos analisar as principais:
golang.org/x/text— pacote principal da equipe Go, suportando Unicode, CLDR (Common Locale Data Repository) e regras complexas de pluralização.github.com/nicksnyder/go-i18n— biblioteca de terceiros popular com suporte a arquivos de tradução JSON, TOML e YAML, API simples e detecção automática de idioma.github.com/leonelquinteros/gotext— alternativa leve que trabalha com o formato GNU gettext (arquivos .po/.mo), ideal para projetos pequenos.
Neste guia, focaremos no go-i18n como a solução mais equilibrada para aplicações web, mas os conceitos se aplicam a qualquer biblioteca.
Instalação e Configuração do go-i18n
Para começar, instale a biblioteca e a ferramenta CLI para trabalhar com traduções:
go get github.com/nicksnyder/go-i18n/v2/i18ngo install github.com/nicksnyder/go-i18n/v2/goi18n@latestCrie a estrutura do projeto:
myapp/├── active.en.json├── active.ru.json├── main.go└── go.modCriação de Arquivos de Tradução
A biblioteca usa arquivos JSON com traduções. Exemplo para os idiomas inglês e russo:
active.en.json
{ "greeting": { "other": "Hello, {{.Name}}!" }, "cakes_count": { "one": "You have {{.Count}} cake.", "few": "You have {{.Count}} cakes.", "many": "You have {{.Count}} cakes.", "other": "You have {{.Count}} cakes." }}active.ru.json
{ "greeting": { "other": "Привет, {{.Name}}!" }, "cakes_count": { "one": "У вас {{.Count}} пирожное.", "few": "У вас {{.Count}} пирожных.", "many": "У вас {{.Count}} пирожных.", "other": "У вас {{.Count}} пирожных." }}Observe o uso das regras de pluralização: one, few, many e other. Em russo, existem 4 formas, enquanto em inglês existem apenas 2 (one/other). A biblioteca seleciona automaticamente a forma correta com base no número.
Exemplo de Uso no Código
Agora vamos escrever o código que carrega as traduções e exibe mensagens localizadas:
package main
import ( "fmt" "log"
"github.com/nicksnyder/go-i18n/v2/i18n" "golang.org/x/text/language")
func main() { // Criando um bundle com arquivos de idioma bundle := i18n.NewBundle(language.English) bundle.RegisterUnmarshalFunc("json", json.Unmarshal)
// Carregando arquivos de tradução _, err := bundle.LoadMessageFile("active.en.json") if err != nil { log.Fatal(err) } _, err = bundle.LoadMessageFile("active.ru.json") if err != nil { log.Fatal(err) }
// Criando um localizador para o idioma russo localizer := i18n.NewLocalizer(bundle, "ru")
// Exemplo 1: Saudação simples greeting, err := localizer.Localize(&i18n.LocalizeConfig{ MessageID: "greeting", TemplateD