Multilingue per headless CMS.
Polylang ha fornito ai siti WordPress un flusso di lavoro multilingue completo. PolyLingo porta quel flusso di lavoro a Sanity, Contentful, Webflow, Framer e ogni altro headless CMS — tramite una REST API che si integra in un pomeriggio.
Il multilingue per headless CMS è un problema irrisolto.
Sanity ha il plugin di internazionalizzazione. Contentful ha le localizzazioni. Ma nessuno dei due traduce il tuo contenuto — si limitano a conservarlo in più lingue. Riempire quegli slot linguistici è ancora un processo manuale. Esporta il contenuto in inglese, passalo attraverso uno strumento di traduzione che rompe il tuo testo ricco o la struttura JSON, correggi l’output, reimportalo, ripeti per ogni lingua. Per un team di contenuti attivo che pubblica regolarmente, questo flusso di lavoro non scala. Inoltre non esiste per la maggior parte delle configurazioni più piccole, il che significa che il contenuto semplicemente non viene mai tradotto.
L’architettura headless CMS separa la gestione dei contenuti dalla loro distribuzione. Questo è positivo per la flessibilità. Ma crea un divario: il CMS conserva le varianti linguistiche, ma nessuno riempie quelle varianti con contenuti tradotti. Devi costruire tu quel livello.
La maggior parte dei team si trova in una di due situazioni: traducono manualmente i contenuti copiandoli in DeepL e incollandoli indietro (lento, soggetto a errori, non scalabile), oppure scrivono un’integrazione personalizzata con un’API di traduzione che devono mantenere indefinitamente. Nessuna delle due è una buona soluzione. PolyLingo è una terza opzione pulita.
PolyLingo è il livello di traduzione che manca al tuo CMS.
PolyLingo si integra direttamente con il flusso di lavoro di pubblicazione del tuo CMS. Configura un webhook che si attiva quando il contenuto viene pubblicato, passa il contenuto a PolyLingo, ricevi versioni tradotte per ogni lingua, riscrivi tutto nel tuo CMS. Per Sanity, sono poche righe in un’azione server. Per Contentful, è un gestore webhook. Per configurazioni personalizzate, è una chiamata HTTP. Il modello di traduzione comprende il formato del tuo contenuto — Markdown, HTML, JSON, testo ricco — e preserva la struttura in ogni fase.
Il modello è coerente in ogni CMS: recupera il contenuto nella lingua sorgente, chiama l’API PolyLingo con tutte le lingue target, riscrivi il contenuto tradotto nel CMS tramite la sua API di gestione. Questo funziona come script di build, job CI o gestore webhook — qualunque si adatti al tuo flusso di lavoro.
PolyLingo gestisce Markdown, HTML e testo semplice, quindi funziona con qualunque formato il tuo CMS usi per contenuti ricchi. I campi strutturati (titoli, corpo, estratti) possono essere tradotti singolarmente per darti controllo granulare su quali campi tradurre.
Sanity + PolyLingo
Il plugin Document Internationalization di Sanity crea varianti di documenti collegate per ogni locale. Lo script qui sotto recupera i documenti base in inglese e crea automaticamente varianti tradotte per ogni lingua target.
Funziona con il modello i18n a livello di documento (un documento per locale) così come con il modello a livello di campo (tutte le localizzazioni in un solo documento). Per il modello a livello di campo, cicla sui campi invece che sui documenti.
// 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 conserva le varianti di locale come campi nella stessa voce. Lo script qui sotto usa la Contentful Management API per recuperare le voci in inglese, tradurle e scrivere il contenuto tradotto direttamente nei campi specifici per locale — senza copia-incolla manuale.
Contentful usa codici di locale BCP 47 (es. es-ES invece di es). Mappa i codici ISO 639-1 di PolyLingo alla configurazione locale di Contentful di conseguenza.
// 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 Localization API di Webflow (disponibile nei piani CMS e Business) supporta contenuti di campo specifici per locale. Lo script qui sotto recupera gli elementi della collezione CMS, traduce il campo corpo HTML e riscrive le traduzioni in ogni variante locale tramite la Webflow v2 API.
Webflow conserva i campi di testo ricco come HTML. La traduzione HTML di PolyLingo preserva tutto il markup generato da Webflow — classi personalizzate, attributi ed elementi incorporati — intatti.
// 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 } }) }
)
}
}Cosa offre PolyLingo agli utenti headless CMS
- ✓Sanity — traduci alla pubblicazione tramite webhook, riscrivi nei documenti per locale
- ✓Contentful — traduci automaticamente le voci quando la locale inglese viene aggiornata
- ✓Webflow — traduci gli elementi della collezione CMS tramite API
- ✓Qualsiasi headless CMS con API — il modello di integrazione è lo stesso
- ✓Testo ricco, Markdown e HTML tutti preservati correttamente
- ✓Tutte le 36 lingue in una sola richiesta — nessuna chiamata per lingua
- ✓Funziona con qualsiasi CMS che abbia un’API di gestione
- ✓Il contenuto può essere ritradotto ad ogni pubblicazione — nessuna sincronizzazione manuale
Il flusso di lavoro standard per CMS multilingue
Scrivi contenuti nella tua lingua sorgente
Crea e pubblica contenuti in inglese (o qualunque sia la tua lingua sorgente). Il tuo CMS conserva questa versione come autorevole. Non devi cambiare affatto il tuo flusso editoriale.
Attiva lo script di traduzione
Esegui lo script manualmente, su programmazione o tramite webhook attivato da eventi di pubblicazione nel tuo CMS. Lo script chiama PolyLingo una volta per documento con tutte le lingue target, poi riscrive tutte le traduzioni nel CMS in un solo passaggio.
Distribuisci — il contenuto tradotto è live
Il tuo frontend legge il contenuto specifico per locale dal CMS come al solito. Non sono richieste modifiche al codice frontend. Il contenuto tradotto appare nella lingua corretta per ogni percorso locale.
Per chi è stato creato
Team di contenuti su Sanity o Contentful
I tuoi editor pubblicano in inglese. Il contenuto tradotto appare automaticamente in tutte le localizzazioni, senza che il team editoriale debba interagire con strumenti di traduzione.
Agenzie che costruiscono siti multilingue
Ogni sito cliente che costruisci ha bisogno di supporto multilingue. PolyLingo ti offre un’integrazione riutilizzabile e fatturabile che funziona con qualsiasi headless CMS nel tuo stack.
E-commerce con contenuti prodotto localizzati
Descrizioni prodotto, pagine di categoria e contenuti blog — tutti tradotti automaticamente alla pubblicazione. Combina con prezzi specifici per locale per offrire un’esperienza di acquisto completamente localizzata.
Domande frequenti sul multilingue per headless CMS
PolyLingo funziona con CMS non elencati qui?
Sì. Qualsiasi CMS con un’API di gestione può essere integrato usando lo stesso modello — recupera contenuti, chiama PolyLingo, riscrivi. Prismic, Storyblok, DatoCMS, Strapi, Ghost e Directus hanno tutti API di gestione e funzionano con questo approccio. Gli esempi di integrazione per Sanity, Contentful e Webflow sopra illustrano il modello.
Posso tradurre testo ricco con immagini e link incorporati?
Sì. La traduzione HTML preserva tutti gli elementi incorporati inclusi immagini (attributi src e alt gestiti correttamente), link (href preservato, testo del link tradotto) e iframe. L’unica eccezione è il contenuto esplicitamente marcato come non traducibile — i blocchi di codice, per esempio, non vengono mai tradotti.
Come gestisco contenuti che non devono essere tradotti?
Per contenuti strutturati con campi non traducibili (slug, date, identificatori tecnici), invia solo i campi che vuoi tradurre. Per testo ricco con sezioni miste traducibili e non, usa il formato HTML — PolyLingo tradurrà il testo preservando automaticamente blocchi di codice e altri elementi strutturati.
E se il mio CMS ha tipi di contenuto annidati?
Per contenuti profondamente annidati (documenti con riferimenti ad altri documenti), traduci ogni tipo di documento indipendentemente. Questo evita riferimenti circolari e ti dà controllo pulito su quali contenuti tradurre. I riferimenti tra documenti sono mantenuti dal CMS — PolyLingo tocca solo il contenuto dei campi, non le relazioni tra documenti.
Come mantengo sincronizzate le traduzioni quando il contenuto sorgente cambia?
Il modello consigliato è attivare lo script di traduzione ad ogni evento di pubblicazione tramite webhook CMS. Questo assicura che il contenuto tradotto venga aggiornato ogni volta che la sorgente cambia. Per aggiornamenti meno frequenti, eseguire lo script su programmazione notturna o prima di ogni distribuzione in produzione funziona altrettanto bene.
Esiste un modo per marcare le traduzioni come "da revisionare" invece di pubblicarle automaticamente?
Dipende dal tuo CMS. Contentful e Sanity supportano entrambi stati di bozza — puoi scrivere il contenuto tradotto come bozza invece che pubblicato, permettendo una revisione umana prima che ogni locale vada live. Gli esempi di script sopra usano pubblica/crea immediatamente; modifica l’ultimo passaggio per creare bozze per un flusso di lavoro di revisione.
Guide correlate
Traduci HTML senza rompere il markup
Come PolyLingo gestisce l’HTML generato dal CMS preservando tutti i tag.
Aggiungi il multilingue a Next.js
Combina la traduzione dei contenuti headless CMS con la traduzione delle stringhe UI next-intl.
Alternativa a Polylang per stack moderni
Migrare il flusso di lavoro multilingue da WordPress a una configurazione headless.
Aggiungi il multilingue al tuo headless CMS oggi.
Piano gratuito. 100.000 token al mese. Nessuna carta di credito richiesta.
Inizia a tradurre gratisPiano gratuito — 100.000 token al mese. Funziona con qualsiasi CMS.