Guía de localización de React

Localización de React: guía completa de i18n

Compara las principales bibliotecas de i18n para React, estructura catálogos de mensajes, implementa plurales y formatos, cambia de configuración regional de forma accesible y prepara las páginas localizadas para el rendimiento y las búsquedas.

Por qué la localización compete a la aplicación en React

React se centra deliberadamente en componer interfaces de usuario. No prescribe un catálogo de mensajes, un router de configuración regional, un cargador de traducciones ni un flujo de contenido. Esa flexibilidad es útil, pero significa que la arquitectura de localización corresponde a la aplicación. Si las cadenas permanecen incrustadas en los componentes hasta el lanzamiento, el primer idioma nuevo deja al descubierto a la vez todas las suposiciones sobre gramática, formato, diseño y carga de datos.

La localización es más que sustituir palabras en inglés. Un saludo puede interpolar un nombre, el número de artículos de un carrito puede necesitar varias categorías de plural y un precio combina reglas de moneda con el formato regional. Los traductores necesitan mensajes completos y contexto; los componentes, API estables y respaldos predecibles. Tratar cada nodo de texto como una consulta independiente suele producir textos poco naturales y código frágil.

Las páginas públicas de React añaden otra limitación: usuarios y rastreadores deben recibir contenido significativo en una URL estable para la configuración regional. Cambiar el idioma únicamente en el navegador después de la hidratación puede mostrar fugazmente el idioma equivocado, duplicar URL y ocultar variantes a los motores de búsqueda. Aunque el producto en sí sea una aplicación cliente, sus páginas de marketing y ayuda se benefician de la generación estática o el renderizado en servidor mediante un framework de React.

  • El JSX con texto codificado directamente mezcla el contenido del producto con el comportamiento del componente.
  • Los fragmentos concatenados rompen la gramática cuando cambia el orden de las palabras.
  • Las fechas, los números, las monedas y los plurales siguen reglas específicas de cada configuración regional.
  • La detección de la configuración regional solo en el cliente puede causar parpadeos y dificultar el rastreo.

Conceptos básicos antes de elegir una biblioteca

Empieza con una única fuente de verdad para las configuraciones regionales compatibles. Almacena juntos el código de configuración regional, el nombre visible, la dirección del texto y la relación de respaldo. El análisis de rutas, el selector de idioma, los formateadores Intl y la carga de catálogos deben consumir esa misma configuración. Así se evita que un componente acepte fr-CA mientras otro recurre silenciosamente a fr o al inglés siguiendo reglas distintas.

Los mensajes deben representar ideas completas. Asígnales claves semánticas estables, como checkout.payment.failed, en lugar de claves copiadas de la frase inglesa actual. Pasa las variables como valores con nombre, usa los marcadores de posición de marcado de forma intencionada y deja que la sintaxis del mensaje seleccione plurales o alternativas gramaticales. Esto conserva el contexto para los traductores y permite que otro idioma cambie el orden de las palabras sin modificar el código React.

  • Configuración regional: la preferencia lingüística o regional validada y activa durante un renderizado.
  • Catálogo de mensajes: identificadores de mensajes estables asociados a valores traducidos.
  • Interpolación: valores de tiempo de ejecución insertados en un mensaje traducido completo.
  • Reglas de plural y selección: variantes gramaticales elegidas a partir de datos sensibles a la configuración regional.
  • Respaldo: el comportamiento deliberado cuando una configuración regional o un mensaje no están disponibles.

react-i18next frente a React Intl frente a Lingui

Las principales bibliotecas de React coinciden en lo básico, pero están optimizadas para distintos flujos de trabajo. Compara su sintaxis de mensajes, proceso de extracción, estrategia de seguridad de tipos, compatibilidad con servidores y ecosistema de catálogos. No elijas solo por el tamaño de descarga: las medidas exactas del paquete cambian según las versiones, los complementos, la eliminación de código no utilizado y la cantidad de mensajes que llegan al navegador.

react-i18next es la integración de React para i18next. Favorece las claves y los espacios de nombres, con complementos para carga, detección, almacenamiento en caché e ICU opcional. React Intl es la capa de React de FormatJS y utiliza ICU MessageFormat directamente mediante componentes y hooks. Lingui también compila mensajes ICU y añade macros y un flujo integrado de extracción y compilación de catálogos.

Biblioteca Estilo de la API de React Sintaxis de mensajes Flujo de extracción TypeScript Opción ideal
react-i18next useTranslation, t y Trans Sintaxis de i18next; ICU mediante un complemento CLI de i18next y herramientas del ecosistema Tipado de recursos mediante configuración Aplicaciones basadas en claves y el ecosistema de i18next
React Intl IntlProvider, hooks y componentes Formatted ICU MessageFormat nativo Extracción y compilación con la CLI de FormatJS Definiciones de primer nivel; tipado de descriptores Textos y formato de producto centrados en ICU
Lingui Macros, Trans y hooks ICU mediante macros compiladas CLI integrada de extracción y compilación API tipadas; la extracción valida los catálogos Flujo en tiempo de compilación y catálogos PO

Elige react-i18next si valoras el amplio ecosistema de i18next, necesitas espacios de nombres en un producto grande o ya compartes catálogos con código JavaScript ajeno a React. Elige React Intl si los mensajes ICU y el formato coherente de números y fechas de FormatJS encajan con el modelo mental del equipo. Elige Lingui si los desarrolladores buscan macros concisas y procesamiento en tiempo de compilación con un flujo de traducción centrado en PO.

La compatibilidad con TypeScript requiere más que una función t tipada. Comprueba que las claves puedan derivarse del catálogo predeterminado real, que se validen las variables de interpolación y que la extracción detecte los mensajes antes del lanzamiento. i18next puede generar o ampliar tipos de recursos, FormatJS extrae descriptores analizables estáticamente y Lingui compila los mensajes extraídos. El mejor flujo es el que tu CI puede aplicar de forma coherente.

Configurar la localización de React paso a paso

Esta configuración utiliza react-i18next porque su modelo JSON basado en claves resulta familiar para muchos equipos de React. La misma secuencia se aplica a otras bibliotecas: define catálogos, inicializa una instancia sensible a la configuración regional, proporciónala en el límite de la aplicación, traduce mensajes completos en los componentes y haz que el cambio de configuración regional actualice tanto la interfaz visible como la URL o la preferencia guardada de la aplicación.

  1. Paso 1

    Estructurar los catálogos

    Crea un catálogo de origen y los archivos de configuración regional correspondientes. Agrupa las claves por dominios de producto estables, como navegación, pago y validación. Mantén sincronizado el conjunto de claves de cada configuración regional e incluye contexto para los traductores en los mensajes ambiguos.

  2. Paso 2

    Inicializar la instancia de i18n

    Crea la instancia de i18next en un módulo específico, registra solo los complementos que necesite la aplicación, define las configuraciones regionales compatibles y de respaldo y mantén los diagnósticos de desarrollo separados del comportamiento en producción.

  3. Paso 3

    Proporcionar la localización en la raíz

    Haz que la instancia inicializada esté disponible en la raíz de la aplicación. En frameworks con renderizado en servidor, sigue la integración del framework para que la configuración regional activa y los recursos sean coherentes entre la salida del servidor y la hidratación.

  4. Paso 4

    Traducir mensajes completos en los componentes

    Llama a useTranslation para el espacio de nombres correspondiente y pasa los valores de interpolación como datos con nombre. Usa Trans solo cuando un mensaje cohesionado contenga elementos React, no para ensamblar fragmentos arbitrarios.

  5. Paso 5

    Crear un selector de idioma accesible

    Cambia la configuración regional activa de la biblioteca y navega a la URL correspondiente cuando las rutas estén localizadas. Conserva una preferencia solo como ayuda; no la conviertas en la única fuente de verdad para las páginas públicas.

Un pequeño catálogo de i18next con espacios de nombres
{
  "navigation": {
    "home": "Home"
  },
  "cart": {
    "items_one": "{{count}} item",
    "items_other": "{{count}} items"
  }
}
Traducir un componente y cambiar la configuración regional
import {useTranslation} from 'react-i18next';

export function CartSummary({count}: {count: number}) {
  const {t, i18n} = useTranslation('common');

  return (
    <section>
      <h2>{t('cart.title')}</h2>
      <p>{t('cart.items', {count})}</p>
      <button onClick={() => i18n.changeLanguage('fr')}>
        {t('language.french')}
      </button>
    </section>
  );
}

Inicializa i18next antes del primer renderizado visible para el usuario. En una aplicación exclusivamente cliente, muestra un estado de carga intencionado mientras llega el catálogo activo, en lugar de claves sin procesar. En SSR, crea u obtén una instancia acotada de forma segura a la solicitud, carga la configuración regional resuelta, renderiza con ella y serializa únicamente los recursos que el cliente necesita para hidratar el mismo árbol.

Un selector de idioma debe mostrar nombres de idiomas legibles, identificar la opción actual y conservar la ruta equivalente del usuario. Para las páginas públicas localizadas, es preferible usar enlaces porque cada configuración regional tiene una URL real. Un selector desplegable o un menú puede mejorar la interacción, pero deben mantenerse intactos el acceso mediante teclado, el comportamiento del foco y una vía de navegación sin JavaScript.

Plurales, fechas, números y RTL

No traduzcas valores ya formateados. Conserva una fecha como Date o timestamp, un precio como un número acompañado de un código de moneda y una lista como un array hasta el renderizado. Intl.DateTimeFormat, Intl.NumberFormat, Intl.RelativeTimeFormat e Intl.ListFormat aplican convenciones específicas de la configuración regional sin tener que distribuir un motor de formato independiente. La mayoría de las bibliotecas de i18n encapsulan estas API para que los mensajes y los valores utilicen una única configuración regional activa.

La pluralización es una selección gramatical, no la condición count === 1. i18next utiliza las categorías de Intl.PluralRules y los sufijos actuales de JSON v4, como _one y _other; algunos idiomas también requieren zero, two, few o many. React Intl y Lingui expresan las alternativas en mensajes ICU. Pasa siempre count como dato y conserva la frase completa en el catálogo.

Para los idiomas de derecha a izquierda, establece dir en la raíz del documento cuando lo requiera la escritura activa y da prioridad a propiedades CSS lógicas como margin-inline-start. Revisa los iconos direccionales, los gráficos y la entrada en varios idiomas en lugar de reflejarlo todo mecánicamente. Define html lang por separado para la pronunciación y el comportamiento sensible al idioma; el idioma y la dirección del texto son valores de configuración relacionados, pero no se sustituyen entre sí.

Formatear valores con la configuración regional activa
export function LocalizedPrice({locale, value}: Props) {
  const currency = new Intl.NumberFormat(locale, {
    style: 'currency',
    currency: 'EUR'
  });
  const date = new Intl.DateTimeFormat(locale, {
    dateStyle: 'long'
  });

  return <p>{currency.format(value)} · {date.format(new Date())}</p>;
}

Rendimiento y SEO multilingüe

Un catálogo para cada idioma puede convertirse en uno de los recursos más grandes de la aplicación si se importa por adelantado. Divide primero los catálogos por configuración regional y, cuando el producto sea lo bastante grande como para beneficiarse, por ruta o espacio de nombres. Carga el catálogo activo antes de renderizar la interfaz crítica, guarda en caché los recursos inmutables con versión y evita iniciar una segunda solicitud para obtener mensajes que el servidor ya utilizó al generar la página.

Para contenido público, da prioridad a un framework de React capaz de emitir HTML localizado mediante generación estática o renderizado en servidor. La hidratación debe conservar la misma configuración regional y los mismos mensajes que generaron la salida del servidor. Si el cliente vuelve a detectar el idioma de forma independiente, puede provocar parpadeos del contenido y discrepancias de hidratación. Pasa la configuración regional resuelta a través del límite de renderizado en lugar de deducirla dos veces.

El SEO multilingüe depende de que las alternativas se puedan descubrir. Publica una URL estable por idioma, localiza el título y la descripción, emite una URL canónica que apunte a sí misma y conecta las páginas equivalentes con valores hreflang recíprocos. Es posible que los rastreadores no envíen una cabecera Accept-Language útil, por lo que la detección del navegador nunca debe ser la única forma de llegar a las traducciones. Un selector de idioma visible y basado en enlaces ayuda tanto a las personas como a los rastreadores.

  • Carga únicamente la configuración regional activa y los espacios de nombres necesarios para la ruta.
  • Renderiza la configuración regional seleccionada en el servidor o durante la compilación de las páginas públicas.
  • Precarga los mensajes críticos para evitar que se muestren fugazmente las claves o el idioma de respaldo.
  • Asigna a cada página localizada una URL distinta, una URL canónica y enlaces hreflang recíprocos.
  • Mantén el selector de idioma como enlaces ordinarios y conserva la ruta equivalente.

Crea un flujo de traducción escalable

La calidad del catálogo es una cuestión de calidad del software. Revisa los mensajes de origen antes de traducirlos, aporta suficiente contexto para cada mensaje y mantén estables los marcadores de posición. Las comprobaciones automáticas deben detectar claves ausentes, expresiones ICU mal formadas, variables de interpolación incompatibles y catálogos que se hayan desincronizado. Resulta más barato corregir estos errores en una pull request que después de publicar una configuración regional.

La seudolocalización es una de las pruebas iniciales de mayor valor. Expande los caracteres, añade marcadores visibles y simula la dirección de derecha a izquierda para revelar diseños que dependen de la longitud o el orden del inglés. Combínala con capturas representativas o flujos de extremo a extremo para el pago, la autenticación, la validación y otros recorridos críticos. La revisión por hablantes nativos sigue siendo importante, pero el equipo de ingeniería puede eliminar muchos defectos estructurales antes de que comience.

  • Usa claves semánticas y documenta el contexto que un traductor no pueda deducir.
  • Nunca concatentes fragmentos traducidos ni reutilices un mensaje en contextos no relacionados.
  • Antes del lanzamiento, comprueba la paridad de claves, la sintaxis, la interpolación y los mensajes sin usar.
  • Utiliza la seudolocalización para descubrir pronto recortes, textos codificados directamente y errores de diseño bidireccional.
  • Define quién es responsable del texto de origen, la revisión de traducciones y la distribución a producción.

El lugar de Translatable

La biblioteca de React se ocupa de lo que ocurre en tiempo de ejecución: seleccionar mensajes, interpolar valores y actualizar componentes. Una plataforma de localización gestiona el flujo que rodea esos mensajes: mantener la paridad de claves, invitar a revisores, traducir a escala, registrar cambios e incorporar a la aplicación los catálogos aprobados. Mantener separadas estas responsabilidades protege la capa de componentes frente a la dependencia de un proveedor.

Translatable trabaja con catálogos JSON y flujos para desarrolladores. Importa archivos de configuración regional existentes, gestiona los valores en una interfaz específica, usa la ayuda de la IA para borradores o traducciones masivas, sincroniza los cambios mediante proveedores de Git y, opcionalmente, distribuye las actualizaciones de los catálogos a través de una CDN. React permanece conectado mediante la biblioteca de i18n que el equipo ya haya elegido.

Adopta gradualmente la automatización del flujo de trabajo. Un equipo pequeño puede empezar con exportaciones bajo control de versiones y revisar cada cambio en una pull request. A medida que aumente la cadencia de lanzamientos, añade sincronización automática o distribución mediante CDN, pero conserva la validación y un respaldo integrado. El resultado es una iteración de textos más rápida sin hacer que el renderizado de la aplicación dependa de un tercero que podría no estar disponible.

Preguntas frecuentes

¿Cuál es la mejor biblioteca de i18n para React?

No existe una biblioteca que sea la mejor en todos los casos. react-i18next es una opción predeterminada sólida para los equipos que buscan el amplio ecosistema de i18next y espacios de nombres basados en claves. React Intl es adecuado para los equipos que prefieren una API directa de ICU MessageFormat. Lingui resulta convincente cuando importan las macros en tiempo de compilación y un flujo integrado de extracción y compilación. Elige en función de la complejidad de los mensajes, las necesidades de extracción, la arquitectura del servidor y el ecosistema existente.

¿Cuál es la diferencia entre react-i18next y React Intl?

react-i18next utiliza el modelo de claves y espacios de nombres, el ecosistema de complementos y las reglas de plural de i18next, con ICU disponible mediante un complemento. React Intl se basa en ICU y ofrece componentes declarativos, además de formato imperativo a través de la API Intl. Ambas son opciones maduras; la más adecuada depende del formato del catálogo, del flujo de trabajo de los traductores y de si el resto de la aplicación ya utiliza i18next.

¿Cómo deben gestionar los plurales las aplicaciones React?

Pasa el recuento numérico a un único mensaje y deja que la biblioteca aplique las categorías de plural de la configuración regional. Los catálogos i18next JSON v4 actuales utilizan sufijos como _one y _other; las bibliotecas basadas en ICU emplean una expresión de plural con categorías dentro del mensaje. Nunca elijas el singular o el plural inglés en el código del componente, porque muchos idiomas tienen formas adicionales.

¿Necesito una plataforma de gestión de traducciones?

Un proyecto pequeño puede gestionar archivos JSON o PO directamente en Git. Una plataforma empieza a resultar útil cuando hay varias configuraciones regionales, cambios de texto frecuentes, revisores que no son desarrolladores, traducción con IA o humana, un historial de auditoría y automatización de la distribución que encarecen la coordinación manual de archivos. Mantén independiente la biblioteca de tiempo de ejecución para que adoptar una plataforma no obligue a reescribir los componentes.

¿Cómo puedo optimizar para SEO una aplicación React localizada?

Asigna a cada idioma una URL estable, renderiza HTML localizado y significativo antes o durante la respuesta inicial, localiza los metadatos y conecta las versiones equivalentes con etiquetas canonical y hreflang. El texto renderizado únicamente en el cliente puede indexarse de forma incoherente y suele provocar un cambio de idioma visible. Cuando el tráfico de búsqueda sea importante, usa un framework con generación estática o renderizado en servidor para las páginas públicas.

Crea un flujo de localización que tu equipo pueda mantener

Reúne tus catálogos JSON, tradúcelos con ayuda de la IA y distribuye las actualizaciones mediante Git o una CDN global.

Empieza gratis