Internacionalização (i18n) em JavaScript (Node.js): biblioteca i18next
\n\nInternacionalização (abreviada como i18n — do inglês "internationalization", onde 18 é o número de letras entre o primeiro "i" e o último "n") — é o processo de projetar e desenvolver software, permitindo adaptá-lo a diferentes idiomas e particularidades regionais sem alterar o código-fonte. No desenvolvimento web moderno com Node.js, criar aplicações multilíngues é uma necessidade para alcançar o mercado global.
\n\nUma das bibliotecas mais populares e poderosas para implementar i18n no ecossistema JavaScript (incluindo Node.js) é a i18next. Ela oferece uma arquitetura flexível, suporte a múltiplos formatos de arquivos de tradução, interpolação, pluralização e traduções contextuais. Neste artigo, abordaremos detalhadamente a instalação, configuração e uso do i18next no lado do servidor.
\n\nInstalação e configuração
\n\nPara começar a usar o i18next em um projeto Node.js, instale a biblioteca via npm:
\n\nnpm install i18next\n\nTambém é recomendado instalar o pacote i18next-fs-backend para carregar arquivos de tradução do sistema de arquivos:
npm install i18next-fs-backend\n\nApós a instalação, crie um arquivo de inicialização, por exemplo i18n.js:
const i18next = require('i18next');\nconst Backend = require('i18next-fs-backend');\n\ni18next.use(Backend).init({\n lng: 'ru', // idioma padrão\n fallbackLng: 'en', // idioma de fallback\n backend: {\n loadPath: './locales/{{lng}}/{{ns}}.json' // caminho para os arquivos de tradução\n },\n interpolation: {\n escapeValue: false // não escapar HTML (para Node.js)\n }\n});\n\nmodule.exports = i18next;\n\nEstrutura dos arquivos de tradução
\n\nCrie uma pasta locales na raiz do projeto. Dentro dela, para cada idioma, crie uma subpasta (por exemplo, en, ru, de). Em cada subpasta, coloque arquivos JSON com as traduções. Geralmente, usa-se um arquivo translation.json por idioma, mas é possível dividir em namespaces para modularidade.
Exemplo do arquivo locales/ru/translation.json:
{\n "welcome": "Bem-vindo ao nosso site!",\n "greeting": "Olá, {{name}}!",\n "items": "{{count}} elemento",\n "items_plural": "{{count}} elementos",\n "menu": {\n "home": "Início",\n "about": "Sobre",\n "contact": "Contato"\n }\n}\n\nExemplo do arquivo 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\nPrincipais funcionalidades do i18next
\n\nTradução simples
\n\nPara obter uma tradução, use a função t() (de "translate"):
const i18next = require('./i18n');\n\n// Inicialização assíncrona (em um projeto real, aguarde a prontidão)\ni18next.t('welcome'); // "Bem-vindo ao nosso site!" (se lng: 'ru')\n\nInterpolação de variáveis
\n\nInsira valores dinâmicos nas strings usando chaves duplas:
\n\ni18next.t('greeting', { name: 'Alexei' });\n// Resultado: "Olá, Alexei!"\n\nPluralização
\n\nA biblioteca seleciona automaticamente a forma plural correta com base nas regras do idioma. Para isso, adicione chaves com o sufixo _plural:
i18next.t('items', { count: 1 }); // "1 elemento"\ni18next.t('items', { count: 5 }); // "5 elementos"\n\nPara o inglês, a regra é mais simples (um item — item, muitos — items). Para o russo, o i18next usa regras de pluralização internas que consideram números 1, 2-4, 5-20, etc.
\n\nChaves aninhadas e namespaces
Também na biblioteca
ImageSharp para C# (.NET): guia completo com exemplos práticos
Configuração de aplicações Rust: bibliotecas config, envy e dotenvy
Sinon para JavaScript (Node.js): guia completo com exemplos práticos
RxSwift para Swift: guia completo com exemplos