# General Translation React SDKs (gt-react, gt-next, gt-react-native): Inicio rápido de Next.js App Router
URL: https://generaltranslation.com/es/docs/react/nextjs-quickstart.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Añade varios idiomas a una aplicación de Next.js App Router con General Translation en menos de 10 minutos.

Al final de esta guía, tu aplicación de Next.js mostrará contenido en varios idiomas, con un selector de idioma con el que tus usuarios podrán interactuar.

**Requisitos previos:**

* Una aplicación de Next.js que use **App Router** (Next.js 13.0.0 o posterior, excepto 15.2.1 y 15.2.2)
* Node.js 18+

<Callout type="info">
  **Consejo:** Ejecuta `npx gt@latest` para configurar todo con el [Asistente de configuración](/docs/cli/quickstart). Esta guía explica la configuración manual.
</Callout>

<Callout type="info">
  **Nota:** Si usas Pages Router, sigue el [Inicio rápido de Next.js Pages Router](/docs/react/nextjs-pages-router-quickstart).
</Callout>

## Inicio rápido [#quickstart]

### 1. Instala los paquetes

`gt-next` es la biblioteca que impulsa las traducciones de tu aplicación. `gt` es la herramienta de CLI que prepara las traducciones para Production.

<Tabs items={['npm', 'yarn', 'bun', 'pnpm']}>
  <Tab value="npm">
    ```bash
    npm i gt-next
    npm i -D gt
    ```
  </Tab>

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

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

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

### 2. Configura la configuración de Next.js

`gt-next` usa un plugin de Next.js llamado **`withGTConfig`** para configurar la internacionalización en tiempo de compilación. Envuelve tu configuración actual de Next.js con él. En este fragmento y en los siguientes, las líneas verdes se añaden y las rojas se eliminan; conserva cualquier opción que tu configuración ya tenga:

```ts title="next.config.ts"
import { withGTConfig } from 'gt-next/config'; // [!code ++]

const nextConfig = {};

export default nextConfig; // [!code --]
export default withGTConfig(nextConfig); // [!code ++]
```

Este complemento lee tu configuración de traducción y se encarga de conectar todo internamente. No necesitas hacer ningún otro cambio en tu configuración de Next.js.

### 3. 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 biblioteca qué idiomas admites:

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

* **`defaultLocale`** — el idioma en el que está escrita tu aplicación (tu idioma de origen).
* **`locales`** — los idiomas a los que quieres traducir. Elige cualquiera de la [lista de configuraciones regionales compatibles](/docs/platform/dashboard/reference/supported-locales).
* **`files.gt.output`** — donde la CLI guarda los archivos de traducción. `[locale]` se sustituye por cada código de idioma (por ejemplo, `public/_gt/es.json`).

Añade `public/_gt/` a tu **`.gitignore`** — estos archivos se generan, no se escriben a mano:

```txt title=".gitignore"
public/_gt/
```

### 4. Añade una función de carga para traducciones locales

Crea un archivo **[`loadTranslations`](/docs/react/reference/functions/load-translations)** en tu directorio `src/` (o en la raíz del proyecto). Esto le indica a `gt-next` cómo cargar los archivos de traducción generados por el CLI:

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

<Callout type="warn">
  **Advertencia:** Estos archivos de traducción no existen hasta que los crees, por lo que la primera ejecución de `npm run dev` no compila y la página devuelve un HTTP 500. Ejecuta [`npx gt generate`](/docs/cli/reference/commands/generate) (no se necesita una clave de API) o [`npx gt translate`](/docs/cli/reference/commands/translate) (con credenciales), o añade archivos vacíos `{}` en `public/_gt/[locale].json`.
</Callout>

`withGTConfig` detecta automáticamente un archivo `loadTranslations.[js|ts]` en tu directorio `src/` o en la raíz del proyecto; no requiere configuración adicional.

<Callout type="info">
  **Nota:** Las traducciones locales se empaquetan con tu app, por lo que se cargan al instante sin depender de servicios externos. Consulta [Almacenar traducciones](/docs/react/guides/storing-translations) para ver más detalles y sus implicaciones.
</Callout>

### 5. Agrega `GTProvider` a tu layout

El componente **[`GTProvider`](/docs/react/reference/components/gt-provider)** le da a toda tu app acceso a las traducciones. Debe envolver tu app en el nivel del layout raíz. Mantén el resto de tu layout existente (fuentes, metadatos, estilos) tal como está:

```tsx title="app/layout.tsx"
import { GTProvider, useLocale } from 'gt-next'; // [!code ++]

export default function RootLayout({ children }: { children: React.ReactNode }) {
  const locale = useLocale(); // [!code ++]
  return (
    {/* [!code --] */}
    <html lang="en">
    {/* [!code ++] */}
    <html lang={locale}>
      <body>
        {/* [!code --] */}
        {children}
        {/* [!code ++:3] */}
        <GTProvider>
          {children}
        </GTProvider>
      </body>
    </html>
  );
}
```

### 6. Marcar el contenido para traducir

Ahora, envuelve cualquier texto que quieras traducir con el componente **[`<T>`](/docs/react/reference/components/t)**. [`<T>`](/docs/react/reference/components/t) significa &quot;traducir&quot;:

```tsx title="app/page.tsx"
import { T } from 'gt-next'; // [!code ++]

export default function Home() {
  return (
    <main>
      {/* [!code ++] */}
      <T>
        <h1>Welcome to my app</h1>
        <p>This content will be translated automatically.</p>
      {/* [!code ++] */}
      </T>
    </main>
  );
}
```

Puedes envolver dentro de [`<T>`](/docs/react/reference/components/t) tanto o tan poco JSX como quieras. Todo lo que haya dentro —texto, elementos anidados e incluso el formato— se traduce como una sola unidad.

### 7. Agrega un selector de idioma

Inserta un **[`<LocaleSelector>`](/docs/react/reference/components/locale-selector)** para que los usuarios puedan cambiar de idioma:

```tsx title="app/page.tsx"
import { T } from 'gt-next'; // [!code --]
import { T, LocaleSelector } from 'gt-next'; // [!code ++]

export default function Home() {
  return (
    <main>
      {/* [!code ++] */}
      <LocaleSelector />
      <T>
        <h1>Welcome to my app</h1>
        <p>This content will be translated automatically.</p>
      </T>
    </main>
  );
}
```

[`LocaleSelector`](/docs/react/reference/components/locale-selector) muestra un menú desplegable con los idiomas definidos en tu `gt.config.json`.

### 8. Configura las variables de entorno (opcional)

Para ver las traducciones durante el desarrollo, necesitas claves de API de General Translation. Estas habilitan la **traducción on-demand**: tu app traduce el contenido en tiempo real mientras desarrollas.

Crea un archivo **`.env.local`**:

```bash title=".env.local"
GT_API_KEY="your-api-key"
GT_PROJECT_ID="your-project-id"
```

Obtén tus claves gratis en [dash.generaltranslation.com](https://dash.generaltranslation.com/en-US/signin) o ejecuta:

```bash
npx gt auth
```

<Callout type="warn">
  **Advertencia:** Para desarrollo, usa una clave que empiece por `gtx-dev-`. Las claves de producción (`gtx-api-`) son solo para CI/CD.

  Nunca expongas `GT_API_KEY` en el navegador ni la subas al control de versiones.
</Callout>

<Accordions>
  <Accordion title="¿Puedo usar gt-next sin claves de API?">
    Sí. Sin claves de API, `gt-next` funciona como una biblioteca de i18n estándar. No tendrás traducción on-demand en desarrollo, pero aun así puedes:

    * Proporcionar manualmente tus propios archivos de traducción
    * Usar todos los componentes ([`<T>`](/docs/react/reference/components/t), [`<Var>`](/docs/react/reference/components/var), [`LocaleSelector`](/docs/react/reference/components/locale-selector), etc.)
    * Ejecutar [`npx gt generate`](/docs/cli/reference/commands/generate) para crear plantillas de archivos de traducción y luego traducirlas tú mismo
  </Accordion>
</Accordions>

### 9. Comprueba que funciona

Inicia tu servidor de desarrollo:

<Tabs items={['npm', 'yarn', 'bun', 'pnpm']}>
  <Tab value="npm">
    ```bash
    npm run dev
    ```
  </Tab>

  <Tab value="yarn">
    ```bash
    yarn dev
    ```
  </Tab>

  <Tab value="bun">
    ```bash
    bun dev
    ```
  </Tab>

  <Tab value="pnpm">
    ```bash
    pnpm dev
    ```
  </Tab>
</Tabs>

Abre [http://localhost:3000](http://localhost:3000) y usa el menú desplegable de idioma para cambiar de idioma. Deberías ver tu contenido traducido.

<Callout type="info">
  **Nota:** En desarrollo, las traducciones se realizan on-demand, así que es posible que veas un breve estado de carga la primera vez que cambies a otro idioma. En producción, las traducciones se generan previamente y se cargan al instante.
</Callout>

### 10. Traduce cadenas

Para cadenas de texto simples —como los atributos `placeholder`, los valores `aria-label` o el texto `alt`— usa el hook **[`useGT`](/docs/react/reference/hooks/use-gt)**. Funciona en componentes síncronos, tanto de servidor como de cliente:

```tsx title="app/contact/page.tsx"
import { useGT } from 'gt-next';

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

  return (
    <form>
      <input
        placeholder={gt('Enter your email')}
        aria-label={gt('Email input field')}
      />
      <button type="submit">{gt('Send')}</button>
    </form>
  );
}
```

<Accordions>
  <Accordion title="¿Usas un componente asíncrono?">
    Los componentes asíncronos no pueden usar hooks. En su lugar, importa [`getGT`](/docs/react/nextjs/reference/functions/get-gt) de `gt-next/server`:

    ```tsx
    import { getGT } from 'gt-next/server';

    export default async function Page() {
      const gt = await getGT();
      return <p>{gt('Hello')}</p>;
    }
    ```
  </Accordion>
</Accordions>

### 11. Despliega en producción

En producción, las traducciones se pregeneran 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 && next build"
  }
}
```

Configura las variables de entorno de **producción** en tu proveedor de alojamiento (Vercel, Netlify, etc.):

```bash
GT_PROJECT_ID=your-project-id
GT_API_KEY=gtx-api-your-production-key
```

<Callout type="warn">
  **Advertencia:** Las claves de producción empiezan por `gtx-api-` (no `gtx-dev-`). Consigue una en [dash.generaltranslation.com](https://dash.generaltranslation.com). No le pongas nunca el prefijo `NEXT_PUBLIC_`.
</Callout>

Eso es todo: tu aplicación ya es multilingüe. 🎉

## Solución de problemas [#troubleshooting]

<Accordions>
  <Accordion title="El idioma no cambia cuando uso el menú desplegable">
    Confirma que las cookies del navegador estén habilitadas y que el selector se renderice dentro de [`<GTProvider>`](/docs/react/reference/components/gt-provider). Si el enrutamiento por configuración regional está habilitado, confirma también que el patrón de coincidencia del middleware y [`pathRegex`](/docs/react/nextjs/config#path-regex) incluyan la ruta actual.
  </Accordion>

  <Accordion title="Las traducciones son lentas en desarrollo">
    Esto es normal. En desarrollo, las traducciones se hacen on-demand (tu contenido se traduce en tiempo real a través de la API). Esta demora **no existe en producción** — todas las traducciones se pregeneran con [`npx gt translate`](/docs/cli/reference/commands/translate).
  </Accordion>

  <Accordion title="Algunas traducciones son imprecisas">
    Un texto ambiguo puede dar lugar a traducciones imprecisas. Por ejemplo, &quot;apple&quot; puede referirse a la fruta o a la empresa. Agrega una prop `$context` para dar más contexto:

    ```jsx
    <T $context="the technology company">Apple</T>
    ```

    [`<T>`](/docs/react/reference/components/t), [`useGT()`](/docs/react/reference/hooks/use-gt) y [`getGT()`](/docs/react/nextjs/reference/functions/get-gt) admiten `$context`.
  </Accordion>
</Accordions>

## Next steps

- /docs/react/guides/translating-jsx
- /docs/react/guides/translating-strings
- /docs/react/guides/managing-locales
- /docs/react/guides/formatting-variables

## Sitemap

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