Introducción
Montar un blog multiidioma headless CMS suena bien en teoría, pero en la práctica suele convertirse en un caos: duplicación de contenido, URLs mal estructuradas, problemas de SEO y una gestión editorial poco eficiente. Si además trabajas con varias webs o clientes, el problema escala rápido. Necesitas una forma clara de centralizar el contenido, exponerlo vía API y servirlo en distintos idiomas sin duplicar lógica ni romper el rendimiento.
Aquí es donde entra un enfoque headless con API REST. Separas backend y frontend, defines bien tu modelo de datos y controlas el idioma como una propiedad más del contenido. El resultado: un sistema flexible, escalable y fácil de mantener.
En este artículo vas a aprender...
Requisitos previos
Un CMS headless (usaremos Agora CMS como referencia)
Conocimientos básicos de API REST
Un frontend (Astro, Vue, Next.js o similar)
Node.js o entorno de desarrollo web configurado
1. Diseña el modelo de contenido multiidioma
El primer error habitual es duplicar posts por idioma. No lo hagas. En un blog multiidioma headless CMS, el idioma debe ser parte del modelo.
Tienes dos enfoques:
Opción A: Campo locale por entrada
{
"id": 1,
"title": "Hello world",
"content": "Content in English",
"locale": "en",
"slug": "hello-world"
}Opción B: Contenido agrupado por idioma (recomendado)
{
"id": 1,
"slug": "hello-world",
"translations": {
"en": {
"title": "Hello world",
"content": "Content in English"
},
"es": {
"title": "Hola mundo",
"content": "Contenido en español"
}
}
}Por qué la opción B es mejor:
Mantienes una única entidad lógica
Evitas inconsistencias entre idiomas
Facilitas SEO (relaciones hreflang)
En Agora CMS puedes estructurar esto con tipos de contenido personalizados sin complicaciones .
2. Configura la API REST para servir contenido por idioma
Tu API debe permitir filtrar por idioma o devolver todas las traducciones.
Endpoint básico
GET /api/posts?locale=esEjemplo en PHP (simplificado)
$locale = $_GET['locale'] ?? 'en';
$query = "SELECT * FROM posts WHERE locale = ?";
$stmt = $db->prepare($query);
$stmt->execute([$locale]);
echo json_encode($stmt->fetchAll());Endpoint con traducciones completas
GET /api/posts/hello-worldRespuesta:
{
"slug": "hello-world",
"translations": {
"en": {...},
"es": {...}
}
}Clave: evita lógica compleja en frontend. La API debe entregar datos listos para renderizar.
3. Estructura las URLs correctamente
El SEO depende en gran parte de esto.
Estructura recomendada
/en/blog/hello-world
/es/blog/hola-mundoAlternativa (menos recomendable)
/blog/hello-world?lang=esPor qué usar prefijos de idioma:
Mejor indexación en Google
URLs limpias y comprensibles
Compatible con
hreflang
Ejemplo en Astro
export function getStaticPaths() {
return posts.map(post => ({
params: {
lang: post.locale,
slug: post.slug
}
}));
}4. Consume la API desde tu frontend
Ahora conectas tu frontend al CMS.
Ejemplo en Vue 3
import { ref, onMounted } from 'vue';
const posts = ref([]);
onMounted(async () => {
const res = await fetch('/api/posts?locale=es');
posts.value = await res.json();
});Ejemplo en Astro (SSR o SSG híbrido)
const res = await fetch(`${API_URL}/posts?locale=${lang}`);
const posts = await res.json();Tip clave:
Si usas SSG → necesitas rebuild al cambiar contenido
Si usas SSR → contenido dinámico sin rebuild
Para blogs, una estrategia híbrida suele funcionar mejor.
5. Añade soporte SEO multiidioma (hreflang)
Esto es obligatorio.
En cada página debes indicar versiones alternativas:
<link rel="alternate" hreflang="en" href="https://example.com/en/blog/hello-world" />
<link rel="alternate" hreflang="es" href="https://example.com/es/blog/hola-mundo" />También puedes añadir:
<link rel="alternate" hreflang="x-default" href="https://example.com/en/blog/hello-world" />Resultado:
Google entiende que son versiones del mismo contenido
Evitas contenido duplicado
Mejor posicionamiento internacional
6. Gestiona el contenido desde un único panel
Aquí es donde realmente ganas productividad.
Con Agora CMS puedes:
Crear un solo post con múltiples idiomas
Editar todas las traducciones desde el mismo panel
Servir contenido a múltiples webs desde una sola API
Flujo real:
Creas un post en español
Añades traducción en inglés
Publicas
La API expone ambas versiones automáticamente
Sin duplicar entradas. Sin sincronizaciones manuales.
Esto encaja perfectamente con el enfoque de centralización de contenido descrito en la estrategia del proyecto .
Resultado final
Al terminar tendrás:
Un blog multiidioma headless CMS funcional
Contenido centralizado en un único backend
API REST que sirve contenido por idioma
URLs limpias y optimizadas para SEO
Frontend desacoplado (Astro, Vue, etc.)
Sistema escalable para múltiples webs o clientes
En la práctica: puedes gestionar 1 o 20 webs multiidioma desde el mismo panel sin aumentar la complejidad.
Conclusión
Crear un blog multiidioma con API REST no es complicado si defines bien el modelo desde el inicio. La clave está en no duplicar contenido, estructurar correctamente la API y cuidar el SEO técnico (URLs + hreflang). Con un CMS headless como Agora CMS, todo este flujo se simplifica: centralizas contenido, reduces errores y escalas sin fricción.
Si trabajas con clientes, múltiples webs o necesitas internacionalizar proyectos, este enfoque no es opcional: es la base.
Prueba Agora CMS gratis y monta tu primer blog multiidioma en pocas horas.