Next.js + PolyLingo

Agrega multilingüismo a tu aplicación Next.js.

Traduce tus archivos de locales, contenido Markdown y páginas HTML mediante una única llamada API. Funciona con App Router, next-intl y cualquier configuración de enrutamiento i18n.

App Router
Next.js 13–15 soportado
next-intl
integración nativa
10 idiomas
una ejecución de script
~3s
tiempo típico de ejecución del script de traducción

Next.js te da enrutamiento. No te da traducciones.

El App Router de Next.js tiene un excelente soporte incorporado para enrutamiento basado en locales. Bibliotecas como next-intl facilitan la gestión de archivos de traducción y el cambio de locales. Lo que no resuelven es la traducción en sí: alguien tiene que producir el contenido traducido en cada idioma, y ese alguien usualmente eres tú. Para la mayoría de los equipos, el flujo de trabajo es copiar el JSON en inglés en DeepL, corregir el formato que se rompe, pegar el resultado de nuevo, repetir para cada idioma. Es lento, propenso a errores y no escala.

El flujo de trabajo más común es escribir todas las cadenas de la interfaz en inglés dentro del código fuente, luego traducir el archivo messages.json para cada idioma objetivo. En teoría esto es sencillo. En la práctica, mantener más de 10 archivos de locales sincronizados con los cambios del código fuente se vuelve un punto doloroso recurrente. Cada vez que cambia el texto en inglés, cada archivo de locales necesita actualizarse. Al usar APIs de traducción estándar para esto, los nombres de las claves se corrompen, los marcadores de posición de variables se traducen y la estructura JSON se desvía entre locales — causando errores sutiles en tiempo de ejecución difíciles de rastrear.

PolyLingo se integra en tu configuración i18n existente de Next.js.

Si usas next-intl o cualquier otra biblioteca i18n, tus mensajes ya están en JSON. PolyLingo toma ese JSON, lo envía al modelo de traducción y devuelve copias traducidas para cada idioma objetivo — con las claves intactas, la anidación preservada y los valores de cadena correctamente traducidos. Puedes llamarlo desde un script de compilación, un webhook o la interfaz de PolyLingo. El resultado se coloca directamente en tu directorio de mensajes.

El flujo de trabajo: escribe tu messages.json en inglés. Ejecuta un solo script que llama a la API de PolyLingo con tu archivo fuente y todos los códigos de idiomas objetivo. Recibe un archivo JSON traducido por idioma, con estructura idéntica. Escribe cada uno en tu directorio messages/. Haz commit. Listo.

Para sitios con mucho contenido y Markdown en CMS (Sanity, Contentful), el mismo enfoque aplica al contenido: exporta como Markdown o HTML, traduce, escribe de nuevo al CMS vía su API. Toda la cadena puede ejecutarse como paso de compilación o con activador webhook.

Script de traducción PolyLingo — este repositorio incluye translate-messages.mjs
// This repository: frontend/scripts/translate-messages.mjs
// Chunks large namespaces (e.g. home) so the model stays within output limits.
//
//   export POLYLINGO_API_KEY=pl_xxx
//   npm run i18n:polylingo
//
// Writes messages/es.json, fr.json, … from messages/en.json via POST /v1/translate
// with format: "json". See MARKETING_I18N.md for options and CI notes.
//
// Minimal one-shot pattern (fine for small message files):
//
// const source = readFileSync('./messages/en.json', 'utf8')
// const { translations } = await fetch(apiUrl + '/translate', {
//   method: 'POST',
//   headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
//   body: JSON.stringify({
//     content: source, format: 'json', source: 'en',
//     targets: ['es', 'fr', 'de'], model: 'standard',
//   }),
// }).then((r) => r.json())
//
// for (const [lang, raw] of Object.entries(translations)) {
//   const obj = typeof raw === 'string' ? JSON.parse(raw) : raw
//   writeFileSync(`./messages/${lang}.json`, JSON.stringify(obj, null, 2))
// }
i18n.ts — configuración next-intl v4
// i18n.ts (next-intl v4)
import { getRequestConfig } from 'next-intl/server'

export const locales = [
  'en', 'ar', 'bn', 'cs', 'da', 'de', 'el', 'es', 'fa', 'fi',
  'fr', 'he', 'hi', 'id', 'it', 'ja', 'ko', 'ms', 'nl', 'no',
  'pl', 'pt', 'ru', 'sv', 'sw', 'th', 'tr', 'uk', 'vi', 'zh',
] as const
export type Locale = (typeof locales)[number]

export default getRequestConfig(async ({ requestLocale }) => {
  const locale = await requestLocale
  return {
    locale,
    messages: (await import(`./messages/${locale}.json`)).default,
  }
})
package.json — agrega translate a tu pipeline de compilación
// package.json
{
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "i18n:polylingo": "node scripts/translate-messages.mjs",
    "translate:build": "npm run i18n:polylingo && next build"
  }
}

Por qué PolyLingo encaja en el flujo i18n de Next.js

  • Traduce archivos messages/*.json directamente — claves siempre preservadas
  • Traduce contenido Markdown para publicaciones de blog y páginas de documentación
  • Funciona con next-intl, next-i18next y configuraciones personalizadas
  • API REST se integra con scripts de compilación y webhooks de CMS
  • Los 36 idiomas en una sola solicitud
  • Nivel gratuito — 50,000 tokens por mes
  • Este repositorio usa el flujo de trabajo: npm run i18n:polylingo regenera locales de marketing desde messages/en.json (ver MARKETING_I18N.md).
  • Funciona con App Router y Pages Router
  • Los archivos de salida están listos para commit — no se necesita reformatear

Configura multilingüismo en tu aplicación Next.js

1

Configura next-intl con tu archivo de mensajes en inglés

Instala next-intl y configura tu i18n.ts y middleware. Escribe todas las cadenas UI en messages/en.json. Estructura el archivo como tu app necesite — plano o anidado. Este será tu único origen de verdad.

2

Ejecuta el script de traducción

Usa la API JSON de PolyLingo desde un pequeño script Node (ver código arriba). En este monorepo, ejecuta npm run i18n:polylingo desde frontend/ con POLYLINGO_API_KEY configurada — divide grandes namespaces para mayor fiabilidad. Las ejecuciones típicas toman menos de un minuto para un paquete completo de marketing.

3

Haz commit de los archivos de locales y despliega

Los archivos de locales generados son JSON válidos con estructura idéntica a tu fuente. Haz commit en tu repositorio. Agrega el script de traducción a tu pipeline CI para mantener los locales sincronizados con cada cambio de contenido.

Casos de uso multilingüe en Next.js

🚀

Aplicaciones SaaS y paneles de control

Traduce toda tu biblioteca de cadenas UI en una ejecución de script. Soporta todas las funciones de formato de next-intl — fechas, números, plurales — porque la estructura JSON se preserva exactamente.

📰

Sitios de contenido y blogs

Para sitios Next.js con mucho contenido usando Sanity o Contentful, usa PolyLingo para traducir contenido de páginas además de cadenas UI — misma API, mismas garantías de preservación de formato.

🛒

E-commerce con variantes regionales

Traduce nombres de productos, descripciones, páginas de categorías y UI de checkout. Usa el modelo Avanzado para textos de marketing donde importa la voz de marca, Estándar para cadenas UI funcionales.

Preguntas frecuentes

¿Funciona esto con el Next.js App Router?

Sí. La integración PolyLingo es solo un script que lee y escribe archivos JSON — no depende de internals de Next.js. Funciona con App Router, Pages Router o cualquier framework. El ejemplo de configuración next-intl mostrado usa la API v4 con requestLocale, compatible con Next.js 13, 14 y 15.

¿Qué pasa si mi messages.json cambia frecuentemente?

El patrón recomendado es agregar el script de traducción a tu pipeline CI/CD, activado con cambios en messages/en.json. Esto mantiene todos los archivos de locales sincronizados automáticamente. Para equipos con cambios frecuentes de texto, previene completamente la deriva de locales.

¿PolyLingo funciona con next-i18next además de next-intl?

Sí. next-i18next usa la misma estructura JSON de locales. El script de traducción funciona igual — apunta a tu directorio public/locales/en/ y escribe salidas en los otros directorios de locales. La compatibilidad del formato JSON es la misma.

¿Qué pasa con contenido dinámico que no está en el archivo de mensajes?

El contenido dinámico — publicaciones de blog, descripciones de productos, contenido generado por usuarios — debe traducirse en la capa de datos, ya sea en tu CMS o mediante un script de compilación que procese el contenido antes de que llegue a Next.js. PolyLingo maneja Markdown, HTML y texto plano igual de bien para este propósito.

¿Puedo traducir solo las cadenas que han cambiado desde la última ejecución?

La traducción incremental (solo traducir claves cambiadas) está en la hoja de ruta. Actualmente el script retraduce el archivo completo. Para la mayoría de archivos de mensajes (menos de 20KB), esto es lo suficientemente rápido para ejecutarse en cada commit. Para archivos muy grandes, se recomienda dividir por namespace.

¿Hay forma de revisar las traducciones antes de que vayan a producción?

El patrón recomendado es hacer commit de los archivos de locales traducidos en una rama o PR separada para revisión antes de fusionar a main. Esto es práctica estándar para equipos que necesitan revisión humana de la calidad de traducción. PolyLingo genera una buena primera versión — para la mayoría de cadenas UI la salida del modelo Estándar no requiere edición.

Obtén tu primer archivo de locales traducido en menos de 5 minutos.

Clave API gratuita. Sin tarjeta de crédito. Pega tu JSON de mensajes y ve el resultado inmediatamente.

Obtén tu clave API

El script de traducción se configura en 5 minutos. Nivel gratuito — no se requiere tarjeta de crédito.

Agrega multilingüismo a tu aplicación Next.js — PolyLingo | PolyLingo