# General Translation React SDKs (gt-react, gt-next, gt-react-native): Inicio rápido de React Router
URL: https://generaltranslation.com/es/docs/react/react-router-quickstart.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Agrega General Translation a una aplicación con el framework React Router, incluidas las tiendas de Shopify Hydrogen, y traduce tu primer contenido.

`gt-react` funciona en el modo framework de React Router a través de tu ruta raíz. La biblioteca se inicializa en `app/root.tsx`, la configuración regional de cada visitante se resuelve en el cargador raíz y [`GTProvider`](/docs/react/reference/components/gt-provider) se renderiza desde el `Layout` raíz.

Usa esta guía de inicio rápido para aplicaciones creadas con `@react-router/dev`. Si usas React Router como biblioteca dentro de una aplicación de una sola página con Vite, sigue mejor la [Guía de inicio rápido para una SPA de React](/docs/react/react-spa-quickstart).

Ejecuta [`npx gt@latest init`](/docs/cli/reference/commands/init) desde la raíz de la aplicación para automatizar la configuración. El asistente instala `gt-react`, crea la configuración y el cargador de traducciones, y configura un `app/root.tsx` generado con la plantilla inicial de create-react-router o de Hydrogen. Los demás archivos raíz no se modifican y el asistente enumera las acciones manuales necesarias; esta guía explica cómo hacer la misma configuración a mano.

*Nota: Esta configuración requiere `gt-react` 11.1.3 o posterior y una aplicación que se renderice en cada solicitud. No se admiten el modo SPA (`ssr: false`), el renderizado previo ni el RSC Framework Mode.*

## Inicio rápido [#quickstart]

### 1. Instala los paquetes

`gt-react` es la biblioteca que se encarga de las traducciones en tu aplicación. `gt` es la CLI que las genera.

<Tabs items={['npm', 'yarn', 'bun', 'pnpm']}>
  <Tab value="npm">
    ```bash
    npm install gt-react && npm install gt --save-dev
    ```
  </Tab>

  <Tab value="yarn">
    ```bash
    yarn add gt-react && yarn add --dev gt
    ```
  </Tab>

  <Tab value="bun">
    ```bash
    bun add gt-react && bun add --dev gt
    ```
  </Tab>

  <Tab value="pnpm">
    ```bash
    pnpm add gt-react && pnpm add --save-dev gt
    ```
  </Tab>
</Tabs>

### 2. Crea `gt.config.json`

Crea un archivo `gt.config.json` en la raíz del proyecto. En él se declaran el idioma de origen, las configuraciones regionales de destino y la ubicación en la que se escriben los archivos de traducción.

```json title="gt.config.json"
{
  "defaultLocale": "en",
  "locales": ["es", "ja"],
  "files": {
    "gt": {
      "output": "app/_gt/[locale].json"
    }
  }
}
```

* `defaultLocale`: el idioma en el que está escrita tu aplicación.
* `locales`: los idiomas a los que quieres traducir. Elígelos entre las [configuraciones regionales compatibles](/docs/platform/dashboard/reference/supported-locales).
* `files.gt.output`: la ubicación donde la CLI escribe los archivos de traducción. Guárdalos dentro de `app/` para que Vite los empaquete junto con el código del servidor y del cliente.

### 3. Crea un cargador de traducciones

Crea `app/loadTranslations.ts`. Este archivo importa el archivo de traducciones de una configuración regional cuando el cargador raíz lo solicita.

```ts title="app/loadTranslations.ts"
export default async function loadTranslations(locale: string) {
  const translations = await import(`./_gt/${locale}.json`);
  return translations.default;
}
```

Después, crea un archivo `{}` vacío para cada configuración regional de destino, como `app/_gt/es.json` y `app/_gt/ja.json`; [`gt init`](/docs/cli/reference/commands/init) los crea automáticamente. Si una configuración regional no tiene archivo de traducciones, se renderiza en tu idioma predeterminado.

### 4. Configura la ruta raíz

Llama a [`initializeGT`](/docs/react/reference/config#initialize) una sola vez en el ámbito del módulo en `app/root.tsx`, devuelve la configuración regional y una instantánea de traducciones desde el cargador raíz, y envuelve el contenido de `Layout` en [`GTProvider`](/docs/react/reference/components/gt-provider). Añade las líneas resaltadas a tu archivo raíz actual:

```tsx title="app/root.tsx"
import {
  Links,
  Meta,
  Outlet,
  Scripts,
  ScrollRestoration,
  useRouteLoaderData, // [!code ++]
} from 'react-router';
import { GTProvider, getTranslationsSnapshot, initializeGT, parseLocale } from 'gt-react'; // [!code ++]

import type { Route } from './+types/root';
import gtConfig from '../gt.config.json'; // [!code ++]
import loadTranslations from './loadTranslations'; // [!code ++]
import './app.css';

initializeGT({ ...gtConfig, loadTranslations }); // [!code ++]

// [!code ++:11]
// Las páginas de error no tienen datos del loader. Omite GTProvider en ellas para que no
// sustituya la configuración regional guardada del visitante por la predeterminada.
function RootGTProvider({ children }: { children: React.ReactNode }) {
  const data = useRouteLoaderData<typeof loader>('root');
  if (!data) return <>{children}</>;
  return (
    <GTProvider locale={data.locale} translations={data.translations}>
      {children}
    </GTProvider>
  );
}

// [!code ++:4]
export async function loader({ request }: Route.LoaderArgs) {
  const locale = parseLocale(request);
  return { locale, translations: await getTranslationsSnapshot(locale) };
}

export function Layout({ children }: { children: React.ReactNode }) {
  const locale = useRouteLoaderData<typeof loader>('root')?.locale ?? gtConfig.defaultLocale; // [!code ++]
  return (
    // [!code ++]
    <html lang={locale}>
      <head>
        <meta charSet="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <Meta />
        <Links />
      </head>
      <body>
        {/* [!code ++] */}
        <RootGTProvider>
          {children}
          <ScrollRestoration />
        {/* [!code ++] */}
        </RootGTProvider>
        <Scripts />
      </body>
    </html>
  );
}

export default function App() {
  return <Outlet />;
}
```

`parseLocale` lee la cookie de configuración regional, luego la cabecera `Accept-Language` y, si no encuentra ninguna, recurre a `defaultLocale` como valor alternativo. Si tu ruta raíz ya tiene un `loader`, añade `locale` y `translations` al objeto que devuelve.

*Nota: Las páginas de error que no tienen datos del cargador raíz, como un 404 directo o un error del propio cargador raíz, se renderizan sin [`GTProvider`](/docs/react/reference/components/gt-provider). Los componentes de traducción y los hooks, como [`<T>`](/docs/react/reference/components/t) y [`useLocale`](/docs/react/reference/hooks/use-locale), lanzan una excepción en ese caso y convierten la página de error en un error del servidor, así que no traduzcas el `ErrorBoundary` raíz.*

### 5. Marca el contenido para traducir

Envuelve el JSX en el componente [`<T>`](/docs/react/reference/components/t) para traducirlo directamente donde está y usa [`useGT`](/docs/react/reference/hooks/use-gt) para cadenas simples, como los valores de `aria-label`. Añade un [`<LocaleSelector>`](/docs/react/reference/components/locale-selector) para que los visitantes puedan cambiar de idioma.

```tsx title="app/routes/home.tsx"
import { LocaleSelector, T, useGT } from 'gt-react';

export default function Home() {
  const gt = useGT();

  return (
    <main>
      <LocaleSelector />
      <T>
        <h1>Welcome to my app</h1>
        <p>This content is translated automatically.</p>
      </T>
      <input aria-label={gt('Email address')} />
    </main>
  );
}
```

Cuando un visitante elige un idioma, [`<LocaleSelector>`](/docs/react/reference/components/locale-selector) lo guarda en la cookie de configuración regional y recarga la página para que el cargador raíz renderice la nueva configuración regional.

### 6. Generar traducciones

Inicia sesión con [`gt login`](/docs/cli/reference/commands/login), configura el [`projectId`](/docs/cli/reference/config#project-id) de tu proyecto existente en `gt.config.json` o la variable `GT_PROJECT_ID` en el entorno y, a continuación, traduce:

```bash
npx gt login
GT_PROJECT_ID=your-project-id npx gt translate
```

Iniciar sesión no selecciona ningún proyecto. Si aún no tienes uno, créalo en el [Panel de control](/docs/platform/dashboard/get-started) o ejecuta [`gt init`](/docs/cli/reference/commands/init) y activa las traducciones en tiempo real durante el desarrollo para elegir o crear uno.

Inicia el servidor de desarrollo y cambia de idioma para ver las traducciones. Añade el comando al principio de tu script de compilación actual para que las compilaciones de producción incluyan siempre las traducciones más recientes:

```json title="package.json"
{
  "scripts": {
    "build": "npx gt translate && react-router build"
  }
}
```

Para cargar las traducciones desde la CDN en lugar de incluirlas en el bundle, ejecuta [`npx gt configure --storage cdn`](/docs/cli/reference/commands/configure). El comando te indica el cambio que debes hacer en `app/root.tsx`.

Si almacenas en caché las respuestas de documentos (por ejemplo, en una CDN o en un proxy inverso), haz que la caché varíe según la configuración regional para que los visitantes no reciban la página en otro idioma. Envía `Vary: Cookie, Accept-Language` en las respuestas de documentos o exclúyelas de las cachés compartidas.

<Callout type="info">
  **Nota:** Para CI, proporciona una `GT_API_KEY` independiente de alcance limitado y el mismo ID del Project mediante la configuración de secretos. (Consulta [Credenciales de la CLI](/docs/cli/guides/configuring#credentials)).
</Callout>

## Shopify Hydrogen [#hydrogen]

Las tiendas de Hydrogen son aplicaciones del framework React Router y siguen los mismos pasos. Conserva el comando de compilación propio de Hydrogen y añade la generación de traducciones delante:

```json title="package.json"
{
  "scripts": {
    "build": "npx gt translate && shopify hydrogen build --codegen"
  }
}
```

`gt-react` traduce el texto que está en el código de tu tienda, como la navegación, los botones y los textos de las páginas. Los títulos y las descripciones de los productos, así como el resto del contenido de la tienda, provienen de Shopify, por lo que debes traducirlos en Shopify.

## Solución de problemas [#troubleshooting]

<Accordions>
  <Accordion title="gt init dejó app/root.tsx sin cambios">
    El asistente solo edita raíces con la misma estructura que la plantilla inicial de create-react-router o de Hydrogen y que aún no llaman a [`initializeGT`](/docs/react/reference/config#initialize). Sigue el [paso 4](#quickstart) para hacer los cambios manualmente.
  </Accordion>

  <Accordion title="gt init se detuvo antes de hacer cambios">
    La solución depende del motivo:

    * **Modo SPA, renderizado previo o RSC Framework Mode:** esta configuración lee la configuración regional de cada visitante en un cargador raíz en cada solicitud, por lo que estos modos no son compatibles, ni con el asistente ni de forma manual.
    * **Un rango de `gt-react` que admite versiones anteriores a la 11.1.3:** actualiza `gt-react` y vuelve a ejecutar `npx gt@latest init`.
    * **Un `appDirectory` distinto de `app`, o un `react-router.config` que el asistente no puede leer:** si la app se renderiza en cada solicitud, ejecuta `npx gt@latest init --no-react-setup` para configurar todo excepto tu código fuente y, después, sigue los pasos 2 a 4 usando el directorio de tu app en lugar de `app/`, también en `files.gt.output`.
  </Accordion>

  <Accordion title="El idioma no cambia cuando uso el selector">
    Comprueba que las cookies estén habilitadas, que la configuración regional esté en `gt.config.json` y que el selector se renderice dentro de `RootGTProvider`. Si `<html lang>` cambia pero el texto no, ejecuta [`npx gt translate`](/docs/cli/reference/commands/translate) para generar el contenido de `app/_gt/[locale].json`.
  </Accordion>
</Accordions>

## Next steps

- /docs/react/guides/translating-jsx
- /docs/react/guides/translating-strings
- /docs/react/guides/managing-locales
- /docs/react/guides/storing-translations

## Sitemap

See the full [sitemap](https://generaltranslation.com/sitemap.md) for all pages.
