Internacionalización (i18n) en JavaScript (Node.js): biblioteca i18next
\n\nLa internacionalización (abreviada i18n — del inglés "internationalization", donde 18 es el número de letras entre la primera "i" y la última "n") es el proceso de diseño y desarrollo de software que permite adaptarlo a diferentes idiomas y características regionales sin modificar el código fuente. En el desarrollo web moderno con Node.js, crear aplicaciones multilingües es una necesidad para llegar al mercado global.
\n\nUna de las bibliotecas más populares y potentes para implementar i18n en el ecosistema JavaScript (incluyendo Node.js) es i18next. Ofrece una arquitectura flexible, soporte para múltiples formatos de archivos de traducción, interpolación, pluralización y traducciones contextuales. En este artículo, analizaremos en detalle la instalación, configuración y uso de i18next en el lado del servidor.
\n\nInstalación y configuración
\n\nPara empezar a trabajar con i18next en un proyecto Node.js, instale la biblioteca a través de npm:
\n\nnpm install i18next\n\nTambién se recomienda instalar el paquete i18next-fs-backend para cargar archivos de traducción desde el sistema de archivos:
npm install i18next-fs-backend\n\nDespués de la instalación, cree un archivo de inicialización, por ejemplo i18n.js:
const i18next = require('i18next');\nconst Backend = require('i18next-fs-backend');\n\ni18next.use(Backend).init({\n lng: 'ru', // idioma por defecto\n fallbackLng: 'en', // idioma de respaldo\n backend: {\n loadPath: './locales/{{lng}}/{{ns}}.json' // ruta a los archivos de traducción\n },\n interpolation: {\n escapeValue: false // no escapar HTML (para Node.js)\n }\n});\n\nmodule.exports = i18next;\n\nEstructura de los archivos de traducción
\n\nCree una carpeta locales en la raíz del proyecto. Dentro de ella, para cada idioma, cree una subcarpeta (por ejemplo, en, ru, de). En cada subcarpeta, coloque archivos JSON con las traducciones. Normalmente se usa un archivo translation.json por idioma, pero se puede dividir en espacios de nombres (namespaces) para mayor modularidad.
Ejemplo del archivo locales/ru/translation.json:
{\n "welcome": "¡Bienvenido a nuestro sitio web!",\n "greeting": "¡Hola, {{name}}!",\n "items": "{{count}} elemento",\n "items_plural": "{{count}} elementos",\n "menu": {\n "home": "Inicio",\n "about": "Acerca de",\n "contact": "Contacto"\n }\n}\n\nEjemplo del archivo locales/en/translation.json:
{\n "welcome": "Welcome to our website!",\n "greeting": "Hello, {{name}}!",\n "items": "{{count}} item",\n "items_plural": "{{count}} items",\n "menu": {\n "home": "Home",\n "about": "About",\n "contact": "Contact"\n }\n}\n\nFuncionalidades principales de i18next
\n\nTraducción simple
\n\nPara obtener una traducción, use la función t() (de "translate"):
const i18next = require('./i18n');\n\n// Inicialización asíncrona (en un proyecto real, espere a que esté lista)\ni18next.t('welcome'); // "¡Bienvenido a nuestro sitio web!" (si lng: 'ru')\n\nInterpolación de variables
\n\nInserte valores dinámicos en las cadenas usando llaves dobles:
\n\ni18next.t('greeting', { name: 'Alejandro' });\n// Resultado: "¡Hola, Alejandro!"\n\nPluralización
\n\nLa biblioteca selecciona automáticamente la forma plural correcta según las reglas del idioma. Para ello, agregue claves con el sufijo _plural:
i18next.t('items', { count: 1 }); // "1 elemento"\ni18next.t('items', { count: 5 }); // "5 elementos"\n\nPara el inglés, la regla es más simple (un elemento — item, muchos — items). Para el ruso, i18next utiliza reglas de pluralización integradas que consideran los números 1, 2-4, 5-20, etc.
\n\nClaves anidadas y espacios de nombres
\n\nPuede organizar las traducciones en estructuras jerárquicas usando puntos:
\n\ni18next.t('menu.home'); // "Inicio"\n\nPara usar espacios de nombres, defínalos en los archivos de traducción y especifique el espacio de nombres al llamar a t():
// locales/ru/common.json\n{\n "appName": "Mi Aplicación"\n}\n\n// Uso\ni18next.t('appName', { ns: 'common' }); // "Mi Aplicación"\n\nCambio dinámico de idioma
\n\nPuede cambiar el idioma en tiempo de ejecución usando el método changeLanguage:
i18next.changeLanguage('en', (err, t) => {\n if (err) return console.error(err);\n console.log(t('welcome')); // "Welcome to our website!"\n});\n\nEsto es especialmente útil en aplicaciones web donde el usuario puede seleccionar su idioma preferido.
\n\nConclusión
\n\ni18next es una herramienta potente y flexible para la internacionalización en Node.js. Su soporte para pluralización, interpolación, espacios de nombres y carga asíncrona de traducciones la convierte en la opción ideal para proyectos de cualquier escala. Con una configuración mínima, puede hacer que su aplicación sea accesible para usuarios de todo el mundo.
\n\nPara obtener más información, consulte la documentación oficial de i18next.