Cómo traducir una aplicación React con react-i18next
Configure react-i18next, traduzca en.json a más de 40 idiomas con IA y luego deje que la extensión de navegador de PTC (Private Translation Cloud) revise la aplicación React en ejecución en cada lanzamiento. Esta guía cubre la internacionalización de React de principio a fin: la configuración de react-i18next, el manejo de plurales y contenido dinámico, la traducción de su en.json a más de 40 idiomas con PTC y el cambio de idioma en tiempo de ejecución. Al final dispondrá de una configuración de localización de React funcional y lista para lanzar. Para una visión general de la herramienta autónoma de traducción de JSON, consulte traducir archivos JSON en línea con IA.
Cómo se ve una aplicación React localizada
Una aplicación React en la que:
- Todas las cadenas visibles para el usuario residen en archivos de traducción JSON dentro de
src/i18n/locales/(opublic/locales/). - Un selector de idioma alterna entre inglés, español, francés y alemán.
- El contenido dinámico (nombres de usuario, recuentos, fechas) se interpola correctamente según la configuración regional.
- Los plurales siguen las reglas de cada idioma de destino.
- Los archivos
.jsontraducidos los produce PTC, no se escriben a mano.
Paso 1: Crear una aplicación React + TypeScript con Vite
Esta guía utiliza una aplicación React + TypeScript creada con Vite. Si está añadiendo react-i18next a una aplicación existente, salte al Paso 2.
npm create vite@latest react-localization-demo -- --template react-ts
cd react-localization-demo
npm install
npm run dev
Esto inicia un servidor de desarrollo y abre la página predeterminada de Vite + React en su navegador.
Paso 2: Instalar react-i18next y reemplazar las cadenas codificadas por t()
npm install i18next react-i18next
Cree la estructura de carpetas de su React i18n:
src/
i18n/
locales/
en.json
Añada sus cadenas en inglés a src/i18n/locales/en.json:
{
"welcome": "Welcome",
"description": "This is a localization demo.",
"clickMe": "Click me"
}
Un componente React típico con cadenas codificadas:
function App() {
return (
<div>
<h1>Welcome</h1>
<p>This is a localization demo.</p>
<button onClick={() => alert('Click me')}>Click me</button>
</div>
);
}
Reemplace el texto codificado con el 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() devuelve:
t()- busca una cadena por su clave.i18n- le permite cambiar de idioma mediante programación.
Paso 3: Cargar automáticamente cada JSON de configuración regional con import.meta.glob
Cree src/i18n/index.ts para configurar i18next y cargar automáticamente los archivos de traducción. El patrón import.meta.glob significa que cada archivo .json que añada a src/i18n/locales/ se detecta automáticamente. Sin importaciones manuales al añadir nuevos 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 i18n antes de que se renderice su aplicación. Abra src/main.tsx y añada la importación:
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>,
);
Si omite este paso, t() devolverá las claves de traducción en lugar del texto traducido.
Paso 4: Interpolar variables, plurales y enlaces con las convenciones de i18next
Interpolar variables con {{variableName}}
Utilice la sintaxis {{variableName}} en su JSON y pase el valor a t(). Actualice 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>
El segundo argumento de t() es un objeto con los valores que desea sustituir. Tantas variables como necesite.
Pluralizar con los sufijos de clave _one / _other
Utilice el patrón de sufijos _one / _other. La variable debe llamarse count:
{
"newMessages_one": "You have {{count}} new message.",
"newMessages_other": "You have {{count}} new messages."
}
<p>{t('newMessages', { count: messageCount })}</p>
i18next selecciona automáticamente la forma plural correcta. También maneja idiomas con más de dos formas plurales (polaco, árabe, ruso) sin configuración adicional.
Traducir enlaces y HTML con el componente Trans
Para traducciones que contienen elementos HTML como enlaces o texto en negrita, utilice el componente Trans:
{
"termsText": "I agree to the <1>Terms of Service</1> and <3>Privacy Policy</3>."
}
Las etiquetas <1> y <3> son marcadores de posición basados en índices que se asignan a los elementos secundarios (contando desde 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>
Esto mantiene sus elementos JSX dentro del componente y, al mismo tiempo, permite a los traductores reordenar el texto circundante de forma natural.
Formatear fechas, números y monedas con Intl
Utilice los formateadores de Intl en lugar de incrustar cadenas de formato en sus traducciones:
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>
Paso 5: Traducir los archivos JSON con PTC en 5 pasos
Ahora tiene en.json y necesita producir es.json, fr.json, de.json, etc. PTC está diseñado exactamente para esto.
- Inicie un proyecto de PTC y elija el inglés como idioma de origen. La prueba gratuita cubre 20.000 palabras a 2 idiomas, sin tarjeta de crédito.
- Suba
en.json. PTC analiza la estructura anidada, reconoce los marcadores de posición de i18next ({{name}},{{count}}) y detecta los sufijos de plural (_one,_other). - Añada una breve descripción de su aplicación React y de su público. PTC utiliza este contexto para ajustar el tono y la terminología en todos los idiomas.
- Elija los idiomas de destino y confirme. PTC produce un archivo
.jsontraducido por cada idioma de destino, estructuralmente idéntico al de origen. Las mismas claves, el mismo anidamiento, los mismos marcadores de posición. Valores traducidos. - Coloque los archivos en
src/i18n/locales/. Gracias a la carga automática deimport.meta.globque configuró en el Paso 3, los nuevos archivos funcionan de inmediato sin cambios en el código.
Una vez que haya traducido su primer archivo con PTC, puede pasar a un proceso automatizado. Conecte su repositorio de GitHub, GitLab o Bitbucket mediante la integración con Git, o utilice la PTC API para integrar la traducción en su flujo de CI/CD. Las nuevas cadenas en en.json desencadenan una traducción automática. PTC abre un PR con los archivos actualizados en el idioma de destino.
Paso 6: Verificar la configuración con un selector de idioma
Añada botones de idioma para verificar que su configuración de react-i18next funciona:
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() desencadena un nuevo renderizado de cada componente que utiliza useTranslation(), por lo que toda la interfaz se actualiza de inmediato. Sin recargar la página.
Detectar automáticamente el idioma del usuario con i18next-browser-languagedetector
Instale i18next-browser-languagedetector para cargar automáticamente el idioma correcto a partir de la configuración del navegador, la URL o las preferencias guardadas del usuario:
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'],
},
});
Cargar traducciones de forma diferida con i18next-http-backend
De forma predeterminada, todos los archivos de traducción se empaquetan en el momento de la compilación. Para aplicaciones con muchos idiomas, utilice i18next-http-backend para obtener únicamente el idioma que el usuario realmente necesita:
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' },
});
Mueva sus archivos de traducción a public/locales/ para que se sirvan como activos estáticos:
public/
locales/
en/translation.json
fr/translation.json
Cambiar a francés ahora obtiene /locales/fr/translation.json bajo demanda en lugar de empaquetarlo. El paquete inicial se mantiene reducido independientemente de cuántos idiomas admita.
Revisión visual de la traducción de su aplicación React en ejecución - lanzar sin QA manual por lanzamiento
Después de que PTC traduzca su en.json, aún necesita verificar la aplicación React en ejecución. Una etiqueta traducida puede desbordar un botón en alemán. "Save" puede traducirse como sustantivo en francés cuando la interfaz necesitaba un verbo. Una cadena en inglés codificada fuera de t() se renderizará sin traducir, sin importar cuántos idiomas lance.
La revisión visual con IA de PTC sustituye la pasada de QA manual. Para aplicaciones basadas en navegador como React, la variante adecuada es la extensión de navegador. Instálela una vez y grabe un recorrido breve de los flujos de usuario críticos de su aplicación React (inicio de sesión, función principal, ajustes). A partir de entonces, PTC reproduce la grabación en cada idioma de destino tras cada actualización de traducción, captura cada pantalla e inspecciona el resultado renderizado:
- Correcciones en los archivos de traducción cuando PTC los controla. PTC vuelve a traducir una categoría gramatical incorrecta, elige un sinónimo más corto que se ajuste a un botón o regenera una forma plural.
- Indicaciones de Cursor / Claude Code cuando el problema está en el código de su componente. Una cadena en inglés codificada fuera de
t(), una oración construida mediante concatenación de cadenas en lugar det('key', { var }), un componenteTransfaltante para traducciones de texto enriquecido.
El resultado: la revisión como un paso de CI. Cada lanzamiento se envía con verificación visual en todos los idiomas de destino, sin cuellos de botella humanos.
Traducir notas de versión, páginas de marketing y correos electrónicos a clientes
Sus notas de versión, páginas de marketing, páginas de aterrizaje y correos electrónicos a clientes residen fuera de en.json. La función «Paste to Translate» de PTC maneja ese texto en el mismo proyecto. Pegue el texto de origen en el panel de PTC, elija los idiomas de destino y obtenga traducciones que utilicen el mismo glosario y la misma voz de marca que las cadenas de la interfaz React.
Traducir comentarios de usuarios, publicaciones y resultados de búsqueda con la PTC API
Los comentarios de usuarios, las publicaciones, los resultados de búsqueda y cualquier otro contenido generado por usuarios que maneje su aplicación React necesitan traducirse a medida que llegan. La PTC REST API traduce este contenido bajo demanda con autenticación mediante token Bearer, utilizando el mismo glosario y la misma voz de marca que las traducciones de su en.json.
Ahora traduzca su archivo en.json
Comience su prueba gratuita de 30 días - 20.000 palabras a 2 idiomas, sin tarjeta de crédito. Dos vías:
- Manual: suba
src/i18n/locales/en.jsonen la página de traducción de JSON. - Mediante CI: conecte su repositorio de Git a través de la PTC API y las traducciones se realizarán automáticamente en cada push.
En cualquier caso, instale la extensión de navegador y deje que la revisión visual con IA verifique su aplicación React en ejecución en cada idioma antes de lanzarla.