Como traduzir um aplicativo React com react-i18next
Configure o react-i18next, traduza en.json para 40+ idiomas com IA e, em seguida, deixe a extensão do navegador da PTC (Private Translation Cloud) revisar o aplicativo React em execução a cada lançamento. Este guia cobre a internacionalização do React de ponta a ponta: configuração do react-i18next, manipulação de plurais e conteúdo dinâmico, tradução do seu en.json para 40+ idiomas com a PTC e troca de idiomas em tempo de execução. Ao final, você terá uma configuração de localização do React funcionando e pronta para publicar. Para a visão geral da ferramenta independente de tradução de JSON, consulte traduzir arquivos JSON online com IA.
Como é um aplicativo React localizado
Um aplicativo React onde:
- Todas as strings voltadas para o usuário ficam em arquivos de tradução JSON em
src/i18n/locales/(oupublic/locales/). - Um seletor de idiomas alterna entre inglês, espanhol, francês e alemão.
- O conteúdo dinâmico (nomes de usuários, contagens, datas) é interpolado corretamente por locale.
- Os plurais seguem as regras de cada idioma de destino.
- Os arquivos
.jsontraduzidos são produzidos pela PTC, não escritos à mão.
Passo 1: Gerar a estrutura inicial de um aplicativo React + TypeScript com Vite
Este guia usa um aplicativo React + TypeScript construído com Vite. Se você estiver adicionando o react-i18next a um aplicativo existente, pule para o Passo 2.
npm create vite@latest react-localization-demo -- --template react-ts
cd react-localization-demo
npm install
npm run dev
Isso inicia um servidor de desenvolvimento e abre a página padrão do Vite + React no seu navegador.
Passo 2: Instalar o react-i18next e substituir as strings hardcoded por t()
npm install i18next react-i18next
Crie a estrutura de pastas i18n do seu React:
src/
i18n/
locales/
en.json
Adicione suas strings em inglês ao src/i18n/locales/en.json:
{
"welcome": "Welcome",
"description": "This is a localization demo.",
"clickMe": "Click me"
}
Um componente React típico com strings hardcoded:
function App() {
return (
<div>
<h1>Welcome</h1>
<p>This is a localization demo.</p>
<button onClick={() => alert('Click me')}>Click me</button>
</div>
);
}
Substitua o texto hardcoded pelo hook useTranslation:
import { useTranslation } from 'react-i18next';
function App() {
const { t } = useTranslation();
return (
<div>
<h1>{t('welcome')}</h1>
<p>{t('description')}</p>
<button onClick={() => alert(t('clickMe'))}>{t('clickMe')}</button>
</div>
);
}
export default App;
useTranslation() retorna:
t()- busca uma string por chave.i18n- permite que você mude de idioma programaticamente.
Passo 3: Carregar automaticamente cada JSON de locale com import.meta.glob
Crie src/i18n/index.ts para configurar o i18next e carregar automaticamente os arquivos de tradução. O padrão import.meta.glob significa que cada arquivo .json que você adiciona a src/i18n/locales/ é detectado automaticamente. Sem importações manuais ao adicionar novos idiomas:
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
type TranslationResources =
| string
| { [k: string]: TranslationResources }
| TranslationResources[];
const modules = import.meta.glob<{ default: Record<string, TranslationResources> }>(
'./locales/*.json',
{ eager: true }
);
const resources: Record<string, { translation: Record<string, TranslationResources> }> = {};
for (const path in modules) {
const lang = path.match(/\.\/locales\/(.*)\.json$/)?.[1];
if (lang) {
resources[lang] = { translation: modules[path].default };
}
}
i18n
.use(initReactI18next)
.init({
resources,
fallbackLng: 'en',
interpolation: { escapeValue: false },
});
export default i18n;
Importe o i18n antes da renderização do seu aplicativo. Abra src/main.tsx e adicione a importação:
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App.tsx';
import './index.css';
import './i18n'; // <- add this
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<App />
</React.StrictMode>,
);
Se você pular este passo, t() retornará as chaves de tradução em vez do texto traduzido.
Passo 4: Interpolar variáveis, plurais e links com as convenções do i18next
Interpolar variáveis com {{variableName}}
Use a sintaxe {{variableName}} no seu JSON e passe o valor para t(). Atualize en.json:
{
"welcome": "Welcome",
"userGreeting": "Welcome back, {{firstName}}!",
"description": "This is a localization demo.",
"clickMe": "Click me"
}
const user = { firstName: 'Sarah' };
<p>{t('userGreeting', { firstName: user.firstName })}</p>
O segundo argumento para t() é um objeto com os valores que você deseja substituir. Quantas variáveis você precisar.
Pluralizar com os sufixos de chave _one / _other
Use o padrão de sufixo _one / _other. A variável deve se chamar count:
{
"newMessages_one": "You have {{count}} new message.",
"newMessages_other": "You have {{count}} new messages."
}
<p>{t('newMessages', { count: messageCount })}</p>
O i18next seleciona a forma plural correta automaticamente. Ele também lida com idiomas que têm mais de duas formas plurais (polonês, árabe, russo) sem configuração extra.
Traduzir links e HTML com o componente Trans
Para traduções contendo elementos HTML como links ou texto em negrito, use o componente Trans:
{
"termsText": "I agree to the <1>Terms of Service</1> and <3>Privacy Policy</3>."
}
As tags <1> e <3> são placeholders baseados em índice que mapeiam para elementos filhos (contando a partir de 0):
import { Trans } from 'react-i18next';
<Trans i18nKey="termsText">
I agree to the <a href="/terms">Terms of Service</a> and <a href="/privacy">Privacy Policy</a>.
</Trans>
Isso mantém seus elementos JSX no componente, ao mesmo tempo em que permite que os tradutores reordenem o texto ao redor naturalmente.
Formatar datas, números e moedas com Intl
Use os formatadores Intl em vez de incorporar strings de formato nas suas traduções:
const formatDate = (date: Date, locale: string) =>
new Intl.DateTimeFormat(locale, { dateStyle: 'long' }).format(date);
const formatCurrency = (amount: number, locale: string, currency: string) =>
new Intl.NumberFormat(locale, { style: 'currency', currency }).format(amount);
const { i18n } = useTranslation();
<p>{formatDate(new Date(), i18n.language)}</p>
<p>{formatCurrency(199.99, i18n.language, 'EUR')}</p>
Passo 5: Traduzir os arquivos JSON com a PTC em 5 passos
Agora você tem en.json e precisa produzir es.json, fr.json, de.json, etc. A PTC foi projetada exatamente para isso.
- Inicie um projeto na PTC e escolha o inglês como idioma de origem. O teste cobre 20.000 palavras em 2 idiomas, sem cartão de crédito.
- Faça o upload de
en.json. A PTC analisa a estrutura aninhada, reconhece os placeholders do i18next ({{name}},{{count}}) e detecta os sufixos plurais (_one,_other). - Adicione uma breve descrição do seu aplicativo React e do seu público-alvo. A PTC usa esse contexto para adequar o tom e a terminologia em todos os idiomas.
- Escolha os idiomas de destino e confirme. A PTC produz um
.jsontraduzido por idioma de destino, estruturalmente idêntico à origem. Mesmas chaves, mesmo aninhamento, mesmos placeholders. Valores traduzidos. - Coloque os arquivos em
src/i18n/locales/. Devido ao carregamento automático doimport.meta.globque você configurou no Passo 3, os novos arquivos funcionam imediatamente, sem alterações de código.
Depois de traduzir seu primeiro arquivo com a PTC, você pode passar para um processo automatizado. Conecte seu repositório do GitHub, GitLab ou Bitbucket via integração com Git, ou use a API da PTC para conectar a tradução ao seu pipeline de CI/CD. Novas strings em en.json acionam a tradução automática. A PTC abre um merge request com os arquivos atualizados nos idiomas de destino.
Passo 6: Verificar a configuração com um seletor de idiomas
Adicione botões de idioma para verificar se a sua configuração do react-i18next está funcionando:
import { useTranslation } from 'react-i18next';
function App() {
const { t, i18n } = useTranslation();
return (
<div>
<h1>{t('welcome')}</h1>
<button onClick={() => i18n.changeLanguage('en')}>EN</button>
<button onClick={() => i18n.changeLanguage('fr')}>FR</button>
</div>
);
}
i18n.changeLanguage() aciona uma nova renderização de cada componente usando useTranslation(), de modo que toda a UI é atualizada imediatamente. Sem recarregar a página.
Detectar automaticamente o idioma do usuário com i18next-browser-languagedetector
Instale i18next-browser-languagedetector para carregar automaticamente o idioma correto a partir das configurações do navegador do usuário, URL ou preferências salvas:
npm install i18next-browser-languagedetector
import LanguageDetector from 'i18next-browser-languagedetector';
i18n
.use(LanguageDetector)
.use(initReactI18next)
.init({
resources,
fallbackLng: 'en',
supportedLngs: ['en', 'fr', 'de', 'ar'],
interpolation: { escapeValue: false },
detection: {
order: ['querystring', 'localStorage', 'cookie', 'navigator'],
caches: ['localStorage', 'cookie'],
},
});
Carregue as traduções sob demanda com i18next-http-backend
Por padrão, todos os arquivos de tradução são incluídos no bundle no momento do build. Para aplicativos com muitos idiomas, use i18next-http-backend para buscar apenas o idioma que o usuário realmente precisa:
npm install i18next-http-backend
import Backend from 'i18next-http-backend';
i18n
.use(Backend)
.use(LanguageDetector)
.use(initReactI18next)
.init({
fallbackLng: 'en',
supportedLngs: ['en', 'fr'],
interpolation: { escapeValue: false },
backend: { loadPath: '/locales/{{lng}}/{{ns}}.json' },
});
Mova seus arquivos de tradução para public/locales/ para que sejam servidos como recursos estáticos:
public/
locales/
en/translation.json
fr/translation.json
Mudar para o francês agora busca /locales/fr/translation.json sob demanda em vez de incluí-lo no bundle. O bundle inicial permanece enxuto, independentemente de quantos idiomas você suporta.
Revisão visual de tradução do seu aplicativo React em execução - publique sem QA manual por lançamento
Depois que a PTC traduzir seu en.json, você ainda precisa verificar o aplicativo React em execução. Um rótulo traduzido pode causar um estouro em um botão em alemão. “Save” pode ser traduzido como um substantivo em francês quando a UI precisava de um verbo. Uma string hardcoded em inglês fora de t() será renderizada sem tradução, independentemente de quantos idiomas você publicar.
O AI Visual QA da PTC substitui o passe de QA manual. Para aplicativos baseados em navegador como o React, a variante certa é a extensão do navegador. Instale-a uma vez e crie um curto percurso gravado dos fluxos de usuário críticos do seu aplicativo React (login, recurso principal, configurações). A partir de então, a PTC reproduz a gravação em cada idioma de destino após cada atualização de tradução, faz a captura de cada tela e inspeciona o resultado renderizado:
- Correções nos arquivos de tradução quando a PTC os controla. A PTC retraduz uma classe gramatical errada, escolhe um sinônimo mais curto que caiba em um botão, regenera uma forma plural.
- Prompts do Cursor / Claude Code quando o problema está no código do seu componente. Uma string hardcoded em inglês fora de
t(), uma frase construída por concatenação de strings em vez det('key', { var }), um componenteTransausente para traduções de rich-text.
O resultado: revisão-como-etapa-de-CI. Cada lançamento é publicado com verificação visual em todos os idiomas de destino, sem gargalos humanos.
Traduzir notas de lançamento, páginas de marketing e e-mails de clientes
Suas notas de lançamento, páginas de marketing, landing pages e e-mails de clientes ficam fora de en.json. O Paste to Translate da PTC lida com esse texto no mesmo projeto. Cole o texto de origem no painel da PTC, escolha os idiomas de destino e receba traduções que usam o mesmo glossário e a mesma voz da marca que as suas strings de UI do React.
Traduzir comentários de usuários, postagens e resultados de pesquisa com a API da PTC
Comentários de usuários, postagens, resultados de pesquisa e qualquer outro conteúdo gerado pelo usuário com o qual o seu aplicativo React lida precisam de tradução assim que chegam. A API REST da PTC traduz esse conteúdo sob demanda com autenticação por token Bearer, usando o mesmo glossário e a mesma voz da marca que as suas traduções de en.json.
Agora traduza o seu arquivo en.json
Comece seu teste de 30 dias - 20.000 palavras em 2 idiomas, sem cartão de crédito. Dois caminhos:
- Manual: faça o upload de
src/i18n/locales/en.jsonna página de tradução de JSON. - Orientado por CI: conecte seu repositório Git via API da PTC e as traduções acontecem automaticamente a cada push.
De qualquer forma, instale a extensão do navegador e deixe o AI Visual QA verificar o seu aplicativo React em execução em todos os idiomas antes de você publicar.