Frida Marketing
Desarrollo WebDesarrollo con Next.js

¿Cómo Construir un Sitio Web Next.js de 10 Idiomas (Guía del App Router 2026)?

1 de junio de 2026
13 min de lectura

Fragmento de recuperación — cuerpo restaurado del ID de publicación 81 del CMS.

Cómo construir un sitio web Next.js en 10 idiomas (Guía del App Router 2026)

Crear un sitio web multilingüe es una de las inversiones de mayor impacto que puedes hacer en SEO y conversión. El setenta y seis por ciento de los compradores en línea prefiere adquirir productos con información en su idioma nativo (CSA Research, 2020), sin embargo, menos del 5% de los sitios web activos soportan más de tres idiomas. Recientemente lanzamos Frida Marketing en 10 idiomas en Next.js 15 App Router — sin next-intl, sin un SaaS de traducción y sin 10 bases de código separadas. Así es exactamente como lo construimos.

Puntos Clave

  • El 76% de los compradores prefiere comprar en su idioma nativo; el 40% nunca comprará en sitios que no lo ofrecen (CSA Research, 2020)
  • El inglés cubre solo el 49.7% del contenido web global — construir un sitio multilingüe desbloquea el otro 50.3% (W3Techs, junio de 2026)
  • Un segmento dinámico [lang] + un cálculo de prefijo de API sirve 10 idiomas desde un único conjunto de archivos de página
  • Gemini 2.5 Flash traduce una publicación HTML completa de 3,000 palabras por idioma en menos de 90 segundos a un costo casi nulo

¿Por qué construir un sitio multilingüe es más barato de lo que piensas?

El argumento del costo en contra de los sitios multilingües casi siempre se exagera. Next.js 15 App Router maneja toda la capa de enrutamiento a través de un único segmento dinámico. La capa de contenido — títulos, cuerpo, metadatos — proviene de tu API por idioma. Y la capa de traducción puede ser completamente automatizada.

El inglés representa el 49.7% de todo el contenido de sitios web por idioma. El español y el alemán representan cada uno el 6.0%, el japonés el 5.0% y el francés el 4.6% (W3Techs, junio de 2026). Solo el soporte de los cinco idiomas no ingleses principales cubre aproximadamente el 70% del contenido web global indexado. Next.js se ejecuta en el 2.7% de todos los sitios web a nivel global y el 17.9% de los desarrolladores encuestados lo utilizan (Stack Overflow Developer Survey, 2024) — lo que significa que las herramientas y el soporte de la comunidad para Next.js multilingüe son mejores que nunca.

El costo real no es el código, es el contenido. Una vez que tu enrutamiento está configurado, añadir un idioma es una llamada a la API por cada publicación. Hemos publicado 7 entradas en 10 idiomas con cero sobrecarga de mantenimiento por idioma. La decisión de arquitectura es la inversión; el tiempo de ejecución es gratuito.

Web content language distribution bar chart showing English at 49.7%, Spanish and German at 6.0% each, Japanese 5.0%, French 4.6%, all other 28.7%
Fuente: W3Techs, junio de 2026

El 96% de las empresas que invirtieron en localización reportaron un ROI positivo, con el 65% logrando al menos un retorno de 3x (DeepL Business Survey, 2024). El caso de negocio es sólido. La barrera técnica es mucho menor de lo que la mayoría de los desarrolladores esperan.

Cómo estructurar tu segmento dinámico [lang]

Next.js App Router convierte tu sistema de archivos en tu enrutador. Crea un directorio src/app/[lang]/ y cada ruta dentro de él obtiene params.lang automáticamente. Ese único parámetro es la base completa de un sitio de 10 idiomas.

`` src/app/ ├── page.tsx ← English homepage (/) ├── blog/[slug]/page.tsx ← English blog posts ├── admin/layout.tsx ← English admin └── [lang]/ ├── page.tsx ← All other language homepages (/fi, /fr, /de…) ├── blog/[slug]/page.tsx ← Language blog posts └── admin/ └── layout.tsx ← Language admin (same file, reads params.lang) ``

El inglés reside en la raíz. Cada otro idioma reside bajo [lang]. Escribes un archivo y dejas que params.lang impulse la lógica — nunca hay copias de página específicas para cada idioma.

Define tu configuración de idioma en un archivo canónico:

```typescript // src/lib/languages.ts export const LANGUAGES = [ { code: 'fi', urlPrefix: 'fi', apiPrefix: 'fi_', name: 'Finnish' }, { code: 'fr', urlPrefix: 'fr', apiPrefix: 'fr_', name: 'French' }, { code: 'de', urlPrefix: 'de', apiPrefix: 'de_', name: 'German' }, { code: 'it', urlPrefix: 'it', apiPrefix: 'it_', name: 'Italian' }, { code: 'no', urlPrefix: 'no', apiPrefix: 'no_', name: 'Norwegian' }, { code: 'ch', urlPrefix: 'ch', apiPrefix: 'pt_', name: 'Swiss German' }, // ⚠️ API uses pt_ { code: 'sr', urlPrefix: 'sr', apiPrefix: 'sr_', name: 'Serbian' }, { code: 'es', urlPrefix: 'es', apiPrefix: 'es_', name: 'Spanish' }, { code: 'sw', urlPrefix: 'sv', apiPrefix: 'sw_', name: 'Swedish' }, // ⚠️ URL uses sv ];

export const LANG_CODES = LANGUAGES.map(l => l.code); ```

Dos peculiaridades a documentar inmediatamente: ch (alemán suizo) usa pt_ como su prefijo de API por razones históricas de nomenclatura, y sw (sueco) usa sv como su prefijo de URL para coincidir con el estándar ISO. Estas discrepancias no causarán errores si centralizas la configuración, pero confundirán a cualquier desarrollador que se una al proyecto sin esta documentación.

Conectando rutas de idioma a tu API de backend

Toda la integración de la API multilingüe es un único cálculo:

``typescript const prefix = params.lang ? ${params.lang}_ : ''; const posts = await fetch(${API_URL}/api/${prefix}posts); ``

Cuando params.lang es 'fi', esto obtiene /api/fi_posts. Cuando es undefined (raíz en inglés), obtiene /api/posts. Cada página, cada llamada de datos, cada operación de administración utiliza este mismo patrón. No hay un ayudante de obtención por idioma, ni una declaración switch, ni un caso especial.

Developer working at desk with dual monitors and sticky notes, warm home office lighting

Ejecutamos este patrón en 10 idiomas y 5 tipos de contenido — publicaciones, productos, páginas, autores y categorías — en producción. El único caso extremo que encontramos: algunos endpoints de la API tienen estructuras diferentes para el inglés en comparación con las versiones específicas de cada idioma. En nuestra configuración, /api/{lang}_posts/by-url/{slug} existe para cada idioma, pero el equivalente en inglés es un controlador completamente diferente (/api/resolve-route?url=...). Siempre verifica tus rutas de API en inglés por separado — a menudo están estructuradas de manera diferente a las específicas de cada idioma, especialmente en backends de Laravel donde las rutas en inglés se construyeron primero.

El panel de administración utiliza el mismo patrón de prefijo:

``typescript // src/app/[lang]/admin/posts/page.tsx export default function AdminPostsPage({ params }: { params: { lang?: string } }) { const prefix = params.lang ? ${params.lang}_ : ''; // Fetch from /api/${prefix}posts // Build edit/delete links with /${params.lang}/admin/edit-post/${id} } ``

Un único componente AdminPostsPage sirve a los 10 paneles de administración de idiomas. El panel de administración en inglés reside en /admin/posts; el finlandés reside en /fi/admin/posts. Mismo archivo.

Generando páginas estáticas para los 10 idiomas

La generación estática es donde los sitios multilingües de Next.js obtienen su ventaja de rendimiento. Usa generateStaticParams para pre-renderizar cada variante de idioma en tiempo de compilación:

```typescript // src/app/[lang]/page.tsx — static language homepages export async function generateStaticParams() { return LANG_CODES.map(lang => ({ lang })); // Returns: [{lang:'fi'},{lang:'fr'},{lang:'de'},...] }

// src/app/[lang]/blog/[slug]/page.tsx — static blog posts per language export async function generateStaticParams({ params }: { params: { lang: string } }) { const prefix = params.lang ? ${params.lang}_ : ''; const res = await fetch(${API_URL}/api/${prefix}posts); const data = await res.json(); return data.data.map((post: { url: string }) => ({ slug: post.url })); } ```

Las páginas estáticas aparecen como en la salida de next build. Se pre-renderizan a HTML en el momento del despliegue, se envían a la CDN de borde de Vercel y cargan en milisegundos a nivel global. Para un sitio de 10 idiomas, esta es la diferencia entre un TTFB de 50ms y un impacto de origen de 800ms en cada solicitud.

Una regla para memorizar: nunca combines generateStaticParams con obtenciones { cache: 'no-store' } en la misma página. En las compilaciones de producción de Next.js 15, esto lanza Error: Page changed from static to dynamic at runtime — un error que solo aparece en producción, no en desarrollo. Usa ISR en su lugar:

``typescript const res = await fetch(${API_URL}/api/${prefix}posts, { next: { revalidate: 3600 }, // Regenerate stale pages every hour }); export const dynamicParams = true; // Allow new slugs without a full rebuild ``

Bar chart comparing weekly npm downloads: next-intl 2.3 million, next-i18next 538 thousand, react-intl 400 thousand
Fuente: registro de npm, junio de 2026

next-intl registra 2.3 millones de descargas semanales de npm a junio de 2026, lo que la convierte en la librería dominante en este ámbito. Es la elección correcta si necesitas formato sensible a la configuración regional o gestión de cadenas de UI codificadas. Para sitios CMS basados en datos, es opcional — el enrutamiento puro de App Router maneja todo lo que realmente necesitas.

SEO para un sitio de 10 idiomas: Hreflang y generateMetadata

Hreflang le dice a Google qué versión de idioma servir a qué audiencia. Sin él, tus 10 páginas de idiomas compiten entre sí por las mismas consultas. La implementación del App Router es limpia:

```typescript // src/lib/hreflang.ts const HREFLANG_CODE: Record = { fi: 'fi', fr: 'fr', de: 'de', it: 'it', no: 'no', ch: 'de-CH', // Swiss German internal code → BCP 47 de-CH sr: 'sr', es: 'es', sw: 'sv', // Internal code sw → ISO sv (Swedish) };

export function getAlternates(routeKey: string, lang?: string) { const BASE = 'https://fridamarketing.com'; const enUrl = ${BASE}/${routeKey};

const languages: Record = { 'x-default': enUrl, en: enUrl, };

for (const [code, hreflang] of Object.entries(HREFLANG_CODE)) { const urlPrefix = code === 'sw' ? 'sv' : code; languages[hreflang] = ${BASE}/${urlPrefix}/${routeKey}; }

return { canonical: lang ? ${BASE}/${lang === 'sw' ? 'sv' : lang}/${routeKey} : enUrl, languages, }; } ```

Úsalo en generateMetadata en cada página:

``typescript export async function generateMetadata({ params }: Props): Promise { const post = await fetchPost(params.lang, params.slug); return { title: post.meta_title, description: post.meta_description, alternates: getAlternates(blog/${post.url}, params.lang), }; } ``

Esto genera un conjunto completo de hreflang para cada página — x-default, en, y las 9 variantes de idioma — con cero mantenimiento manual. No hay bloques hreflang de sitemap XML que mantener sincronizados; Next.js los inyecta como etiquetas en el renderizado.

Open notebook with hand-drawn site architecture diagram beside a laptop and coffee cup

Según la investigación de SEO multilingüe, las empresas que invierten en localización ven entre un 300% y un 500% más de tráfico orgánico de mercados internacionales (MotionPoint, 2025). La capa hreflang es lo que captura ese tráfico. Sin ella, Google ignora las señales de idioma o muestra la versión incorrecta para cada configuración regional.

Automatizando la traducción: API de Gemini en tu pipeline de publicación

La traducción manual en 10 idiomas es el modelo incorrecto para cualquier equipo sin un presupuesto de localización dedicado. La traducción humana cuesta entre $0.15 y $0.30 por palabra — una publicación de 2,500 palabras cuesta entre $375 y $750 por idioma, o entre $3,375 y $6,750 para los 9 (Seatongue, 2025). La posedición de traducción automática reduce eso en un 50-70%. Pero para contenido HTML estructurado de un CMS, la traducción API completamente automatizada con un prompt preciso es aún mejor.

Aquí está la llamada de traducción principal que usamos con Gemini 2.5 Flash:

``javascript async function translatePost(content, targetLang) { const prompt = Translate the following JSON to ${targetLang}. Rules: - Translate all text values: title, intro, body, meta_title, meta_description - Preserve ALL HTML tags, attributes, and structure in body exactly as-is - Generate a URL-safe localized slug and return it as "url" - Keep brand names, code examples, and proper nouns in English - Return valid JSON only: { title, intro, body, meta_title, meta_description, url }

Content: ${JSON.stringify(content)}`;

const response = await gemini.generateContent(prompt); return JSON.parse(response.text()); } ```

Hemos ejecutado esto en producción para 7 publicaciones, cada una traducida automáticamente a 9 idiomas. La calidad está lista para publicación en finlandés, francés, alemán, español e italiano sin revisión manual. El noruego y el sueco necesitan revisiones puntuales ocasionales. El serbio necesita una revisión de un corrector — Gemini es menos fiable con el cirílico en contextos HTML complejos. Para un sitio con mucho contenido, este enfoque reduce la sobrecarga de traducción en más del 90% en comparación incluso con los flujos de trabajo de posedición de traducción automática.

El tiempo importa. Una publicación HTML de 3,000 palabras le toma a Gemini 2.5 Flash aproximadamente 60-90 segundos por idioma. Eso es de 9 a 13 minutos para las 9 traducciones. Siempre establece un tiempo de espera de aborto de 150 segundos en cada llamada a la API e implementa una retirada exponencial — el modelo ocasionalmente se cuelga bajo alta demanda:

``javascript const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 150000); try { const res = await fetch(GEMINI_URL, { signal: controller.signal, ...opts }); clearTimeout(timeoutId); return res; } catch (err) { clearTimeout(timeoutId); if (err.name === 'AbortError') { // Retry with exponential backoff await new Promise(r => setTimeout(r, Math.pow(2, attempt) * 5000)); } } ``

Stat callout chart: 76% prefer buying in native language, 40% will never buy from non-native sites, 65% prefer native even if poor quality
Fuente: CSA Research, 2020

El 84% de los especialistas en marketing dice que la localización de contenido ha ayudado a aumentar sus ingresos, y las empresas que invirtieron en traducción tuvieron 1.5 veces más probabilidades de ver un aumento de ingresos (Redokun, 2025). La automatización elimina el último obstáculo real — el costo operativo de ejecutar traducciones a escala.

---

¿Construyendo un sitio Next.js multilingüe? Diseñamos y construimos sitios web Next.js para audiencias globales — enrutamiento i18n completo, SEO hreflang y pipelines de traducción automatizados incluidos. Ver nuestros servicios de desarrollo Next.js o contáctanos para discutir tu proyecto.

---

Preguntas Frecuentes

¿Necesito next-intl para construir un sitio Next.js multilingüe?

No. Next.js 15 App Router maneja el enrutamiento multilingüe de forma nativa a través de un segmento dinámico [lang]. Librerías como next-intl añaden valor para el formato sensible a la configuración regional (fechas, monedas, pluralización) y la gestión de cadenas de UI codificadas. Si tu contenido proviene de un CMS o API, no las necesitas para el enrutamiento, la generación estática o el SEO.

¿Cómo mapeo los prefijos de idioma de URL a los endpoints de la API en Next.js?

Calcula un prefijo en tiempo de ejecución: const prefix = params.lang ? \`${params.lang}_\` : '';. Úsalo en cada llamada de obtención — por ejemplo, /api/${prefix}posts. Este patrón maneja los 10 idiomas desde un archivo de página compartido. Sin páginas específicas de idioma, sin declaraciones switch, sin casos especiales.

¿Cuál es la mejor manera de traducir automáticamente un sitio Next.js a varios idiomas?

Usa Gemini 2.5 Flash o GPT-4 en tu pipeline de publicación. Envía el contenido en inglés como JSON con un prompt del sistema para traducir todos los valores de texto, preservando las etiquetas HTML y generando un slug de URL localizado. Añade un tiempo de espera de 150 segundos y una retirada exponencial. La posedición de traducción automática cuesta entre un 50% y un 70% menos que la traducción humana completa (Seatongue, 2025), y la automatización completa de la API lo reduce aún más.

¿Cómo añado etiquetas hreflang a un sitio Next.js 15 App Router?

Crea una función getAlternates(routeKey, lang) que devuelva un objeto alternates de Next.js. Mapea los códigos de URL internos a los códigos de idioma BCP 47 — sw → sv para sueco, ch → de-CH para alemán suizo — e incluye x-default apuntando al canónico en inglés. Devuélvelo desde alternates.languages dentro de la exportación generateMetadata de cada página.

¿Cuántos idiomas debería soportar mi sitio web?

Comienza con 2-3 que coincidan con tus principales fuentes de tráfico, luego expande. El inglés cubre solo el 49.7% del contenido web global (W3Techs, junio de 2026), por lo que cualquier segundo idioma abre una nueva audiencia direccionable con un costo marginal casi nulo una vez que tu pipeline de enrutamiento y traducción esté en su lugar. Las empresas que invierten en localización reportan un 96% de ROI positivo, con el 65% logrando al menos un retorno de 3x (DeepL, 2024).

Conclusión

Un sitio Next.js de 10 idiomas no es 10 veces el trabajo. Es un segmento dinámico [lang], un cálculo de prefijo de API, un ayudante hreflang y un script de traducción — multiplicado a lo largo de tu pipeline de publicación. Construimos esto para Frida Marketing y funciona en producción en 10 idiomas sin sobrecarga de mantenimiento por idioma y sin suscripción a un SaaS de localización.

El enrutamiento es trabajo de una mañana. El hreflang es trabajo de una tarde. El pipeline de traducción es un proyecto de fin de semana. Y la recompensa — alcanzar el 50.3% de la web que no está en inglés — es permanente.

Comienza con el segmento [lang] hoy. Añade hreflang esta semana. Conecta la API de traducción de Gemini este mes.

Más artículos

Blog
Cómo la búsqueda con IA cambia el SEO (y qué hacer al respecto)

Cómo la búsqueda con IA cambia el SEO (y qué hacer al respecto)

El cincuenta y ocho coma cinco por ciento de las búsquedas de Google en Estados Unidos ahora terminan sin un solo clic. Esa cifra proviene del estudio de SparkToro de 2024, que analizó a decenas de millones de panelistas, y significa que la mayoría de las consultas hoy se responden antes de que alguien llegue a tu sitio web. Si a esto le sumamos los AI Overviews alcanzando un pico del 24,61% de todas las consultas en julio de 2025 (Semrush, 2025), ChatGPT llegando a 700 millones de usuarios activos semanales para septiembre de 2025, y Perplexity procesando 780 millones de consultas en un solo mes, el panorama se vuelve claro. La búsqueda ha cambiado fundamentalmente. La pregunta es qué hacer al respecto.

Leer más
React Native vs Flutter: ¿Cuál deberías elegir en 2026?

React Native vs Flutter: ¿Cuál Deberías Elegir en 2026?

El año pasado, Flutter superó silenciosamente a React Native en adopción por parte de los desarrolladores. La encuesta Stack Overflow Developer Survey 2024 reveló que Flutter es utilizado por el 9,4% de todos los desarrolladores, frente al 8,4% de React Native, y la brecha se amplía entre quienes están aprendiendo (11,1% vs. 6,7%). Sin embargo, React Native todavía registra aproximadamente seis veces más ofertas de empleo en LinkedIn. Esa es la tensión central en esta comparación, y resulta muy importante dependiendo de qué estés construyendo y por qué.

Leer más
Estrategia SEO Multilingüe 2026: Cómo Posicionarse en 10 Idiomas

Estrategia SEO Multilingüe 2026: Cómo Posicionar en 10 Idiomas

La mayoría de las empresas compiten por el 25.9% de internet.

Leer más