
O guia completo da internacionalização em React
De um idioma a vários: configure i18n na sua aplicação React e automatize as traduções com IA.
Instalar os pacotes
Precisa de três pacotes: react-i18next —as associações React—, i18next —a biblioteca principal— e, opcionalmente, i18next-browser-languagedetector para detectar automaticamente a localidade.
npm install react-i18next i18next i18next-browser-languagedetector i18next-http-backendConfigurar a instância de i18n
Crie um arquivo de configuração de i18n que inicialize i18next com o idioma predefinido, os recursos de tradução e a cadeia de plugins. Este arquivo deve ser importado no ponto de entrada da aplicação antes de qualquer componente ser apresentado.
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
import Backend from 'i18next-http-backend';
i18n
.use(Backend)
.use(LanguageDetector)
.use(initReactI18next) // Must come before .init()
.init({
fallbackLng: 'en',
debug: process.env.NODE_ENV === 'development',
interpolation: {
escapeValue: false, // React already escapes
},
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json',
},
});
export default i18n;Envolver a aplicação com I18nextProvider
Importe o arquivo de configuração de i18n na raiz da aplicação e envolva a árvore de componentes com I18nextProvider. Sem isto, useTranslation() devolve chaves em bruto em vez de texto traduzido.
import React, { Suspense } from 'react';
import ReactDOM from 'react-dom/client';
import { I18nextProvider } from 'react-i18next';
import i18n from './i18n'; // Import your config
import App from './App';
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<Suspense fallback={<div>Loading...</div>}>
<I18nextProvider i18n={i18n}>
<App />
</I18nextProvider>
</Suspense>
</React.StrictMode>
);Criar arquivos de tradução
Crie um arquivo JSON por idioma. Utilize chaves aninhadas para organizar as strings por funcionalidade ou página. Mantenha o idioma de origem —normalmente inglês— como única fonte de referência.
// public/locales/en/translation.json
{
"nav": {
"home": "Home",
"about": "About",
"settings": "Settings"
},
"greeting": "Hello, {{name}}!",
"cart": {
"itemCount_one": "{{count}} item",
"itemCount_other": "{{count}} items"
}
}
// public/locales/de/translation.json
{
"nav": {
"home": "Startseite",
"about": "Über uns",
"settings": "Einstellungen"
},
"greeting": "Hallo, {{name}}!",
"cart": {
"itemCount_one": "{{count}} Artikel",
"itemCount_other": "{{count}} Artikel"
}
}Utilizar traduções nos componentes
Chame useTranslation() em qualquer componente para obter a função t(). Utilize-a para strings simples, variáveis interpoladas e traduções com JSX incorporado através do componente Trans.
import { useTranslation } from 'react-i18next';
function Greeting({ userName }: { userName: string }) {
const { t } = useTranslation();
return (
<div>
<h1>{t('greeting', { name: userName })}</h1>
<nav>
<a href="/">{t('nav.home')}</a>
<a href="/about">{t('nav.about')}</a>
</nav>
</div>
);
}import { Trans, useTranslation } from 'react-i18next';
// For JSX inside translations:
// "terms": "By signing up, you agree to our <link>Terms</link>."
function SignUp() {
const { t } = useTranslation();
return (
<Trans i18nKey="terms" components={{
link: <a href="/terms" className="underline" />
}} />
);
}Tratar plurais e variáveis
i18next trata os plurais segundo as regras CLDR, não apenas singular e plural. O árabe tem 6 formas —zero, one, two, few, many e other— e o japonês tem 1 —other—. Defina todas as formas necessárias nos arquivos de tradução e i18next seleciona automaticamente a correta.
// English: 2 forms (one, other)
{
"itemCount_one": "{{count}} item",
"itemCount_other": "{{count}} items"
}
// Arabic: 6 forms (zero, one, two, few, many, other)
{
"itemCount_zero": "لا عناصر",
"itemCount_one": "عنصر واحد",
"itemCount_two": "عنصران",
"itemCount_few": "{{count}} عناصر",
"itemCount_many": "{{count}} عنصرًا",
"itemCount_other": "{{count}} عنصر"
}
// Japanese: 1 form (other)
{
"itemCount_other": "{{count}}個のアイテム"
}Adicionar seleção e detecção do idioma
Crie um seletor de idioma que chame i18n.changeLanguage(). Combine-o com o detector do navegador para identificar automaticamente o idioma preferido do usuário na primeira visita e salvar depois a escolha explícita.
import { useTranslation } from 'react-i18next';
const LANGUAGES = [
{ code: 'en', label: 'English' },
{ code: 'de', label: 'Deutsch' },
{ code: 'ja', label: '日本語' },
{ code: 'es', label: 'Español' },
];
function LanguageSwitcher() {
const { i18n } = useTranslation();
return (
<select
value={i18n.language}
onChange={(e) => i18n.changeLanguage(e.target.value)}
>
{LANGUAGES.map(({ code, label }) => (
<option key={code} value={code}>{label}</option>
))}
</select>
);
}Automatizar as traduções
Depois de concluir a configuração de i18n, traduza os arquivos de localidade com IA. No IDE, peça ao assistente para traduzir o arquivo de origem ou utilize a CLI do i18n Agent no seu pipeline de CI/CD.
# In your IDE, ask your AI assistant:
> Translate public/locales/en/translation.json to German, Japanese, and Spanish
✓ de/translation.json created (1.2s)
✓ ja/translation.json created (1.5s)
✓ es/translation.json created (1.1s)
# Or use the CLI in CI/CD:
npx i18n-agent translate public/locales/en/translation.json --lang de,ja,esAutomatizar a qualidade das traduções
Erros frequentes
As traduções mostram chaves em bruto
Erro de Suspense sem alternativa
Incompatibilidade da hidratação SSR
Sem conclusão automática das chaves de tradução
Estrutura de arquivos recomendada
my-react-app/
├── public/
│ └── locales/
│ ├── en/
│ │ ├── translation.json # Default namespace
│ │ ├── common.json # Shared strings
│ │ └── dashboard.json # Feature namespace
│ ├── de/
│ │ ├── translation.json
│ │ ├── common.json
│ │ └── dashboard.json
│ └── ja/
│ └── ...
├── src/
│ ├── i18n.ts # i18n configuration
│ ├── main.tsx # App entry with Provider
│ ├── App.tsx
│ └── components/
│ └── LanguageSwitcher.tsx
└── package.jsonExperimente já o i18n Agent
Solte aqui seu arquivo de tradução
JSON, YAML, PO, XML, CSV, Markdown, Properties
ou clique para selecionar
Idiomas de destino