Table of Contents
La construcción de aplicaciones que hablan el idioma nativo del usuario ya no es un lujo, es una necesidad de negocio. Mientras el uso móvil continúa explotando globalmente, los usuarios esperan que las aplicaciones se sientan locales, desde el texto que leen a la forma en que los números y fechas se formatean. React Native, el marco multiplataforma desarrollado por Meta, permite a los desarrolladores construir aplicaciones móviles performant para iOS y Android desde una sola base de código.
Localización vs. Internacionalización: Definir los Términos
Antes de bucear en código, es importante distinguir entre dos conceptos relacionados. Internacionalización (i18n) es el proceso de diseñar su aplicación para que pueda adaptarse a varios idiomas y regiones sin requerir cambios de ingeniería. Implica extraer texto, utilizando formato de secuencia para fechas y números, y planificación para diferentes sistemas de escritura.
React Native en sí solo proporciona unas pocas API básicas para la detección local (por ejemplo, del ] módulo), pero la localización completa requiere una biblioteca dedicada para gestionar los recursos de traducción, conmutación de idiomas y formato. El ecosistema ofrece varias opciones maduras, cada una con sus propias fortalezas.
Bibliotecas de localización básica para recrear nativos
Tres bibliotecas dominan el paisaje de localización nativa recreativa. Entender sus roles y cómo se complementan es el primer paso hacia una aplicación robusta.
reaccione‐i18next
Construido sobre i18next], uno de los marcos de internacionalización más populares para JavaScript, es una solución completa para la gestión de la traducción. Proporciona ganchos de reacción (]), Componentes de orden superior, y un componente de traducción que automáticamente se reimprime cuando el lenguaje cambia.
Las ventajas clave de la reacción‐i18next incluyen su rico ecosistema de plugins y la capacidad de cargar traducciones a la demanda (splitting ellos por ruta o característica). También funciona perfectamente con la renderización lado servidor y se puede utilizar en partes no reaccionarias de su código nativo Android o iOS a través del motor i18next subyacente.
reaccionar-native-localize
Mientras que reacciona‐i18next maneja la lógica de la traducción, trata con la información local del lado del dispositivo. Expone la actual localización del usuario, zona horaria, unidad de temperatura, sistema de medición y tipo de calendario. Estos valores son críticos para formatear números, fechas y monedas correctamente. Debido a que React las aplicaciones nativas ejecutan en dos plataformas diferentes, el acceso a esta información se utiliza nativamente para engorroso; [FC]
Puede combinar el reaccionario-native-localize con el reaccion‐i18next al alimentar el lenguaje detectado en la inicialización i18next. Esto le da una experiencia sin costuras y con dispositivos: cuando el usuario cambia el idioma de su teléfono, la aplicación cambia automáticamente a la traducción correspondiente.
i18n‐js
Para proyectos más pequeños o desarrolladores que prefieren un enfoque ligero, ofrece una API minimalista. Proporciona simples revisiones de traducción, reglas de pluralización y formato date/number. Sin embargo, carece de detección de idiomas incorporados y no se integra con el ciclo de vida de componentes de React. Muchos equipos lo utilizan como módulo de utilidad para traducciones no-UI (por ejemplo, en los componentes de Redux, o los ayudantes API).
Una alternativa emergente es , que está incluida en el ecosistema Expo. Refleja las capacidades de reaccionar-native-localize pero se adapta a los flujos de trabajo gestionados por Expo. Si usted está construyendo con Expo, es a menudo la manera más fácil de obtener datos locales.
Creación de una aplicación multilingüe: Aplicación de Paso a Paso
Caminemos a través del proceso de agregar localización a un nuevo proyecto de React Native usando la pila más común: reaccion‐i18next para traducciones y reacciona-native-localize para la detección de dispositivos locale.
1. Instalar dependencias
Ejecute el siguiente comando para añadir tanto las bibliotecas como sus pares:
npm install react-i18next i18next react-native-localize
Si usted está utilizando Expo, instale en lugar de y agregue los paquetes y ].
2. Configure i18next
Crear un archivo (o para TipoScript) en la raíz de su proyecto. Este archivo establecerá la instancia i18next, importará recursos de traducción e integrará el detector locale.
A continuación se presenta una configuración típica:
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import { getLocales } from 'react-native-localize';
import en from './locales/en.json';
import es from './locales/es.json';
import fr from './locales/fr.json';
import de from './locales/de.json';
// Detect device language
const languageDetector = {
type: 'languageDetector',
async: false,
detect: () => {
const locales = getLocales();
return locales[0]?.languageCode ?? 'en';
},
init: () => {},
cacheUserLanguage: () => {},
};
i18n
.use(languageDetector)
.use(initReactI18next)
.init({
resources: {
en: { translation: en },
es: { translation: es },
fr: { translation: fr },
de: { translation: de },
},
fallbackLng: 'en',
interpolation: {
escapeValue: false, // React already safes from XSS
},
});
export default i18n;
Esta configuración utiliza la reaccionar‐native-localize's para recuperar el lenguaje del dispositivo primario. El lenguaje de la retroceso asegura que las traducciones que faltan no rompen la interfaz de usuario.
3. Crear traducción Archivos JSON
Dentro de una carpeta , crear archivos JSON separados para cada idioma compatible. Por ejemplo:
{
"welcome": "Welcome",
"greeting": "Hello, {{name}}!",
"notifications": {
"new_message": "You have {{count}} new message",
"new_message_plural": "You have {{count}} new messages"
}
}
{
"welcome": "Bienvenido",
"greeting": "¡Hola, {{name}}!",
"notifications": {
"new_message": "Tienes {{count}} mensaje nuevo",
"new_message_plural": "Tienes {{count}} mensajes nuevos"
}
}
Note el sufijo —i18next automáticamente maneja formas plurales basadas en el conteo proporcionado al llamar la función de traducción.
4. Envuelve la aplicación con un proveedor i18next
En su componente raíz (por ejemplo, ), importa la configuración i18n y envuelve todo con (opcional pero recomendado para la testabilidad). En la mayoría de los casos, simplemente importar es suficiente porque la registra con el contexto de React.
import React from 'react';
import { SafeAreaView } from 'react-native';
import './i18n'; // Ensure i18n is initialized before any component
import MainScreen from './screens/MainScreen';
const App = () => (
<SafeAreaView style={{ flex: 1 }}>
<MainScreen />
</SafeAreaView>
);
export default App;
5. Utilizar traducciones Componentes interiores
Dentro de cualquier componente funcional, utilice el gancho para acceder a la función :
import React from 'react';
import { View, Text, Button } from 'react-native';
import { useTranslation } from 'react-i18next';
const MainScreen = () => {
const { t, i18n } = useTranslation();
const changeLanguage = (lng) => {
i18n.changeLanguage(lng);
};
return (
<View>
<Text>{t('welcome')}</Text>
<Text>{t('greeting', { name: 'Maria' })}</Text>
<Button title="Español" onPress={() => changeLanguage('es')} />
<Button title="Français" onPress={() => changeLanguage('fr')} />
</View>
);
};
export default MainScreen;
La función revaloriza automáticamente cuando el lenguaje cambia, y el componente se reimprime gracias a la integración del contexto de React.
Características de localización avanzada
Más allá de la simple traducción de valor clave, las aplicaciones de producción requieren soporte para la pluralización, formato fecha/número y adaptación de la distribución derecha a izquierda (RTL).
Pluralización y Contexto
i18next utiliza el formato de mensaje de la UCI para manejar reglas plurales. El ejemplo anterior con y demuestra el caso más simple. Para los idiomas con reglas plurales más complejas (por ejemplo, árabe, ruso), puede proporcionar formas adicionales como , , o utilizar la variable
// Example for Russian
{
"unread_messages": "{{count}} непрочитанное сообщение",
"unread_messages_few": "{{count}} непрочитанных сообщения",
"unread_messages_many": "{{count}} непрочитанных сообщений"
}
Para formatear fechas y números, puede utilizar la API (disponible en motores JavaScript modernos) o confiar en una biblioteca como Luxon] o date‐fns. Un patrón común es crear funciones de utilidad que acepten una cadena local y devuelven valores formateados, luego utilizarlos.
Soporte de diseño adecuado a derecho (RTL)
React Native ha incorporado soporte para idiomas RTL como árabe y hebreo. Hágalo mediante el ajuste de y en su archivo raíz, basado en el idioma actual. Cuando el usuario cambia a un local RTL, todas las direcciones flexbox se mueven automáticamente. Sin embargo, usted debe asegurarse de que sus estilos utilizan propiedades lógicas (por ejemplo, [LT][
import { I18nManager } from 'react-native';
// Inside your language switch handler:
if (newLanguage === 'ar') {
I18nManager.forceRTL(true);
} else {
I18nManager.forceRTL(false);
}
Tenga en cuenta que el toggling RTL requiere un reinicio completo de la aplicación en algunas versiones de Android. Puede advertir al usuario o implementar un reinicio utilizando .
Mejores prácticas para la localización de productos
Obtener los fundamentos de trabajo es una cosa; construir un sistema de localización sostenible y escalable es otra. Las siguientes mejores prácticas le ahorrarán tiempo y evitarán errores frustrantes.
Organizar archivos de traducción por función
Las aplicaciones grandes deben evitar un solo archivo JSON monolítico por idioma. En lugar de ello, use la característica del espacio de nombres de i18next para dividir las traducciones por característica o pantalla. Por ejemplo, , . Esto mantiene los archivos pequeños y hace más fácil la fusión de las solicitudes de tiradas.
Siempre proporcionar un idioma de Fallback
Su aplicación nunca debe chocar porque falta una clave de traducción. Define un lenguaje descomposición (normalmente inglés) que contiene todas las claves utilizadas en la aplicación. Si una clave no existe en el idioma del usuario, i18next mostrará el valor descomposición. Esto es especialmente importante durante el desarrollo temprano cuando no todas las traducciones están completas.
Use una Convención sobre el Naming clave
Adoptar una estructura consistente para sus claves de traducción. Convenciones comunes incluyen el uso de notación de puntos (], ) o la mimicking de la jerarquía de componentes (). Las claves deben ser descriptivas lo suficiente para localizar su uso rápidamente.
Traducciones de texto separadas del contenido
No todo lo que aparece en la interfaz de usuario es una cadena estática. Contenido generado por el usuario, nombres de productos o datos dinámicos no deben pasar por la función —necesitan su propia lógica de almacenamiento y formato. Mantener recursos de traducción puramente para etiquetas de aplicaciones, errores y mensajes.
Automatizar los flujos de trabajo de traducción
Para los equipos con traductores profesionales, considere integrarse con un sistema de gestión de la traducción (TMS) como Lokalise, Crowdin o Phrase. Estas plataformas se conectan a su repositorio de código, empujan cadenas de fuente actualizadas y tiran de archivos traducidos de vuelta. Esta automatización evita traducciones de establo y reduce el esfuerzo manual.
Pruebas de aplicaciones localizadas
Para probar aplicaciones multilingües se requiere más que comprobar que el texto cambia. Debe verificar que todos los elementos se ajustan correctamente, que los diseños no se rompen, y que el formato de datos coincide con el local del usuario.
Simular Diferentes Locales en Simuladores
Tanto Xcode como Android Studio le permiten configurar la región y el idioma del dispositivo. Para iOS, puede cambiar el idioma en las opciones Run del esquema; para Android, puede crear un nuevo emulador con un local personalizado. Pruebe cada idioma compatible en ambas plataformas para descubrir quirks específicos de plataforma (por ejemplo, los buscadores de fecha pueden no respetar su local elegido en versiones anteriores de Android).
Unidad de Pruebas de Traducción
Escribe pruebas de unidad para tu configuración i18n para asegurar que todas las teclas se resuelvan correctamente para los idiomas base y descomposición. Usa un marco de prueba como Jest para cargar la configuración y llamar para cada idioma. Una clave perdida aparecerá como en la salida, lo que facilita la detección.
import i18n from '../i18n';
test('all translation keys exist in English', () => {
const keys = ['welcome', 'greeting', 'notifications.new_message'];
keys.forEach(key => {
expect(i18n.t(key)).not.toBe(key);
});
});
Pruebas de regresión visual
Las cadenas de texto largas en idiomas como alemán o finlandés pueden causar desbordamiento de la distribución. Usar pruebas de instantáneas (por ejemplo, instantáneas Jest con diferentes configuraciones locales) o herramientas de regresión visual dedicadas como Percy para capturar el descomposición de la interfaz de usuario. Simular modo RTL forzando en su entorno de prueba.
Consideraciones de la ejecución
La localización no debe comprometer el rendimiento de la aplicación. Aquí están algunos consejos para mantener su aplicación rápida.
- Traducciones de carga perezosamente: Usar la opción de i18next o importaciones dinámicas para buscar archivos de idiomas sólo cuando sea necesario. Esto reduce el tamaño del paquete inicial.
- Evitar re-registrar recursos: Iniciar su instancia i18n una vez al inicio de la aplicación. Cambiar el idioma no debe requerir volver a cargar todos los archivos de traducción de la red.
- Memoizar los valores formateados: Si usted está realizando una fecha o número caros formateo dentro de un bucle de renderizado, envuelve el resultado en para evitar recalculaciones en cada re-render.
- Consider using a translation cache: Para aplicaciones que permiten la conmutación de idiomas fuera de línea, almacenan traducciones en AsyncStorage o una base de datos local similar.
Conclusión
Crear una aplicación nativa multilingüe requiere más que simplemente intercambiar cuerdas. Requiere una arquitectura reflexiva que maneja la detección de dispositivos local, la gestión de la traducción, pluralización, formato número/fecha y diseño RTL. Al elegir una biblioteca robusta como reacciona‐i18next emparejado con el localize reaccionativo, puede construir una experiencia que se siente nativa a los usuarios en cada rincón del mundo.
Recuerde que la localización es un proceso continuo: las traducciones necesitan actualizaciones, nuevos idiomas pueden ser añadidos, y los matices culturales deben ser respetados. Invierte en la herramienta temprana, establece flujos de trabajo claros con su equipo de traducción, y prueba sin descanso. El esfuerzo se paga en satisfacción del usuario, retención más alta y alcance del mercado ampliado.
Para más información, consulte la documentación oficial de react‐i18next] y react‐native-localize. También puede encontrar la i18next plugin list útil para ampliar la funcionalidad. Con la estrategia correcta, su lenguaje de texto puede hablar con fluidez.