Internacionalização (i18n) em Node.js: i18next e polyglot

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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 i18next

Criaremos 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ício


Alterar 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

Recommendations