# react-native: Guía de inicio rápido de React Native con Expo
URL: https://generaltranslation.com/es/docs/react-native/tutorials/quickstart-expo.mdx
---
title: Guía de inicio rápido de React Native con Expo
description: Agrega varios idiomas a tu aplicación de Expo en menos de 10 minutos
---
Al final de esta guía, tu aplicación de Expo mostrará contenido en varios idiomas e incluirá un selector de idioma con el que tus usuarios podrán interactuar.
**Requisitos previos:**
* Un proyecto de Expo (SDK 49+)
* Node.js 18+
`gt-react-native` sigue siendo experimental y puede no funcionar en todos los proyectos.
Si tienes algún problema, avísanos [abriendo un issue en GitHub](https://github.com/generaltranslation/gt/issues).
**¿Quieres una configuración automática?** Ejecuta `npx gt@latest` para configurarlo todo con el [Asistente de configuración](/docs/cli/init). Esta guía explica la configuración manual.
¿Buscas un proyecto con React Native CLI sin Expo? Consulta la [Guía de inicio rápido de React Native](/docs/react-native/tutorials/quickstart).
***
## Paso 1: Instala los paquetes
`gt-react-native` es la biblioteca que gestiona las traducciones en tu aplicación. `gt` es la herramienta de línea de comandos que prepara las traducciones para producción.
```bash
npm i gt-react-native
npm i -D gt
```
```bash
yarn add gt-react-native
yarn add --dev gt
```
```bash
bun add gt-react-native
bun add --dev gt
```
```bash
pnpm add gt-react-native
pnpm add --save-dev gt
```
***
## Paso 2: Crea un archivo de configuración de traducción
Crea un archivo **`gt.config.json`** en la raíz de tu proyecto. Esto le indica a la librería qué idiomas admites:
```json title="gt.config.json"
{
"defaultLocale": "en",
"locales": ["es", "fr", "ja"],
"files": {
"gt": {
"output": "content/[locale].json"
}
}
}
```
* **`defaultLocale`** — el idioma en el que está escrita tu app (tu idioma de origen).
* **`locales`** — los idiomas a los que quieres traducir. Elige cualquiera de la [lista de configuraciones regionales compatibles](/docs/platform/supported-locales).
* **`files.gt.output`** — dónde guarda el CLI los archivos de traducción. `[locale]` se sustituye por cada código de idioma (por ejemplo, `content/es.json`).
***
## Paso 3: Configura los polyfills
El runtime de JavaScript de React Native no incluye las APIs de `Intl` que necesita `gt-react-native`. La solución más sencilla es usar el plugin de Babel incluido.
Agrégalo a tu configuración de Babel:
```js title="babel.config.js"
const gtPlugin = require('gt-react-native/plugin');
const gtConfig = require('./gt.config.json');
module.exports = function (api) {
api.cache(true);
return {
presets: ['babel-preset-expo'],
plugins: [
[
gtPlugin,
{
locales: [gtConfig.defaultLocale, ...gtConfig.locales],
entryPointFilePath: require.resolve('expo-router/entry'),
},
],
],
};
};
```
Instala los polyfills de FormatJS e impórtalos al inicio de tu archivo de entrada. Necesitas los polyfills base, además de los datos específicos de la configuración regional para cada idioma que admitas.
Consulta [la documentación de polyfills de FormatJS](https://formatjs.github.io/docs/polyfills) para ver la lista completa. Como mínimo, necesitas:
```tsx title="index.js"
import '@formatjs/intl-getcanonicallocales/polyfill';
import '@formatjs/intl-locale/polyfill';
import '@formatjs/intl-pluralrules/polyfill-force';
import '@formatjs/intl-numberformat/polyfill';
import '@formatjs/intl-datetimeformat/polyfill';
import '@formatjs/intl-datetimeformat/add-all-tz';
// Agrega datos de configuración regional para cada idioma:
import '@formatjs/intl-pluralrules/locale-data/en';
import '@formatjs/intl-pluralrules/locale-data/es';
import '@formatjs/intl-numberformat/locale-data/en';
import '@formatjs/intl-numberformat/locale-data/es';
// ... repite para cada configuración regional y polyfill
```
***
## Paso 4: Crea un cargador de traducciones
Metro (el empaquetador de Expo) no admite importaciones dinámicas, así que debes asignar explícitamente cada configuración regional a su archivo de traducción:
```ts title="loadTranslations.ts"
const translations: Record = {
es: require("@/content/es.json"),
fr: require("@/content/fr.json"),
ja: require("@/content/ja.json"),
};
export function loadTranslations(locale: string) {
return translations[locale] ?? {};
}
```
Estos archivos se generan con la CLI al ejecutar `npx gt translate`.
***
## Paso 5: Agrega GTProvider a tu layout
El componente **`GTProvider`** da acceso a las traducciones en toda tu aplicación. Agrégalo a tu layout raíz:
```tsx title="app/_layout.tsx"
import { Slot } from 'expo-router';
import { GTProvider } from 'gt-react-native';
import gtConfig from '../gt.config.json';
import { loadTranslations } from '../loadTranslations';
export default function RootLayout() {
return (
);
}
```
`GTProvider` gestiona el estado de la configuración regional y pone las traducciones a disposición de todos los componentes hijo. La prop `devApiKey` habilita la traducción bajo demanda durante el desarrollo.
***
## Paso 6: Marcar el contenido para traducción
Envuelve el texto que quieras traducir con el componente **``**:
```tsx title="app/index.tsx"
import { Text, View } from 'react-native';
import { T } from 'gt-react-native';
export default function Home() {
return (
Welcome to my app
This content will be translated automatically.
);
}
```
Todo lo que está dentro de `` se traduce como una sola unidad.
***
## Paso 7: Agrega un selector de idioma
Usa el hook **`useLocaleSelector`** para crear un selector de idioma. A diferencia de `gt-react`, `gt-react-native` no exporta un componente `` listo para usar; debes crear tu propia interfaz con el hook:
```tsx title="app/index.tsx"
import { Text, View, Pressable } from 'react-native';
import { T, useLocaleSelector } from 'gt-react-native';
export default function Home() {
const { locales, locale, setLocale } = useLocaleSelector();
return (
{locales.map((l) => (
setLocale(l)}>
{l}
))}
Welcome to my app
);
}
```
`useLocaleSelector` devuelve las configuraciones regionales disponibles, la configuración regional actual y una función para cambiarla, lo que te da control total sobre la interfaz de usuario.
***
## Paso 8: Configura las variables de entorno (opcional)
Para ver las traducciones durante el desarrollo, necesitas claves de API de General Translation.
Crea un archivo **`.env.local`**. Expo requiere que las variables de entorno públicas lleven el prefijo `EXPO_PUBLIC_`:
```bash title=".env.local"
EXPO_PUBLIC_GT_DEV_API_KEY="your-dev-api-key"
EXPO_PUBLIC_GT_PROJECT_ID="your-project-id"
```
Consigue tus claves gratis en [dash.generaltranslation.com](https://dash.generaltranslation.com/signup) o ejecuta:
```bash
npx gt auth
```
Para desarrollo, usa una clave que empiece por `gtx-dev-`. Las claves de producción (`gtx-api-`) son solo para CI/CD.
Nunca expongas claves de API de producción en el bundle de tu app ni las subas al control de versiones.
Sí. Sin claves de API, `gt-react-native` funciona como una biblioteca de i18n estándar. No tendrás traducción bajo demanda en desarrollo, pero aun así puedes:
* Proporcionar manualmente tus propios archivos de traducción
* Usar todos los componentes (``, ``, `LocaleSelector`, etc.)
* Ejecutar `npx gt generate` para crear plantillas de archivos de traducción y luego traducirlas tú mismo
***
## Paso 9: Verlo en acción
Inicia la compilación de desarrollo:
```bash
npx expo start --dev-client
```
**Expo Go no funciona** con `gt-react-native` porque incluye un módulo nativo. Necesitas una [build de desarrollo](https://docs.expo.dev/develop/development-builds/introduction/):
```bash
npx expo run:ios
# o
npx expo run:android
```
Usa el selector de idioma para cambiar de idioma. Deberías ver el contenido traducido.
En desarrollo, las traducciones se generan bajo demanda: puede que veas un breve estado de carga la primera vez que cambies a un idioma nuevo. En producción, las traducciones se generan por adelantado y se cargan al instante.
***
## Paso 10: Traduce cadenas (no solo JSX)
Para cadenas de texto simples —como los atributos `placeholder` o los valores de `accessibilityLabel`— usa el hook **`useGT`**:
```tsx title="app/contact.tsx"
import { TextInput, View } from 'react-native';
import { useGT } from 'gt-react-native';
export default function Contact() {
const gt = useGT();
return (
);
}
```
***
## Paso 11: Despliega en producción
En producción, las traducciones se generan de antemano durante la compilación (sin llamadas a la API en tiempo real). Agrega el comando `translate` a tu script de compilación:
```json title="package.json"
{
"scripts": {
"build": "npx gt translate && "
}
}
```
Configura las variables de entorno de **producción** en tu CI/CD (son solo del lado del servidor, no `EXPO_PUBLIC_`):
```bash
GT_PROJECT_ID=your-project-id
GT_API_KEY=gtx-api-your-production-key
```
Las claves de producción empiezan por `gtx-api-` (no `gtx-dev-`). Obtén una en [dash.generaltranslation.com](https://dash.generaltranslation.com). Nunca expongas claves de producción en el bundle de tu app.
Eso es todo: tu app ya es multilingüe. 🎉
***
## Solución de problemas
```
ERROR [Invariant Violation: TurboModuleRegistry.getEnforcing(...): 'GtReactNative' could not be found.]
```
Esto significa que el módulo nativo no se ha enlazado. Causas comunes:
1. **Estás usando Expo Go** en lugar de una build de desarrollo. Cambia a una build de desarrollo:
```bash
npx expo run:ios
# or
npx expo run:android
```
2. **Los Pods no están actualizados (iOS).** Intenta reinstalarlos:
```bash
cd ios && rm -rf build Pods Podfile.lock && pod install && cd ..
```
```
Error: You are using invalid locale codes in your configuration.
```
Normalmente, esto significa que los polyfills no están configurados correctamente. Asegúrate de que el plugin de Babel esté configurado (o de haber importado los polyfills manualmente) y borra la caché:
```bash
npx expo start --clear
```
Esto es normal. En desarrollo, las traducciones se realizan bajo demanda (tu contenido se traduce en tiempo real a través de la API). Esta demora **no existe en producción**: todas las traducciones se generan previamente con `npx gt translate`.
Un texto ambiguo puede dar lugar a traducciones inexactas. Por ejemplo, "apple" podría referirse a la fruta o a la empresa. Agrega una prop `context` para ayudar:
```jsx
Apple
```
Tanto `` como `useGT()` admiten la opción `context`.
***
## Próximos pasos
* [**Guía del componente ``**](/docs/react-native/guides/t) — Aprende sobre variables, plurales y patrones avanzados de traducción
* [**Guía de traducción de cadenas**](/docs/react-native/guides/strings) — Profundiza en `useGT`
* [**Componentes de variable**](/docs/react-native/guides/variables) — Gestiona contenido dinámico con ``, ``, `` y ``
* [**Despliegue en producción**](/docs/react-native/tutorials/quickdeploy) — Configuración de CI/CD, almacenamiento en caché y optimización del rendimiento