Internacionalização (i18n) em Go (Golang) com a biblioteca go-i18n
\nInternacionalizaçã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. Na linguagem Go (Golang), uma das bibliotecas mais populares e poderosas para implementar i18n é a go-i18n. Esta biblioteca fornece aos desenvolvedores ferramentas convenientes para gerenciar traduções, suportar formas plurais (pluralization) e trabalhar com contexto.
\nNeste artigo, vamos detalhar como usar go-i18n para internacionalizar sua aplicação Go: desde a instalação até a criação de um sistema completo de localização.
\n\nInstalação da biblioteca go-i18n
\nPara começar a trabalhar com go-i18n, é necessário instalar o pacote usando o gerenciador de dependências do Go:
\ngo get github.com/nicksnyder/go-i18n/v2/i18n\nVocê também precisará de um pacote para analisar arquivos de tradução (por exemplo, JSON ou YAML):
\ngo get github.com/nicksnyder/go-i18n/v2/i18n/bundle\ngo get github.com/nicksnyder/go-i18n/v2/i18n/localizer\n\nEstrutura dos arquivos de localização
\nA biblioteca go-i18n suporta o armazenamento de traduções nos formatos JSON, YAML ou TOML. Recomenda-se criar arquivos separados para cada idioma. Exemplo de estrutura de diretórios:
\nlocales/\n active.en.json # Inglês\n active.ru.json # Russo\n active.fr.json # Francês\n\nExemplo de arquivo de tradução (active.en.json)
\nVamos criar um arquivo para o inglês com uma mensagem e suporte a formas plurais:
\n{\n "hello_world": {\n "other": "Hello, World!"\n },\n "messages_count": {\n "one": "You have {{.Count}} new message.",\n "few": "You have {{.Count}} new messages.",\n "many": "You have {{.Count}} new messages.",\n "other": "You have {{.Count}} new messages."\n }\n}\n\nExemplo de arquivo de tradução (active.ru.json)
\nArquivo semelhante para o russo, considerando as regras de formas plurais (um, alguns, muitos):
\n{\n "hello_world": {\n "other": "Привет, мир!"\n },\n "messages_count": {\n "one": "У вас {{.Count}} новое сообщение.",\n "few": "У вас {{.Count}} новых сообщения.",\n "many": "У вас {{.Count}} новых сообщений.",\n "other": "У вас {{.Count}} сообщений."\n }\n}\n\nInicialização e uso no código
\nAgora vamos escrever código em Go que carrega os arquivos de tradução e os utiliza para exibir mensagens de acordo com o idioma selecionado.
\npackage main\n\nimport (\n "fmt"\n "github.com/nicksnyder/go-i18n/v2/i18n"\n "golang.org/x/text/language"\n)\n\nfunc main() {\n // Criando um bundle (armazenamento de traduções)\n bundle := i18n.NewBundle(language.English)\n bundle.RegisterUnmarshalFunc("json", json.Unmarshal)\n\n // Carregando os arquivos de tradução\n bundle.MustLoadMessageFile("locales/active.en.json")\n bundle.MustLoadMessageFile("locales/active.ru.json")\n\n // Criando um localizador para o idioma russo\n localizer := i18n.NewLocalizer(bundle, language.Russian.String())\n\n // Exemplo de uso com uma mensagem simples\n helloMsg, _ := localizer.Localize(&i18n.LocalizeConfig{\n MessageID: "hello_world",\n })\n fmt.Println(helloMsg) // Saída: Привет, мир!\n\n // Exemplo de uso com números plurais\n for _, count := range []int{1, 2, 5, 10} {\n msg, _ := localizer.Localize(&i18n.LocalizeConfig{\n MessageID: "messages_count",\n PluralCount: count,\n TemplateData: map[string]interface{}{\n "Count": count,\n },\n })\n fmt.Println(msg)\n }\n}\n\nSuporte a formas plurais (Pluralization)
\nUma das principais características do go-i18n é o tratamento correto de formas plurais. A biblioteca usa as regras Unicode