Hoy vamos a aprender cómo podemos internacionalizar y añadir multi lenguaje a una APP en React Native y usando TypeScript.
Lo primero que haremos es instalar i18n:
npm install i18next react-i18next --save
Una vez instalado, creamos una carpeta llamada language y dentro creamos un archivo i18next.ts
// i18next.ts import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; import { Platform, NativeModules } from 'react-native'; import en from './en.json'; import es from './es.json'; function idioma(): string { try { const deviceLanguage: string = Platform.OS === 'ios' ? NativeModules.SettingsManager.settings.AppleLocale || NativeModules.SettingsManager.settings.AppleLanguages[0] //iOS 13 : NativeModules.I18nManager.localeIdentifier; var deviceLanguageSplit: string = deviceLanguage.split("_")[0]; return deviceLanguageSplit; } catch (error) { var idiomaDevuelve: string = "es"; //Idioma por defecto return idiomaDevuelve; //Por defecto en navegador } } i18n .use(initReactI18next) .init({ lng: idioma(), fallbackLng: 'en', compatibilityJSON: 'v3', resources: { en: en, es: es }, interpolation: { escapeValue: false // react already safes from xss }, initImmediate: false, // Añade esta línea }); export default i18n;
Este archivo determinará automáticamente el idioma seleccionado en el dispositivo.
El idioma por defecto es inglés (en).
Si queremos admitr mas idiomas, los añadiremos en resources.
Ahora tenemos que crear los archivos de idioma que estamos importando.
en.json
{ "translation": { "app_name": "My APP", } }
Dentro de translation tenemos que añadir las claves que vamos a utilizar en nuestra APP.
es.json
{ "translation": { "app_name": "Mi Aplicación", } }
*Para que nos permita leer archivos JSON en los imports sin dar error dentro de i18next.ts tenemos que añadir lo siguiente dentro de tsconfig.json
"compilerOptions": { ... "resolveJsonModule": true, ...
Ahora tenemos que importar el archivo i18next.ts a nuestro punto de entrada (suele ser app.tsx)
import '@/language/i18n';
Con este import, ya incializará correctamente i18next.
Para utilizarlo tenemos que hacer lo siguiente:
- Importamos la variable t de useTranslation()
const HomeScreen = () => { ... const { t } = useTranslation(); ...
Y la utilizamos de la siguiente forma:
<Text style={styles.title}>{t("app_name")}</Text>
Ingeniero en Informática, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.