Multilingüe para CMS sin cabeza.
Polylang dio a los sitios WordPress un flujo de trabajo multilingüe completo. PolyLingo lleva ese flujo de trabajo a Sanity, Contentful, Webflow, Framer y cualquier otro CMS sin cabeza — a través de una API REST que se integra en una tarde.
El multilingüismo en CMS sin cabeza es un problema sin resolver.
Sanity tiene el plugin de internacionalización. Contentful tiene locales. Pero ninguno de ellos traduce tu contenido — solo lo almacena en varios idiomas. Llenar esos espacios de idioma sigue siendo un proceso manual. Exporta el contenido en inglés, pásalo por una herramienta de traducción que rompe tu texto enriquecido o estructura JSON, corrige la salida, impórtalo de nuevo, repite para cada idioma. Para un equipo de contenido activo que publica regularmente, este flujo de trabajo no escala. Tampoco existe para la mayoría de configuraciones pequeñas, lo que significa que el contenido simplemente nunca se traduce.
La arquitectura de CMS sin cabeza separa la gestión de contenido de la entrega de contenido. Esto es bueno para la flexibilidad. Pero crea una brecha: el CMS almacena variantes de idioma, pero nada llena esas variantes con contenido traducido. Tienes que construir esa capa tú mismo.
La mayoría de los equipos terminan en una de dos situaciones: traducen contenido manualmente copiándolo en DeepL y pegándolo de nuevo (lento, propenso a errores, no escala), o escriben una integración personalizada con una API de traducción que deben mantener indefinidamente. Ninguna es una buena solución. PolyLingo es una tercera opción limpia.
PolyLingo es la capa de traducción que le falta a tu CMS.
PolyLingo se integra directamente con tu flujo de publicación en el CMS. Configura un webhook que se active cuando se publique contenido, pasa el contenido a PolyLingo, recibe versiones traducidas para cada idioma, escríbelas de nuevo en tu CMS. Para Sanity, son unas pocas líneas en una acción de servidor. Para Contentful, es un manejador de webhook. Para configuraciones personalizadas, es una llamada HTTP. El modelo de traducción entiende el formato de tu contenido — Markdown, HTML, JSON, texto enriquecido — y preserva la estructura en todo momento.
El patrón es consistente en todos los CMS: obtén contenido en tu idioma fuente, llama a la API de PolyLingo con todos los idiomas destino, escribe el contenido traducido de nuevo en el CMS vía su API de gestión. Esto se ejecuta como un script en tiempo de compilación, un trabajo CI o un manejador de webhook — lo que se ajuste a tu flujo de trabajo.
PolyLingo maneja Markdown, HTML y texto plano, por lo que funciona con cualquier formato que use tu CMS para contenido enriquecido. Los campos estructurados (títulos, cuerpo, extracto) pueden traducirse individualmente para darte control granular sobre qué campos se traducen.
Sanity + PolyLingo
El plugin de internacionalización de documentos de Sanity crea variantes de documentos vinculadas por local. El script a continuación obtiene los documentos base en inglés y crea variantes traducidas para cada idioma destino automáticamente.
Funciona con el patrón i18n a nivel de documento (un documento por local) así como con el patrón a nivel de campo (todos los locales en un documento). Para el patrón a nivel de campo, recorre los campos en lugar de los documentos.
// scripts/translate-sanity.mjs
// Fetches published posts and translates each to all target languages
import { createClient } from '@sanity/client'
const sanity = createClient({
projectId: process.env.SANITY_PROJECT_ID,
dataset: 'production',
token: process.env.SANITY_TOKEN,
apiVersion: '2024-01-01',
useCdn: false,
})
const posts = await sanity.fetch(`*[_type == "post" && __i18n_lang == "en"]`)
for (const post of posts) {
const response = await fetch('https://api.usepolylingo.com/v1/translate', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.POLYLINGO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
content: post.body_markdown,
format: 'markdown',
targets: ['es', 'fr', 'de', 'ja', 'zh'],
}),
})
const { translations } = await response.json()
for (const [lang, content] of Object.entries(translations)) {
await sanity.create({
_type: 'post',
__i18n_lang: lang,
__i18n_base: { _type: 'reference', _ref: post._id },
title: translations[lang + '_title'] || post.title,
slug: { current: `${post.slug.current}-${lang}` },
body_markdown: content,
})
}
}Contentful + PolyLingo
Contentful almacena variantes de local como campos en la misma entrada. El script a continuación usa la API de Gestión de Contentful para obtener entradas en inglés, traducirlas y escribir el contenido traducido directamente en los campos específicos del local — sin copia y pega manual.
Contentful usa códigos de local BCP 47 (por ejemplo, es-ES en lugar de es). Mapea los códigos ISO 639-1 de PolyLingo a tu configuración de locales de Contentful en consecuencia.
// scripts/translate-contentful.mjs
// Translates Contentful entries to all target locales
import contentful from 'contentful-management'
const client = contentful.createClient({
accessToken: process.env.CONTENTFUL_MANAGEMENT_TOKEN,
})
const space = await client.getSpace(process.env.CONTENTFUL_SPACE_ID)
const env = await space.getEnvironment('master')
const entries = await env.getEntries({ content_type: 'blogPost', locale: 'en-US' })
for (const entry of entries.items) {
const enBody = entry.fields.body['en-US']
const response = await fetch('https://api.usepolylingo.com/v1/translate', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.POLYLINGO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
content: enBody,
format: 'markdown',
targets: ['es-ES', 'fr-FR', 'de-DE'],
}),
})
const { translations } = await response.json()
for (const [locale, content] of Object.entries(translations)) {
entry.fields.body[locale] = content
}
await entry.update()
await entry.publish()
}Webflow + PolyLingo
La API de Localización de Webflow (disponible en planes CMS y Business) soporta contenido de campo específico por local. El script a continuación obtiene ítems de colecciones CMS, traduce el campo de cuerpo HTML y escribe las traducciones de nuevo en cada variante de local vía la API Webflow v2.
Webflow almacena campos de texto enriquecido como HTML. La traducción HTML de PolyLingo preserva todo el marcado generado por Webflow — clases personalizadas, atributos y elementos incrustados — intactos.
// scripts/translate-webflow.mjs
// Webflow Localization API + PolyLingo
const headers = {
'Authorization': `Bearer ${process.env.WEBFLOW_API_TOKEN}`,
'accept-version': '2.0.0',
'Content-Type': 'application/json',
}
// Fetch English CMS items
const itemsRes = await fetch(
`https://api.webflow.com/v2/collections/${process.env.WEBFLOW_COLLECTION_ID}/items`,
{ headers }
)
const { items } = await itemsRes.json()
for (const item of items) {
const response = await fetch('https://api.usepolylingo.com/v1/translate', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.POLYLINGO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
content: item.fieldData['body-html'],
format: 'html',
targets: ['es', 'fr', 'de'],
}),
})
const { translations } = await response.json()
// Write translated content back to Webflow locale fields
for (const [lang, content] of Object.entries(translations)) {
await fetch(
`https://api.webflow.com/v2/collections/${process.env.WEBFLOW_COLLECTION_ID}/items/${item.id}/locales/${lang}`,
{ method: 'PATCH', headers, body: JSON.stringify({ fieldData: { 'body-html': content } }) }
)
}
}Lo que PolyLingo ofrece a los usuarios de CMS sin cabeza
- ✓Sanity — traduce al publicar vía webhook, escribe de nuevo en los locales del documento
- ✓Contentful — traduce entradas automáticamente cuando se actualiza el local en inglés
- ✓Webflow — traduce ítems de colecciones CMS vía API
- ✓Cualquier CMS sin cabeza con API — el patrón de integración es el mismo
- ✓Texto enriquecido, Markdown y HTML preservados correctamente
- ✓Los 36 idiomas en una sola solicitud — sin llamadas por idioma
- ✓Funciona con cualquier CMS que tenga una API de gestión
- ✓El contenido puede ser retraducido en cada publicación — sin sincronización manual
El flujo de trabajo estándar multilingüe para CMS
Escribe contenido en tu idioma fuente
Crea y publica contenido en inglés (o el idioma que sea tu fuente). Tu CMS almacena esto como la versión autorizada. No necesitas cambiar tu flujo editorial en absoluto.
Dispara el script de traducción
Ejecuta el script manualmente, programado o mediante un webhook activado por eventos de publicación en tu CMS. El script llama a PolyLingo una vez por documento con todos los idiomas destino, luego escribe todas las traducciones de vuelta en tu CMS en una sola pasada.
Despliega — el contenido traducido está en vivo
Tu frontend lee contenido específico por local desde el CMS como de costumbre. No se requieren cambios en tu código frontend. El contenido traducido aparece en el idioma correcto para cada ruta local.
Para quién está construido esto
Equipos de contenido en Sanity o Contentful
Tus editores publican en inglés. El contenido traducido aparece en todos los locales automáticamente, sin que el equipo editorial tenga que interactuar con herramientas de traducción.
Agencias que construyen sitios multilingües
Cada sitio cliente que construyes necesita soporte multilingüe. PolyLingo te da una integración reutilizable y facturable que funciona con cualquier CMS sin cabeza en tu stack.
Comercio electrónico con contenido de producto localizado
Descripciones de productos, páginas de categoría y contenido de blog — todo traducido automáticamente al publicarse. Combínalo con precios específicos por local para ofrecer una experiencia de compra completamente localizada.
Preguntas frecuentes sobre multilingüismo en CMS sin cabeza
¿Funciona PolyLingo con CMS no listados aquí?
Sí. Cualquier CMS con una API de gestión puede integrarse usando el mismo patrón — obtener contenido, llamar a PolyLingo, escribir de nuevo. Prismic, Storyblok, DatoCMS, Strapi, Ghost y Directus tienen APIs de gestión y funcionan con este enfoque. Los ejemplos de integración para Sanity, Contentful y Webflow arriba ilustran el patrón.
¿Puedo traducir texto enriquecido con imágenes y enlaces incrustados?
Sí. La traducción HTML preserva todos los elementos incrustados incluyendo imágenes (atributos src y alt manejados correctamente), enlaces (href preservado, texto del enlace traducido) y iframes. La única excepción es contenido marcado explícitamente como no traducible — bloques de código, por ejemplo, nunca se traducen.
¿Cómo manejo contenido que no debe ser traducido?
Para contenido estructurado con campos no traducibles (slugs, fechas, identificadores técnicos), envía solo los campos que quieres traducir. Para texto enriquecido con secciones mixtas traducibles y no traducibles, usa el formato HTML — PolyLingo traducirá el texto preservando automáticamente bloques de código y otros elementos estructurados.
¿Qué pasa si mi CMS tiene tipos de contenido anidados?
Para contenido profundamente anidado (documentos con referencias a otros documentos), traduce cada tipo de documento independientemente. Esto evita referencias circulares y te da control limpio sobre qué contenido se traduce. Las referencias entre documentos las mantiene el CMS — PolyLingo solo toca el contenido de los campos, no las relaciones entre documentos.
¿Cómo mantengo las traducciones sincronizadas cuando cambia el contenido fuente?
El patrón recomendado es disparar el script de traducción en cada evento de publicación vía un webhook del CMS. Esto asegura que el contenido traducido se actualice siempre que cambie el original. Para actualizaciones menos frecuentes, ejecutar el script en un horario nocturno o antes de cada despliegue de producción funciona igual de bien.
¿Hay forma de marcar traducciones como "necesitan revisión" en lugar de publicar automáticamente?
Esto depende de tu CMS. Contentful y Sanity soportan estados de borrador — puedes escribir contenido traducido como borrador en lugar de publicado, permitiendo revisión humana antes de que cada local se active. Los ejemplos de script arriba usan publicar/crear inmediatamente; modifica el paso final para crear borradores en su lugar para un flujo de trabajo de revisión.
Guías relacionadas
Traduce HTML sin romper el marcado
Cómo PolyLingo maneja HTML generado por CMS con preservación completa de etiquetas.
Agrega multilingüe a Next.js
Combina la traducción de contenido CMS sin cabeza con la traducción de cadenas UI con next-intl.
Alternativa a Polylang para stacks modernos
Migrando el flujo de trabajo multilingüe de WordPress a una configuración sin cabeza.
Agrega multilingüe a tu CMS sin cabeza hoy.
Nivel gratuito. 50,000 tokens por mes. No se requiere tarjeta de crédito.
Comienza a traducir gratisNivel gratuito — 50,000 tokens por mes. Funciona con cualquier CMS.