Internacionalização (i18n) em TypeScript com a biblioteca i18next
\n\nInternacionalização (i18n) é o processo de desenvolvimento de uma aplicação que pode se adaptar a diferentes idiomas e padrões regionais sem alterar o código-fonte. Para aplicações TypeScript, uma das bibliotecas mais poderosas e populares é o i18next. Ela suporta todos os frameworks modernos (React, Vue, Angular) e oferece suporte de primeira classe para TypeScript, permitindo criar traduções com segurança de tipos.
\n\nInstalação e configuração básica
\n\nPara começar, instale os pacotes i18next e os backends necessários. No exemplo abaixo, é usado um backend de arquivos para carregar arquivos JSON com as traduções:
\n\nnpm install i18next i18next-fs-backend\n# Para React, adicionalmente:\nnpm install react-i18next\n\nCrie um arquivo de configuração i18n.ts:
import i18n from 'i18next';\nimport Backend from 'i18next-fs-backend';\nimport { initReactI18next } from 'react-i18next';\n\ni18n\n .use(Backend)\n .use(initReactI18next)\n .init({\n fallbackLng: 'ru',\n debug: process.env.NODE_ENV === 'development',\n interpolation: {\n escapeValue: false,\n },\n backend: {\n loadPath: '/locales/{{lng}}/{{ns}}.json',\n },\n });\n\nexport default i18n;\n\nEstrutura dos arquivos de tradução
\n\nCrie a pasta public/locales com subpastas para cada idioma. Por exemplo:
- \n
public/locales/ru/translation.json\n public/locales/en/translation.json\n
Exemplo de conteúdo do arquivo ru/translation.json:
{\n "greeting": "Привет, {{name}}!",\n "items": "У вас {{count}} сообщение",\n "items_plural": "У вас {{count}} сообщений",\n "nested": {\n "title": "Заголовок",\n "description": "Описание"\n }\n}\n\nVersão em inglês en/translation.json:
{\n "greeting": "Hello, {{name}}!",\n "items": "You have {{count}} message",\n "items_plural": "You have {{count}} messages",\n "nested": {\n "title": "Title",\n "description": "Description"\n }\n}\n\nTipagem de traduções em TypeScript
\n\nUma das principais vantagens do i18next é a tipagem estrita. Crie um arquivo types/i18n.d.ts:
import 'i18next';\n\ndeclare module 'i18next' {\n interface CustomTypeOptions {\n defaultNS: 'translation';\n resources: {\n translation: {\n greeting: string;\n items: string;\n items_plural: string;\n nested: {\n title: string;\n description: string;\n };\n };\n };\n }\n}\n\nAgora o TypeScript verificará as chaves de tradução em tempo de compilação. Se você tentar usar uma chave inexistente, receberá um erro.
\n\nUso em componentes React
\n\nA biblioteca react-i18next fornece o hook useTranslation e o componente Trans:
import { useTranslation } from 'react-i18next';\n\nfunction Welcome() {\n const { t, i18n } = useTranslation();\n\n const changeLanguage = (lng: string) => {\n i18n.changeLanguage(lng);\n };\n\n return (\n <div>\n <h2>{t('greeting', { name: 'Иван' })}</h2>\n <button onClick={() => changeLanguage('en')}>English</button>\n <button onClick={() => changeLanguage('ru')}>Русский</button>\n </div>\n );\n}\n\nPluralização e interpolação
\n\nO i18next suporta regras complexas de plural. Em russo, há três formas (1, 2-4, 5+), em inglês, duas. A biblioteca seleciona automaticamente a forma correta com base no número:
\n\n// No arquivo de tradução (ru):\n{\n "apple": "{{count}} яблоко",\n "apple_plural": "{{count}} яблока",\n "apple_plural_2": "{{count}} яблок"\n}\n\n// Uso:\nconst