Internacionalização (i18n) em JavaScript (Node.js)
Internacionalização (abreviada como i18n — do inglês "internationalization", onde 18 representa o número de letras entre o primeiro "i" e o último "n") — é o processo de projetar e desenvolver software de forma que ele possa ser facilmente adaptado para diferentes idiomas e regiões sem alterações no código. No ecossistema Node.js, existem várias bibliotecas poderosas que simplificam significativamente essa tarefa. Neste artigo, abordaremos as duas mais populares: i18next e node-polyglot.
Por que a internacionalização é necessária?
Aplicações web modernas e serviços de servidor frequentemente atendem usuários de diferentes países. O suporte a vários idiomas melhora a experiência do usuário (UX) e expande o público. Sem i18n, os desenvolvedores teriam que codificar strings em um único idioma, tornando o suporte multilíngue extremamente trabalhoso e propenso a erros.
As principais tarefas resolvidas pelas bibliotecas i18n em Node.js:
- Suporte a arquivos de tradução (geralmente JSON ou YAML).
- Pluralização (flexão correta das palavras dependendo do número: "1 café", "2 cafés", "5 cafés").
- Interpolação de variáveis em strings (por exemplo, "Olá, {{name}}!").
- Suporte a chaves aninhadas para organizar a estrutura das traduções.
- Detecção automática do idioma do usuário (através de cabeçalhos HTTP, cookies, subdomínios).
Biblioteca i18next
i18next é, sem dúvida, a biblioteca de internacionalização mais popular e funcional no mundo JavaScript. Ela funciona tanto no navegador quanto no servidor Node.js. O i18next oferece um rico ecossistema de plugins, incluindo integração com React, Vue, Express e outros frameworks.
Instalação e configuração básica
// Instalação via npmnpm install i18nextCriaremos arquivos de tradução. Geralmente, eles são armazenados na pasta locales:
locales/pt/translation.json
{ "greeting": "Olá, {{name}}!", "coffee": "Você bebeu {{count}} xícara de café", "coffee_plural": "Você bebeu {{count}} xícaras de café", "menu": { "home": "Início", "about": "Sobre nós" }}locales/en/translation.json
{ "greeting": "Hello, {{name}}!", "coffee": "You drank {{count}} cup of coffee", "coffee_plural": "You drank {{count}} cups of coffee", "menu": { "home": "Home", "about": "About us" }}Agora inicializamos o i18next na aplicação:
const i18next = require('i18next');const fs = require('fs');const path = require('path');
// Carregar traduções dos arquivosfunction loadTranslation(lng) { const filePath = path.join(__dirname, 'locales', lng, 'translation.json'); return JSON.parse(fs.readFileSync(filePath, 'utf8'));}
i18next.init({ lng: 'pt', // idioma padrão fallbackLng: 'en', // idioma de fallback resources: { pt: { translation: loadTranslation('pt') }, en: { translation: loadTranslation('en') } }, interpolation: { escapeValue: false // para Node.js não é necessário escapar HTML }});
// Usoconsole.log(i18next.t('greeting', { name: 'Alexandre' }));// Saída: Olá, Alexandre!
console.log(i18next.t('coffee', { count: 1 }));// Saída: Você bebeu 1 xícara de café
console.log(i18next.t('coffee', { count: 5 }));// Saída: Você bebeu 5 xícaras de café
console.log(i18next.t('menu.home'));// Saída: InícioAlterar idioma dinamicamente
i18next.changeLanguage('en');console.log(i18next.t('greeting', { name: 'Alex' }));// Saída: Hello, Alex!Biblioteca node-polyglot
node-polyglot é uma alternativa leve e simples ao i18next. É ideal para projetos pequenos ou quando não