
Guía completa de internacionalización en React
Del inicio a una aplicación multilingüe: configure i18n en su aplicación React y automatice después las traducciones con IA.
Instalar paquetes
Necesita tres paquetes: react-i18next —los enlaces para React—, i18next —la biblioteca principal— y, opcionalmente, i18next-browser-languagedetector para detectar automáticamente la configuración regional.
npm install react-i18next i18next i18next-browser-languagedetector i18next-http-backendConfigurar la instancia de i18n
Cree un archivo de configuración de i18n que inicialice i18next con el idioma predeterminado, los recursos de traducción y la cadena de plugins. Debe importar este archivo en el punto de entrada de la aplicación antes de renderizar cualquier componente.
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 la aplicación con I18nextProvider
Importe el archivo de configuración de i18n en la raíz de la aplicación y envuelva el árbol de componentes con I18nextProvider. Sin él, useTranslation() devuelve las claves sin traducir en lugar del texto traducido.
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>
);Crear archivos de traducción
Cree un archivo JSON por idioma. Utilice claves anidadas para organizar las cadenas por funcionalidad o página. Mantenga el idioma de origen —normalmente el inglés— como única fuente de referencia.
// 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 traducciones en los componentes
Llame a useTranslation() en cualquier componente para obtener la función t(). Utilícela con cadenas sencillas, variables interpoladas y traducciones que incluyan JSX mediante el 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" />
}} />
);
}Gestionar plurales y variables
i18next gestiona los plurales con reglas CLDR, no solo singular y plural. El árabe tiene 6 formas (zero, one, two, few, many y other) y el japonés 1 (other). Defina en los archivos de traducción todas las formas necesarias e i18next seleccionará automáticamente la correcta.
// 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}}個のアイテム"
}Añadir el cambio y la detección de idioma
Cree un selector de idioma que llame a i18n.changeLanguage(). Combínelo con el detector del navegador para identificar automáticamente el idioma preferido del usuario en la primera visita y conservar después su elección 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 traducciones
Cuando termine de configurar i18n, traduzca sus archivos de configuración regional con IA. Pida a su asistente de IA desde el IDE que traduzca el archivo de origen o utilice la CLI de i18n Agent en su proceso 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 la calidad de la traducción
Errores habituales
Las traducciones muestran las claves sin procesar
Error de Suspense sin alternativa
Discrepancia de hidratación con SSR
Sin autocompletado para las claves de traducción
Estructura de archivos 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.jsonTambién puede traducir:
Pruebe i18n Agent ahora
Arrastre y suelte aquí su archivo de traducción
JSON, YAML, PO, XML, CSV, Markdown, Properties
o haga clic para seleccionar
Idiomas de destino