# General Translation Knowledge Base: Alternativas a next-intl: gt-next vs. next-intl
URL: https://generaltranslation.com/es/kb/next-intl-vs-gt-next.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: next-intl renderiza las traducciones que proporcionas en un catálogo de mensajes para cada idioma. gt-next también renderiza traducciones, pero además General Translation las genera a partir del texto escrito inline en tu JSX. Ambas tienen licencia MIT y son compatibles con App Router y los Componentes de servidor. Si tus catálogos de next-intl ya funcionan, puedes conservarlos y usar General Translation para traducirlos sin necesidad de migrar.
Category: Herramientas para flujos de trabajo
Last updated: 2026-10-16
Authors: Jackie Chen
Published: 2026-10-16

Tanto next-intl como gt-next permiten localizar aplicaciones de Next.js con App Router, incluidos los Componentes de servidor. La diferencia está en el origen de las traducciones: next-intl muestra los mensajes que tu equipo o un servicio de traducción escribe en un catálogo JSON para cada idioma, mientras que gt-next mantiene el texto de origen inline en tu JSX y General Translation genera todas las traducciones durante la compilación.

Esto te deja tres opciones: conservar next-intl y tu proceso de traducción actual; conservar next-intl y dejar que General Translation traduzca sus catálogos, sin tocar tus componentes; o adoptar gt-next para trabajar con texto inline y traducciones generadas automáticamente.

## ¿Cómo se comparan next-intl y gt-next?

| Pregunta                                | next-intl                                                                                          | gt-next (General Translation)                                                                                                                                                 |
| --------------------------------------- | -------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ¿Traduce tu contenido?                  | No. Renderiza los mensajes que tú proporcionas, ya sean de tu equipo o de un servicio como Crowdin | Sí. [`gt translate`](/docs/cli/reference/commands/translate) genera traducciones con contexto a partir de tu código, o tu equipo puede escribirlas                            |
| ¿Dónde vive el texto de origen?         | Mensajes con clave en un catálogo JSON; la extracción inline con `useExtracted` es experimental    | JSX inline dentro de [`<T>`](/docs/react/reference/components/t) y cadenas mediante [`useGT`](/docs/react/reference/hooks/use-gt); también se admiten diccionarios con claves |
| ¿Componentes de servidor?               | Sí, con API distintas para componentes síncronos y asíncronos                                      | Sí: [`<T>`](/docs/react/reference/components/t), [`useGT`](/docs/react/reference/hooks/use-gt) y [`getGT`](/docs/react/nextjs/reference/functions/get-gt)                     |
| ¿Componentes de cliente?                | Dentro de `NextIntlClientProvider`                                                                 | Dentro de [`GTProvider`](/docs/react/reference/components/gt-provider)                                                                                                        |
| Enrutamiento por configuración regional | Middleware con rutas prefijadas por configuración regional                                         | [`createNextMiddleware`](/docs/react/nextjs/app-router-middleware) con un segmento `app/[locale]`                                                                             |
| Plurales                                | Formato de mensajes ICU en cada catálogo                                                           | Ramas de [`<Plural>`](/docs/react/reference/components/plural), traducidas junto con el resto del bloque                                                                      |
| Entrega de traducciones                 | Archivos de catálogo incluidos en el paquete de la app                                             | Archivos incluidos en el paquete, o la CDN de General Translation para actualizar sin volver a desplegar                                                                      |
| Licencia                                | MIT                                                                                                | MIT                                                                                                                                                                           |

Fuentes: [Configuración inicial de next-intl con App Router](https://next-intl.dev/docs/getting-started/app-router), [Uso de next-intl en servidor y cliente](https://next-intl.dev/docs/environments/server-client-components), [Inicio rápido de gt-next](/docs/react/nextjs-quickstart).

## ¿Qué aspecto tiene el mismo encabezado en cada biblioteca?

En el flujo de trabajo basado en catálogos de next-intl, el mensaje de origen reside en un archivo JSON:

```json
{
  "Projects": {
    "heading": "Find your next project"
  }
}
```

El componente selecciona el mensaje según el espacio de nombres y la clave:

```tsx
import { useTranslations } from 'next-intl';

export default function ProjectHeading() {
  const t = useTranslations('Projects');
  return <h1>{t('heading')}</h1>;
}
```

Con gt-next, la misma frase se mantiene dentro del componente:

```tsx
import { T } from 'gt-next';

export default function ProjectHeading() {
  return (
    <T>
      <h1>Find your next project</h1>
    </T>
  );
}
```

Ambos fragmentos dan por hecho que el proveedor y la configuración de cada biblioteca ya están listos. Consulta la [guía de configuración inicial de next-intl](https://next-intl.dev/docs/getting-started/app-router) y la [referencia de `<T>`](/docs/react/reference/components/t).

Un catálogo permite a los revisores leer los textos por separado del código. Con los textos inline, los revisores ven cada frase en el JSX al que pertenece, y General Translation puede traducirla usando esa estructura como contexto. Si la redacción sigue siendo ambigua, el [`<T>` de gt-next acepta una prop `context`](/docs/react/reference/components/t#context), y la [extracción experimental de next-intl admite descripciones de mensajes](https://next-intl.dev/docs/usage/extraction#descriptions).

La API experimental [`useExtracted`](https://next-intl.dev/docs/usage/extraction) de next-intl también te permite escribir mensajes inline y extraerlos a catálogos. La extracción cambia la forma de escribir los textos, pero no traduce los catálogos extraídos: estos siguen necesitando traducciones de tu equipo o de un servicio.

## ¿Se puede usar General Translation sin abandonar next-intl?

Sí. La CLI `gt` detecta next-intl a partir de tu `package.json` y [traduce sus catálogos JSON](/docs/cli/guides/generating-translations) conservando la sintaxis de mensajes de next-intl. Tus componentes, llamadas de traducción y enrutamiento siguen igual.

Para probarlo, configura `gt.config.json` para que apunte a tus catálogos de origen y de destino, importa las traducciones que ya tienes y traduce a una nueva configuración regional. Los revisores pueden corregir el resultado en el [Editor de Traducciones del panel de control](/docs/platform/dashboard/guides/reviewing-translations). Si prefieren editar los catálogos descargados directamente en tu repositorio, ejecuta [`gt save-local`](/docs/cli/reference/commands/save-local) antes de la siguiente ejecución de traducción para que esos cambios se conserven.

Si más adelante te pasas a gt-next, la [guía de migración](/docs/react/guides/migrating-i18n-libraries) explica cómo importar las traducciones revisadas, conservar tus diccionarios y usar ambas bibliotecas a la vez mientras migras ruta por ruta.

## ¿Cómo gestiona cada biblioteca los componentes de servidor y de cliente?

Ninguna de las dos bibliotecas exige convertir una página del App Router en un componente de cliente para localizarla. La diferencia está en qué API se llama en cada entorno.

| Componente                       | next-intl                                                                                                                                                                   | gt-next                                                                                                                                                            |
| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Componente de servidor síncrono  | [`useTranslations`](https://next-intl.dev/docs/environments/server-client-components#using-internationalization-in-server-components), con la configuración de la solicitud | [`<T>`](/docs/react/reference/components/t) para JSX; [`useGT`](/docs/react/reference/hooks/use-gt) para cadenas                                                   |
| Componente de servidor asíncrono | Usa `await` con [`getTranslations`](https://next-intl.dev/docs/environments/server-client-components#async-components) de `next-intl/server`                                | Usa `await` con [`getGT`](/docs/react/nextjs/reference/functions/get-gt) de `gt-next/server` y luego llama a la función devuelta                                   |
| Componente de cliente            | [`useTranslations`](https://next-intl.dev/docs/environments/server-client-components#using-internationalization-in-client-components) dentro de `NextIntlClientProvider`    | [`<T>`](/docs/react/reference/components/t) o [`useGT`](/docs/react/reference/hooks/use-gt) dentro de [`GTProvider`](/docs/react/reference/components/gt-provider) |

En ambas bibliotecas, mantén los controles interactivos en componentes de cliente y traduce el resto de la página en el servidor. next-intl también permite [pasar etiquetas ya traducidas](https://next-intl.dev/docs/environments/server-client-components#option-1-passing-translated-labels-to-client-components) desde un componente de servidor a un control de cliente, para que el cliente no reciba el catálogo completo.

## ¿Cómo se entregan las traducciones de gt-next en producción?

gt-next admite dos opciones de entrega:

* **Incluir las traducciones en el paquete de la aplicación** mediante un [cargador local](/docs/react/guides/storing-translations). La aplicación en producción lee sus propios archivos de traducción y no hace ninguna llamada a General Translation en tiempo de ejecución. Las actualizaciones llegan con la siguiente compilación.
* **Cargar las traducciones desde la CDN de General Translation** mediante la [configuración de entrega remota](/docs/react/nextjs/config). Las ediciones publicadas llegan a la aplicación desplegada sin necesidad de recompilar, en función de su configuración de versión y caché.

gt-next tiene [licencia MIT](https://github.com/generaltranslation/gt) y renderiza las traducciones incluidas en el paquete sin necesidad de una cuenta de General Translation, igual que next-intl renderiza sus catálogos.

## ¿Qué equipos usan gt-next en producción?

Equipos de desarrollo de Cursor, Ramp, Profound, Cognition, Sierra y ClickHouse utilizan General Translation. Profound localiza con General Translation su producto principal, una aplicación de Next.js con App Router. Consulta los [despliegues en producción](https://generaltranslation.com/enterprise).

## ¿Cuándo conviene elegir next-intl o gt-next?

**Quédate con next-intl** si su modelo de catálogo se adapta a tu aplicación y tu proceso de traducción ya funciona. Si lo que más te molesta es la gestión repetitiva de claves, prueba su extracción experimental antes de migrar.

**Quédate con next-intl y añade General Translation** si el cuello de botella está en la producción de traducciones. La CLI `gt` traduce tus catálogos existentes, así que tus componentes, llamadas y enrutamiento no cambian.

**Elige gt-next** si quieres tener el texto inline en tu JSX y que las traducciones se generen en cada compilación. Pruébalo primero en una ruta que use componentes de servidor y de cliente, plurales, texto enriquecido y metadatos. Conserva las URL por configuración regional de la ruta y las traducciones existentes hasta que sus reemplazos estén listos, y comprueba una compilación de producción antes de migrar más rutas.

Para empezar, sigue el [inicio rápido de Next.js App Router](/docs/react/nextjs-quickstart). Para comparar más bibliotecas, consulta [General Translation vs. i18next, react-intl y next-intl](/kb/general-translation-vs-i18n-libraries).

## Preguntas frecuentes

### ¿next-intl traduce mi contenido?

No. next-intl renderiza los mensajes de tus catálogos y les da formato. Las traducciones las proporciona tu equipo, traductores o un servicio como [Crowdin](https://next-intl.dev/docs/workflows/localization-management). General Translation también puede traducir catálogos de next-intl sin necesidad de migrar.

### ¿Puedo usar General Translation con next-intl?

Sí. La CLI de `gt` traduce los catálogos JSON de next-intl y respeta su sintaxis de mensajes, así que puedes conservar tus componentes y tu enrutamiento. Consulta [Generar traducciones](/docs/cli/guides/generating-translations).

### ¿Es gt-next gratuito y de código abierto?

Sí. gt-next tiene licencia MIT y renderiza las traducciones incluidas en el paquete sin necesidad de una cuenta. Para generar traducciones con el servicio alojado de General Translation, consulta los [precios](https://generaltranslation.com/pricing).

### ¿gt-next es compatible con los Componentes de Servidor de React?

Sí. Usa [`<T>`](/docs/react/reference/components/t) y [`useGT`](/docs/react/reference/hooks/use-gt) en los Componentes de servidor síncronos, y [`getGT`](/docs/react/nextjs/reference/functions/get-gt) en los asíncronos.

### ¿Puedo migrar de next-intl a gt-next ruta por ruta?

Sí. La [guía de migración](/docs/react/guides/migrating-i18n-libraries) explica cómo usar ambas bibliotecas en paralelo, importar tus traducciones existentes y mantener los diccionarios con claves donde los prefieras.

## Otras alternativas a next-intl

Para aplicaciones de Next.js, los equipos también comparan estas bibliotecas:

* **i18next:** renderiza catálogos basados en claves con selección de plurales y, junto con react-i18next y next-i18next, es una opción habitual para aplicaciones de React y Next.js. (Consulta [General Translation vs. i18next](/kb/general-translation-vs-i18next)).
* **react-intl:** da formato a mensajes ICU y ofrece una guía para el App Router de Next.js. (Consulta [General Translation vs. react-intl](/kb/general-translation-vs-react-intl)).
* **Paraglide JS:** compila catálogos en funciones de mensajes tipadas y tree-shakable, y cuenta con una integración de Next.js para compilaciones con webpack. (Consulta [General Translation vs. Paraglide JS](/kb/general-translation-vs-paraglide)).

## Conclusiones clave

* Tanto next-intl como gt-next son compatibles con el App Router, los Componentes de servidor y el enrutamiento por configuración regional, y ambos tienen licencia MIT.
* next-intl renderiza las traducciones que tú proporcionas. gt-next también las renderiza, pero además General Translation las genera a partir de JSX inline, usando tu código como contexto.
* No necesitas migrar para usar General Translation: la CLI `gt` traduce los catálogos de next-intl que ya tienes.
* Si decides migrar, hazlo ruta por ruta y mantén cargadas las traducciones existentes hasta que sus reemplazos estén listos.

## Related questions

- [General Translation vs. i18next, react-intl y next-intl: ¿qué biblioteca de i18n deberías usar?](https://generaltranslation.com/es/kb/general-translation-vs-i18n-libraries.mdx): Las bibliotecas de código abierto como i18next, react-intl y next-intl no traducen nada. Muestran las traducciones que tú proporcionas en un archivo de catálogo para cada idioma, escritas por ti, por tus traductores o por un servicio externo. Las bibliotecas de General Translation también son de código abierto y cumplen la misma función, pero además General Translation se encarga de traducir, usando tu código como contexto.
- [¿Cómo configuro el SEO de una aplicación de Next.js multilingüe?](https://generaltranslation.com/es/kb/multilingual-nextjs-seo.mdx): Asigna a cada idioma su propia URL, define el atributo lang de html, haz que la URL canónica de cada página apunte a sí misma, añade versiones alternativas hreflang para cada idioma, traduce los títulos y las descripciones, e incluye todas las versiones de idioma en tu sitemap.
- [¿Puedo hacer i18n sin archivos de traducción?](https://generaltranslation.com/es/kb/i18n-without-translation-files.mdx): Sí. Con gt-react o gt-next, el contenido se mantiene inline en tus componentes, dentro de un componente `<T>`, y las traducciones se generan en tiempo de compilación, por lo que no tienes que escribir claves ni archivos JSON por configuración regional ni mantenerlos sincronizados.
- [¿Cómo gestiono los plurales en React?](https://generaltranslation.com/es/kb/how-to-handle-plurals-in-react.mdx): No codifiques la lógica de pluralización a mano con comprobaciones como n === 1. Para aplicaciones solo en inglés basta con una pequeña función auxiliar, pero las aplicaciones multilingües necesitan reglas de pluralización adaptadas a la configuración regional, y un componente de i18n como `<Plural>` de gt-react o gt-next se encarga de ellas en todos los idiomas.

## Previous and next questions

- Previous question: [Alternativas a Lokalise: General Translation vs. Lokalise](https://generaltranslation.com/es/kb/general-translation-vs-lokalise.mdx)
- Next question: [Alternativas a Phrase: General Translation vs. Phrase](https://generaltranslation.com/es/kb/general-translation-vs-phrase.mdx)

## Sitemap

See the [Knowledge Base sitemap](https://generaltranslation.com/es/kb/sitemap.md) for every article.
