Cuenta la mitología judeocristiana que unos señores decidieron hacer una torre muy alta para que el próximo diluvio les pillara preparados. Pero había una deidad muy susceptible a la que eso le pareció muy mal e hizo que dejaran de entenderse entre sí, y por eso ahora hay miles de lenguas en el mundo. Algunos dicen que Javascript es un invento de Satán y, como tal, ofrece alguna herramienta para que nos entendamos mejor entre nosotros, como es el caso del objeto global Intl de JavaScript. Bueno, realmente no es para que nos entendamos mejor entre nosotros, sino para trabajar con diferentes locales. Pero quedaba bien para el relato.
Es habitual que nuestras aplicaciones estén disponibles en varios idiomas y manejemos los textos con diferentes librerías creadas para tal propósito. No es el caso de Intl; no vamos a manejar traducciones en distintos idiomas con ella. Lo que nos ofrece son algunas herramientas que nos ayudarán a manejar algunos datos sensibles al idioma, como pueden ser las fechas o algunos tipos de valores numéricos, entre otros.
DateTimeFormat
Existen diversas formas de expresar las fechas según los idiomas, lo más habitual es utilizar la forma día/mes/año o año/mes/día y, además, existen extravagantes tribus por el mundo que utilizan la forma mes/día/año. Además en diferentes culturas manejan calendarios distintos del gregoriano, como el islámico o el budista (aunque ninguno superará al calendario republicano francés). DateTimeFormat nos permite hacer frente a estas diferencias.

Es bastante sencillo formatear fechas de la manera deseada. Para ello solamente tenemos que crear un objeto DateTimeFormat con las opciones deseadas:
const myDate = new Date();
const formatter = new Intl.DateTimeFormat(locale, options);
const myDateFormatted = formatter.format(myDate);De esta forma, tenemos nuestra cadena de texto en el idioma proporcionado en nuestro locale de acuerdo con las opciones que podemos ver a continuación:
// Formateo básico
const dt = new Date('2025-12-29T15:30:00Z');
console.log(new Intl.DateTimeFormat('es-ES').format(dt)); // "29/12/2025"
console.log(new Intl.DateTimeFormat('en-US').format(dt)); // “12/29/2025"
// Fecha y hora completas
console.log(new Intl.DateTimeFormat('es-ES', opts).format(dt));
// "lunes, 29 de diciembre de 2025 16:30:00 GMT+1" (ejemplo, depende TZ)
// Componentes individuales
const optsComp = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
console.log(new Intl.DateTimeFormat('es-ES', optsComp).format(dt)); // "lunes, 29 de diciembre de 2025”
// Zona horaria
console.log(new Intl.DateTimeFormat('en-US', { timeStyle: 'short', timeZone: 'Asia/Tokyo', timeZoneName: 'short' }).format(dt)); // "12:30 AM JST"
console.log(new Intl.DateTimeFormat('es-ES', { timeStyle: 'short', timeZoneName: 'long' , timeZone: 'Europe/Madrid'}).format(dt)); // "16:30 GMT+1"
RelativeTimeFormat
Una forma de expresar valores temporales que se ve habitualmente es el tiempo transcurrido hasta el momento presente (“hace 3 días”). El objeto llega a nuestro rescate para facilitarnos un poco la vida. De esta forma, no nos tenemos que molestar en crear pequeñas cadenas de texto a tal efecto.
const rtf = new Intl.RelativeTimeFormat('es', { numeric: 'auto' });
console.log(rtf.format(-1, 'day')); // "ayer"
console.log(rtf.format(1, 'day')); // "mañana"
console.log(rtf.format(-3, 'hour')); // "hace 3 horas"
console.log(rtf.format(30, 'second')); // "en 30 segundos"DurationFormat
En este caso, nos permite la posibilidad de expresar duraciones a partir de los valores temporales, como antes, sin necesidad de crear nuestras cadenas de texto:
// Formato básico
const df = new Intl.DurationFormat('es-ES', { style: 'long' });
const dur = { hours: 2, minutes: 5, seconds: 30 };
console.log(df.format(dur)); // "2 horas, 5 minutos y 30 segundos"
//Longitudes de estilo
const dLong = new Intl.DurationFormat('en', { style: 'long' });
const dShort = new Intl.DurationFormat('en', { style: 'short' });
const dNarrow = new Intl.DurationFormat('en', { style: 'narrow' });
const dur = { hours: 1, minutes: 2 };
console.log(dLong.format(dur)); // "1 hour and 2 minutes"
console.log(dShort.format(dur)); // "1 hr, 2 min"
console.log(dNarrow.format(dur)); // "1h 2m"NumberFormat
La forma de expresar valores numéricos también es sensible al idioma y cultura. De nuevo existen diferencias entre distintos idiomas y cultura. Quizás la diferencia más conocida sea el uso de puntos y comas para separar decimales y millares entre, por ejemplo, el español y el inglés.
const n = 1234567.89;
console.log(new Intl.NumberFormat('en-US').format(n)); // "1,234,567.89"
console.log(new Intl.NumberFormat('es-ES').format(n)); // "1.234.567,89"NumberFormat nos permite, además de formatear los números propiamente dichos, añadir unidades de medida o también monedas.
console.log(new Intl.NumberFormat('fr-FR', { style: 'unit', unit: 'meter-per-second', unitDisplay: 'short' }).format(3.6));
// "3,6 m/s"
console.log(new Intl.NumberFormat('de-DE', { style: 'unit', unit: 'celsius', unitDisplay: 'long' }).format(21));
// "21 Grad Celsius"
const amount = 1234.5;
console.log(new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(amount)); // "$1,234.50"
console.log(new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(amount)); // "1.234,50 €"
console.log(new Intl.NumberFormat('ja-JP', { style: 'currency', currency: 'JPY' }).format(amount)); // "¥1,235"ListFormat
En ocasiones tenemos listas de palabras en un array que necesitamos expresar de manera textual. Podemos hacer un join del array separado por “, “, pero antes del último elemento podríamos necesitar añadir una conjunción (“primer plato, segundo plato y postre”, por ejemplo). ListFormat hace ese trabajo por nosotros:
const lfEs = new Intl.ListFormat('es-ES');
console.log(lfEs.format(['manzana', 'plátano', 'cereza']));
// "manzana, plátano y cereza”
Const lfEn = new Intl.ListFormat('en-GB', { type: 'disjunction'});
console.log(lfEn.format(['apple', 'banana', 'cherry']));
// apple, banana or cherryConclusión
Muchas veces, por puro desconocimiento, nos lanzamos a crear nuestras funciones de utilidad mientras maldecimos a alguna deidad a la que culpamos por la enorme variedad de idiomas en el mundo. El objeto Intl, no nos va a solucionar la vida como lo haría un boleto de 6 aciertos de los Euromillones, pero oye, algo nos la puede facilitar. En MDN podemos consultar la documentación completa, seguro que algo encuentras que te sirva.
Si te interesa JavaScript y el frontend moderno, en nuestro blog compartimos más artículos técnicos sobre APIs del navegador, automatización y herramientas que merece la pena conocer.

