Datas, moedas e listas em português sem instalar nada
Há um reflexo antigo em JavaScript: precisa de formatar uma data, instala uma biblioteca. Só que o objeto Intl está no browser e no Node há anos, sabe o que é o português europeu, e não pesa um byte no bundle.
1. Datas
const data = new Date('2026-04-07T15:30:00');
new Intl.DateTimeFormat('pt-PT').format(data);
// '07/04/2026'
new Intl.DateTimeFormat('pt-PT', { dateStyle: 'long' }).format(data);
// '7 de abril de 2026'
new Intl.DateTimeFormat('pt-PT', { dateStyle: 'full', timeStyle: 'short' }).format(data);
// 'terça-feira, 7 de abril de 2026 às 15:30'Repare no dateStyle em vez de escolher dia, mês e ano à mão: é o que garante que a ordem e os separadores são os da língua, e não os do sítio onde o código foi escrito.
2. Números e dinheiro
new Intl.NumberFormat('pt-PT').format(1234567.891);
// '1 234 567,891'
new Intl.NumberFormat('pt-PT', { style: 'currency', currency: 'EUR' }).format(19.9);
// '19,90 €'
new Intl.NumberFormat('pt-PT', { style: 'percent', maximumFractionDigits: 1 }).format(0.235);
// '23,5%'3. "Há 3 dias"
const relativo = new Intl.RelativeTimeFormat('pt-PT', { numeric: 'auto' });
relativo.format(-1, 'day'); // 'ontem'
relativo.format(-3, 'day'); // 'há 3 dias'
relativo.format(2, 'week'); // 'dentro de 2 semanas'O numeric: 'auto' é o que troca "há 1 dia" por "ontem". É o género de detalhe pelo qual se instalava uma biblioteca inteira.
4. Listas e ordenação
new Intl.ListFormat('pt-PT').format(['maçãs', 'peras', 'uvas']);
// 'maçãs, peras e uvas'
// Ordenar com acentos como uma pessoa espera
const nomes = ['Ávila', 'Alves', 'Zé', 'Água'];
nomes.sort(); // ['Alves', 'Zé', 'Ávila', 'Água'] — pela tabela de caracteres
nomes.sort(new Intl.Collator('pt-PT').compare); // ['Água', 'Alves', 'Ávila', 'Zé']Aquele sort() simples é um bug à espera de acontecer em qualquer lista de nomes portugueses. O Collator resolve-o numa linha.