
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 detetar automaticamente a região.
npm install react-i18next i18next i18next-browser-languagedetector i18next-http-backendConfigurar a instância de i18n
Crie um ficheiro de configuração de i18n que inicialize i18next com o idioma predefinido, os recursos de tradução e a cadeia de plugins. Este ficheiro tem de 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 ficheiro 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 ficheiros de tradução
Crie um ficheiro JSON por idioma. Utilize chaves aninhadas para organizar as cadeias 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 cadeias 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 ficheiros 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 deteção do idioma
Crie um seletor de idioma que chame i18n.changeLanguage(). Combine-o com o detetor do navegador para identificar automaticamente o idioma preferido do utilizador na primeira visita e guardar 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 ficheiros regionais com IA. No IDE, peça ao assistente para traduzir o ficheiro 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 ficheiros 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
Largue aqui o seu ficheiro de tradução
JSON, YAML, PO, XML, CSV, Markdown, Properties
ou clique para selecionar
Idiomas de destino