Internacionalización (i18n) en Go (Golang): Guía completa para desarrolladores
La internacionalización (i18n) es el proceso de diseñar software de manera que pueda adaptarse fácilmente a diferentes idiomas y regiones sin realizar cambios en el código fuente. En Go (Golang), existen varias soluciones maduras para este propósito, pero la más popular y estandarizada es el paquete golang.org/x/text, que proporciona potentes herramientas para trabajar con localización. En este artículo, analizaremos en detalle cómo configurar i18n en una aplicación Go utilizando bibliotecas oficiales y las mejores prácticas.
Bibliotecas principales para i18n en Go
El ecosistema de Go ofrece varios enfoques para la internacionalización. Veamos los más importantes:
golang.org/x/text— el paquete principal del equipo de Go, compatible con Unicode, CLDR (Common Locale Data Repository) y reglas complejas de pluralización.github.com/nicksnyder/go-i18n— una biblioteca de terceros popular con soporte para archivos de traducción en JSON, TOML y YAML, API simple y detección automática de idioma.github.com/leonelquinteros/gotext— una alternativa ligera que funciona con el formato GNU gettext (archivos .po/.mo), ideal para proyectos pequeños.
En esta guía, nos centraremos en go-i18n como la solución más equilibrada para aplicaciones web, pero los conceptos son aplicables a cualquier biblioteca.
Instalación y configuración de go-i18n
Para empezar, instale la biblioteca y la herramienta CLI para trabajar con traducciones:
go get github.com/nicksnyder/go-i18n/v2/i18ngo install github.com/nicksnyder/go-i18n/v2/goi18n@latestCree la estructura del proyecto:
myapp/├── active.en.json├── active.ru.json├── main.go└── go.modCreación de archivos de traducción
La biblioteca utiliza archivos JSON con traducciones. Ejemplo para los idiomas inglés y ruso:
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 el uso de las reglas de pluralización: one, few, many y other. En ruso existen 4 formas, mientras que en inglés solo hay 2 (one/other). La biblioteca selecciona automáticamente la forma correcta según el número.
Ejemplo de uso en código
Ahora escribamos el código que carga las traducciones y muestra mensajes localizados:
package main
import ( "fmt" "log"
"github.com/nicksnyder/go-i18n/v2/i18n" "golang.org/x/text/language")
func main() { // Creamos un bundle con los archivos de idioma bundle := i18n.NewBundle(language.English) bundle.RegisterUnmarshalFunc("json", json.Unmarshal)
// Cargamos los archivos de traducción _, err := bundle.LoadMessageFile("active.en.json") if err != nil { log.Fatal(err) } _, err = bundle.LoadMessageFile("active.ru.json") if err != nil { log.Fatal(err) }
// Creamos un localizador para el idioma ruso localizer := i18n.NewLocalizer(bundle, "ru")
// Ejemplo 1: Saludo simple greeting, err := localizer.Localize(&i18n.LocalizeConfig{ MessageID: "greeting", TemplateD También en la biblioteca
Trabajo con CSV en Go (Golang): guía completa del paquete encoding/csv
Procesamiento de JSON en PHP: funciones, ejemplos y mejores prácticas
clinic.js — Monitoreo de aplicaciones TypeScript