Aprenda a traducir una aplicación React utilizando react-i18next y archivos JSON en esta guía paso a paso de internacionalización de React.
Esta guía utiliza un pequeño proyecto React + Vite y lo prepara para la localización, incluyendo:
- Carga de archivos JSON de traducción
- Uso de la función
t()para las traducciones - Manejo de texto dinámico (interpolación, plurales, texto enriquecido con
<Trans />) - Traducción de archivos JSON con IA
Puede seguir los ejemplos de commit o aplicar los mismos pasos a su aplicación React existente.
En esta página
Qué necesita para traducir una aplicación React
Para seguir este tutorial, necesitará:
- Node.js y npm
- Conocimientos básicos de React
- Un editor de código como VS Code
Por supuesto, también necesitará una herramienta de traducción. Utilizaremos PTC (Private Translation Cloud) para crear archivos JSON traducidos. Puede registrarse para una prueba gratuita ahora o esperar hasta que lleguemos al paso de la traducción.
Configure la internacionalización de React (con ejemplos de commit)
1
Configure su aplicación React para la traducción
Si ya tiene una aplicación React, pase al paso 2.
Para crear una nueva aplicación React + TypeScript, abra su terminal, navegue a la carpeta donde guarda sus proyectos y ejecute:
npm create vite@latest react-localization-demo -- --template react-ts
cd react-localization-demo
npm install
npm run devEsto inicia un servidor de desarrollo y abre la página predeterminada de Vite + React en su navegador.
Referencia de commit: Crear proyecto React con Vite y TypeScript
2
Añada texto orientado al usuario a su aplicación React
Antes de añadir react-i18next, necesita preparar el texto del idioma de origen que desea traducir. Abra src/App.tsx y añada sus cadenas de texto orientadas al usuario:
function App() {
return (
<div>
<h1>Welcome</h1>
<p>This is a localization demo.</p>
<button onClick={() => alert('Click me')}>Click me</button>
</div>
);
}
Para los fines de nuestra demostración, hemos mantenido nuestra interfaz de usuario simple con un encabezado, descripción y botón.
Referencia de commit: Construir la interfaz de usuario básica con cadenas de texto estáticas en inglés
3
Configure react-i18next en su aplicación React
Ahora que su aplicación React muestra algo de texto básico en inglés, es hora de conectar react-i18next para que esas cadenas provengan de un archivo de traducción en lugar de estar codificadas.
Este paso tiene tres partes:
- Instale
i18nextyreact-i18next - Cree su archivo de traducción al inglés (
en.json) - Actualice su componente para usar el enlace
useTranslation
3.1 instale las bibliotecas i18n
Desde la carpeta de su proyecto, instale las bibliotecas:
npm install i18next react-i18nextEn este ejemplo:
i18nextes la biblioteca central de internacionalizaciónreact-i18nextañade enlaces de React como el hookuseTranslation
3.2 cree el archivo de origen en inglés para la traducción (en.json)
Cree la siguiente estructura de carpetas:
src/
i18n/
locales/
en.jsonLuego añada sus cadenas de texto en inglés a src/i18n/locales/en.json:
{
"welcome": "Welcome",
"description": "This is a localization demo.",
"clickMe": "Click me"
}Cada clave (welcome, description, clickMe) se asigna al texto que desea mostrar en la interfaz de usuario.
3.3 actualice app.tsx para usar useTranslation
Reemplace su texto en inglés codificado con llamadas a la función de traducción t().
El hook useTranslation() le da a su componente acceso a:
t()– busca una cadena por clavei18n– le permite cambiar de idioma programáticamente
Actualice src/App.tsx:
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;
Referencia de commit: Crear el archivo inicial en inglés para la traducción
4
Inicialice i18next y cargue archivos JSON automáticamente
En este momento, su componente llama a t('welcome'), pero i18next aún no sabe:
- Dónde vive
en.json - Qué idiomas existen
- Cuál debería ser el idioma predeterminado
En este paso, inicializará i18next y le dirá que cargue todos los archivos JSON de su carpeta de locales automáticamente utilizando import.meta.glob de Vite.
4.1 cree el archivo de configuración i18n
Cree un nuevo archivo en:
src/i18n/index.tsAñada la siguiente configuración:
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;Esta configuración es útil porque:
- Cada archivo
*.jsonque añada asrc/i18n/locales/estará disponible automáticamente. - Cuando PTC crea nuevos archivos de idioma (por ejemplo,
ar.json), esta configuración los cargará automáticamente, sin necesidad de importaciones ni cambios de código.
Referencia de commit: configurar la configuración de i18n
4.2 importe i18n en su punto de entrada de la aplicación
Antes de que React renderice su aplicación, i18next necesita la oportunidad de inicializarse. Para que eso suceda, debe importar su configuración i18n en el archivo de entrada.
Si omite este paso, t() simplemente devolverá claves de traducción en lugar de texto traducido.
Abra src/main.tsx y añada la importación resaltada:
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.tsx'
import './index.css'
import './i18n' // ← Add this import!
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<App />
</React.StrictMode>,
)
5
Maneje plurales, interpolación y texto enriquecido
Hasta ahora, solo ha utilizado cadenas estáticas como “Bienvenido” y “Haga clic aquí”. Pero las aplicaciones reales necesitan contenido dinámico:
- Incluir enlaces o formato dentro del texto traducido
- Saludar a los usuarios por su nombre
- Mostrar recuentos (“1 mensaje nuevo” vs “3 mensajes nuevos”)
5.1 interpolación: añadir variables a las traducciones
En lugar de codificar valores que cambian en tiempo de ejecución, puede interpolarlos en sus traducciones.
Para hacer esto, incluya una variable dentro de {{ }} en su JSON, luego pase el valor real al llamar a t().
Actualice src/i18n/locales/en.json:
{
"welcome": "Welcome",
"userGreeting": "Welcome back, {{firstName}}!",
"description": "This is a localization demo.",
"clickMe": "Click me"
}
Ahora actualice su componente para usar el saludo interpolado:
import { useTranslation } from 'react-i18next';
function App() {
const { t } = useTranslation();
const user = { firstName: 'Sarah' };
return (
<div>
<h1>{t('welcome')}</h1>
<p>{t('userGreeting', { firstName: user.firstName })}</p>
<p>{t('description')}</p>
<button onClick={() => alert(t('clickMe'))}>{t('clickMe')}</button>
</div>
);
}
export default App;
El segundo argumento para t() es un objeto con los valores que desea sustituir. Puede tener tantas variables como necesite, solo asegúrese de que cada una aparezca en sus traducciones.
5.2 Añada formas plurales
Algunos cambios de texto basados en un número. Por ejemplo, “1 mensaje nuevo” vs “3 mensajes nuevos”. i18next maneja esto automáticamente cuando proporciona formas plurales.
Actualice src/i18n/locales/en.json:
{
"welcome": "Welcome",
"userGreeting": "Welcome back, {{firstName}}!",
"description": "This is a localization demo.",
"clickMe": "Click me",
"newMessages_one": "You have {{count}} new message.",
"newMessages_other": "You have {{count}} new messages."
}
Para que la pluralización funcione, la variable interpolada debe llamarse count. i18next utiliza este valor para elegir la forma plural correcta para cada idioma.
Ahora utilícelo en su componente:
import { useTranslation } from 'react-i18next';
function App() {
const { t } = useTranslation();
const user = { firstName: 'Sarah' };
const [messageCount, setMessageCount] = useState<number>(1);
const handleIncrement = () => {
setMessageCount(messageCount + 1);
};
return (
<div>
<h1>{t('welcome')}</h1>
<p>{t('userGreeting', { firstName: user.firstName })}</p>
<p>{t('newMessages', { count: messageCount })}</p>
<p>{t('description')}</p>
<button onClick={handleIncrement}>{t('clickMe')}</button>
</div>
);
}
export default App;
i18next elegirá automáticamente newMessages (singular) cuando count sea 1, y newMessages_other (plural) para cualquier otro número.
5.3 componente trans: añadir formato y enlaces
A veces necesita formato (como texto en negrita) o elementos interactivos (como enlaces) dentro de una cadena traducida. El componente Trans le permite incluir elementos JSX (JavaScript XML) dentro de sus traducciones.
Primero, importe el componente Trans:
import { useTranslation, Trans } from 'react-i18next';Añada una nueva clave a src/i18n/locales/en.json:
{
"welcome": "Welcome",
"userGreeting": "Welcome back, {{firstName}}!",
"newMessages_one": "You have {{count}} new message.",
"newMessages_other": "You have {{count}} new messages.",
"description": "This is a localization demo.",
"termsText": "I agree to the <1>Terms of Service</1> and <3>Privacy Policy</3>.",
"clickMe": "Click me"
}
Observe las etiquetas <1> y <3>. Estos son marcadores de posición que se asignan a componentes secundarios por índice (comenzando desde 0).
Ahora utilice el componente Trans en su JSX:
import { useTranslation, Trans } from 'react-i18next';
function App() {
const { t } = useTranslation();
const user = { firstName: "Sarah" };
const [messageCount, setMessageCount] = useState<number>(1);
const handleIncrement = () => {
setMessageCount(messageCount + 1);
};
return (
<div>
<h1>{t("welcome")}</h1>
<p>{t("userGreeting", { firstName: user.firstName })}</p>
<p>{t("newMessages", { count: messageCount })}</p>
<p>{t("description")}</p>
<p>
<Trans i18nKey="termsText">
I agree to the <a href="/terms">Terms of Service</a> and
<a href="/privacy">Privacy Policy</a>.
</Trans>
</p>
<button onClick={handleIncrement}>{t("clickMe")}</button>
</div>
);
}
export default App;
Traduzca su aplicación React
En este punto, su aplicación está completamente lista para la internacionalización. Ahora es el momento de traducir su archivo en.json.
Hay diferentes maneras de hacer esto, pero nos centraremos en el uso de PTC para generar archivos JSON traducidos automáticamente. Permite la carga manual de archivos, la integración de Git o el uso de la API.
Para nuestro proyecto de demostración, integraremos PTC con nuestro repositorio de GitHub.
Paso 1
Configure un proyecto en PTC para traducir el archivo JSON
Para conectar su proyecto a PTC, regístrese para una prueba gratuita.
- Siga los pasos de la Guía de inicio para crear un nuevo proyecto.
- En el asistente de configuración, seleccione su archivo de origen (en nuestro caso,
src/i18n/locales/en.json) y elija su ruta de salida:
src/i18n/locales/{{lang}}.jsonEste patrón crea un archivo por idioma (por ejemplo, fr.json, de.json) utilizando la misma estructura de carpetas que su aplicación ya espera.
Paso 2
Obtenga archivos JSON traducidos y añádalos a su proyecto
Cuando sus traducciones estén listas, PTC le notificará. Sus próximos pasos dependen de cómo esté utilizando PTC:
| Si utiliza… | Qué sucede a continuación |
|---|---|
| Integración de Git | PTC abre una solicitud de extracción/fusión con nuevos archivos de idioma |
| Carga manual de archivos | Descargue el archivo JSON y colóquelo en src/i18n/locales/ |
| API de PTC | Utilice el punto final de recuperación de archivos |
Por ejemplo, si traduce al francés y utiliza la integración de Git, PTC devolverá fr.json y colocará el archivo en src/i18n/locales/fr.json.
Referencia de commit: PTC ReactLocalizationDemo : traducciones automáticas
Paso 3
Pruebe su aplicación React traducida con un selector de idiomas
Ahora que tiene al menos un archivo de traducción, añadamos un simple selector de idiomas para verificar que todo funciona.
Actualice src/App.tsx para añadir botones de selector de idiomas:
import { useTranslation } from 'react-i18next';
function App() {
const { t, i18n } = useTranslation();
return (
<div>
<h1>{t('welcome')}</h1>
<p>{t('userGreeting', { firstName: user.firstName })}</p>
<p>{t('newMessages', { count: messageCount })}</p>
<p>{t('description')}</p>
<p>
<Trans i18nKey="termsText">
I agree to the <a href="/terms">Terms of Service</a> and <a href="/privacy">Privacy Policy</a>.
</Trans>
</p>
<button onClick={() => alert(t('clickMe'))}>{t('clickMe')}</button>
<button onClick={() => i18n.changeLanguage('en')}>EN</button>
<button onClick={() => i18n.changeLanguage('fr')}>FR</button>
</div>
);
}
Ejecute su aplicación (npm run dev) y haga clic en los botones EN / FR. Cuando ejecute la aplicación en francés, el diseño debería verse exactamente igual que en inglés, solo cambia el idioma del texto.
Referencia de commit: Añadir un selector de idiomas para probar la traducción
Optimice la carga de traducciones y la detección de idiomas
Ahora que sus traducciones están funcionando, puede optimizar i18next para que su aplicación sea más rápida y fácil de usar, especialmente si admite varios idiomas.
Detección automática del idioma del usuario
De forma predeterminada, su aplicación se inicia en inglés y requiere que los usuarios cambien de idioma manualmente. Con la detección automática de idiomas, i18next comprueba el navegador, la URL o las preferencias guardadas y carga el idioma correcto al instante.
- Añada el paquete
i18next-browser-languagedetector:
npm install i18next-browser-languagedetector- Actualice su
src/i18n/index.ts:
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import LanguageDetector from "i18next-browser-languagedetector";
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(LanguageDetector) // detect browser/localStorage/etc.
.use(initReactI18next)
.init({
resources,
fallbackLng: "en",
supportedLngs: ["en", "fr", "de", "ar"], // adjust to your languages
interpolation: { escapeValue: false },
detection: {
order: ["querystring", "localStorage", "cookie", "navigator"],
caches: ["localStorage", "cookie"],
}
});
export default i18n;
Con esto en su lugar, los usuarios verán automáticamente la aplicación en su idioma preferido cuando esté disponible. Aún pueden cambiar manualmente si es necesario.
Carga diferida de traducciones
Actualmente, i18next carga todos los archivos de traducción al inicio. Esto está bien para uno o dos idiomas, pero si ofrece compatibilidad con muchos idiomas, el tamaño de su paquete puede crecer rápidamente.
La carga diferida soluciona esto descargando solo los archivos de idioma que necesita el usuario.
- Instale el backend HTTP:
npm install i18next-http-backend- Actualice su
src/i18n/index.ts:
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import Backend from "i18next-http-backend";
import LanguageDetector from "i18next-browser-languagedetector";
i18n
.use(Backend) // load JSON over HTTP
.use(LanguageDetector)
.use(initReactI18next)
.init({
fallbackLng: "en",
supportedLngs: ["en", "fr"],
interpolation: { escapeValue: false },
backend: {
loadPath: "/locales/{{lng}}/{{ns}}.json"
}
});
export default i18n;
- Después de habilitar el backend, i18next cargará los archivos de traducción a través de HTTP en lugar de agruparlos. Para que esto funcione, sus traducciones deben servirse desde una ruta pública que el navegador pueda solicitar:
public/
locales/
en/
translation.json
fr/
translation.jsonCon esta estructura, cada idioma reside en su propia carpeta, reflejando la parte {{lng}} de su loadPath. Por lo tanto, por ejemplo, cuando un usuario cambia a francés, i18next buscará:
/locales/fr/translation.json
Traduzca su aplicación React con PTC
Su aplicación está lista para la localización con i18next. Ahora, deje que PTC se encargue del trabajo de traducción por usted.
Comience su prueba gratuita y traduzca hasta 2500 palabras a 2 idiomas, luego active el pago por uso para pagar solo por lo que traduce.


Traduzca archivos JSON en aplicaciones React con IA
Obtenga traducciones contextualizadas en minutos
Cargue archivos o automatice mediante la API o la integración de Git
1
Comience una prueba gratuita
Traduzca 2500 palabras gratis.
2
Añada detalles rápidos del proyecto
Proporcione contexto sobre su aplicación y sus usuarios.
3
Obtenga traducciones
Descargue un ZIP o incorpore en su repositorio.