Internacionalización (i18n) en Go (Golang): Guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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@latest


Cree la estructura del proyecto:



myapp/├── active.en.json├── active.ru.json├── main.go└── go.mod


Creació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

Recommendations