Headless CMS + PolyLingo

Meertalig voor headless CMS.

Polylang gaf WordPress-sites een complete meertalige workflow. PolyLingo brengt die workflow naar Sanity, Contentful, Webflow, Framer en elke andere headless CMS — via een REST API die je in een middag integreert.

Sanity
volledig integratievoorbeeld
Contentful
volledig integratievoorbeeld
Webflow
volledig integratievoorbeeld
36
doeltaal

Meertaligheid in headless CMS is een onopgelost probleem.

Sanity heeft de internationalization plugin. Contentful heeft locales. Maar geen van beiden vertaalt je content — ze slaan het alleen op in meerdere talen. Het vullen van die taalslots is nog steeds een handmatig proces. Exporteer de Engelse content, voer het door een vertaaltool die je rich text of JSON-structuur kapot maakt, corrigeer de output, importeer het terug, herhaal voor elke taal. Voor een actief contentteam dat regelmatig publiceert, schaalt deze workflow niet. Het bestaat ook niet voor de meeste kleinere setups, wat betekent dat de content gewoon nooit vertaald wordt.

De architectuur van headless CMS scheidt contentbeheer van contentlevering. Dit is goed voor flexibiliteit. Maar het creëert een kloof: het CMS slaat taalvarianten op, maar niets vult die taalvarianten met vertaalde content. Je moet die laag zelf bouwen.

De meeste teams belanden in een van twee situaties: ze vertalen content handmatig door het te kopiëren naar DeepL en terug te plakken (traag, foutgevoelig, schaalt niet), of ze schrijven een aangepaste integratie met een vertaal-API die ze voor altijd moeten onderhouden. Geen van beide is een goede oplossing. PolyLingo is een schone derde optie.

PolyLingo is de vertagingslaag die je CMS mist.

PolyLingo integreert direct met je CMS-publicatieworkflow. Stel een webhook in die afgaat wanneer content wordt gepubliceerd, stuur de content naar PolyLingo, ontvang vertaalde versies voor elke taal, schrijf ze terug naar je CMS. Voor Sanity is dit een paar regels in een serveractie. Voor Contentful is het een webhook-handler. Voor aangepaste setups is het een HTTP-aanroep. Het vertaalmodel begrijpt je contentformaat — Markdown, HTML, JSON, rich text — en behoudt de structuur doorheen.

Het patroon is consistent voor elk CMS: haal content op in je brontaal, roep de PolyLingo API aan met alle doeltalen, schrijf de vertaalde content terug naar het CMS via de beheers-API. Dit draait als een build-time script, een CI-taak of een webhook-handler — wat het beste bij je workflow past.

PolyLingo verwerkt Markdown, HTML en platte tekst, dus het werkt met welk formaat je CMS ook gebruikt voor rijke content. Gestructureerde velden (koppen, body, excerpt) kunnen individueel vertaald worden om je fijne controle te geven over welke velden vertaald worden.

🟠

Sanity + PolyLingo

Sanity’s Document Internationalization plugin maakt gekoppelde documentvarianten per locale. Het onderstaande script haalt de Engelse basisdocumenten op en maakt automatisch vertaalde varianten voor elke doeltaal aan.

Werkt met het documentniveau i18n-patroon (één document per locale) evenals het veldniveau-patroon (alle locales in één document). Voor het veldniveau-patroon, loop over velden in plaats van documenten.

scripts/translate-sanity.mjs
// 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 slaat locale-varianten op als velden in dezelfde entry. Het onderstaande script gebruikt de Contentful Management API om Engelse entries op te halen, te vertalen en de vertaalde content direct naar de locale-specifieke velden te schrijven — geen handmatig kopiëren en plakken nodig.

Contentful gebruikt BCP 47 locale-codes (bijv. es-ES in plaats van es). Map de ISO 639-1 codes van PolyLingo dienovereenkomstig naar je Contentful locale-configuratie.

scripts/translate-contentful.mjs
// 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

Webflow’s Localization API (beschikbaar op CMS- en Business-plannen) ondersteunt locale-specifieke veldcontent. Het onderstaande script haalt CMS-collectie-items op, vertaalt het HTML-bodyveld en schrijft vertalingen terug naar elke locale-variant via de Webflow v2 API.

Webflow slaat rich text-velden op als HTML. PolyLingo’s HTML-vertaling behoudt alle door Webflow gegenereerde markup — aangepaste klassen, attributen en ingesloten elementen — onaangeroerd.

scripts/translate-webflow.mjs
// 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 } }) }
    )
  }
}

Wat PolyLingo headless CMS-gebruikers biedt

  • Sanity — vertaal bij publicatie via webhook, schrijf terug naar documentlocales
  • Contentful — vertaal items automatisch wanneer de Engelse locale wordt bijgewerkt
  • Webflow — vertaal CMS-collectie-items via de API
  • Elke headless CMS met een API — het integratiepatroon is hetzelfde
  • Rich text, Markdown en HTML worden allemaal correct behouden
  • Alle 36 talen in één verzoek — geen oproepen per taal
  • Werkt met elk CMS dat een beheers-API heeft
  • Content kan bij elke publicatie opnieuw vertaald worden — geen handmatige synchronisatie

De standaard meertalige CMS-workflow

1

Schrijf content in je brontaal

Maak content aan en publiceer in het Engels (of welke taal dan ook je bron is). Je CMS slaat dit op als de gezaghebbende versie. Je hoeft je redactionele workflow helemaal niet te veranderen.

2

Trigger het vertaal-script

Voer het script handmatig uit, op schema, of via een webhook die wordt geactiveerd door contentpublicatie in je CMS. Het script roept PolyLingo één keer per document aan met alle doeltalen, en schrijft alle vertalingen in één keer terug naar je CMS.

3

Deploy — vertaalde content is live

Je frontend leest locale-specifieke content uit het CMS zoals gewoonlijk. Er zijn geen wijzigingen aan je frontend-code nodig. De vertaalde content verschijnt in de juiste taal voor elke locale-route.

Voor wie dit is gebouwd

✍️

Contentteams op Sanity of Contentful

Je redacteuren publiceren in het Engels. Vertaalde content verschijnt automatisch in alle locales, zonder dat het redactieteam met vertaaltools hoeft te werken.

🏢

Bureaus die meertalige sites bouwen

Elke klantsite die je bouwt heeft meertalige ondersteuning nodig. PolyLingo geeft je een herbruikbare, factureerbare integratie die werkt met elk headless CMS in je stack.

🌍

E-commerce met gelokaliseerde productcontent

Productbeschrijvingen, categoriepaginan, en blogcontent — allemaal automatisch vertaald bij publicatie. Combineer met locale-specifieke prijzen voor een volledig gelokaliseerde winkelervaring.

Veelgestelde vragen over meertaligheid in headless CMS

Werkt PolyLingo met CMS’en die hier niet genoemd zijn?

Ja. Elk CMS met een beheers-API kan geïntegreerd worden met hetzelfde patroon — content ophalen, PolyLingo aanroepen, terugschrijven. Prismic, Storyblok, DatoCMS, Strapi, Ghost en Directus hebben allemaal beheers-API’s en werken met deze aanpak. De integratievoorbeelden voor Sanity, Contentful en Webflow hierboven illustreren het patroon.

Kan ik rich text vertalen met ingesloten afbeeldingen en links?

Ja. HTML-vertaling behoudt alle ingesloten elementen inclusief afbeeldingen (src- en alt-attributen correct verwerkt), links (href behouden, linktekst vertaald) en iframes. De enige uitzondering is content die expliciet als niet-vertalend is gemarkeerd — codeblokken bijvoorbeeld worden nooit vertaald.

Hoe ga ik om met content die niet vertaald mag worden?

Voor gestructureerde content met niet-vertalende velden (slugs, datums, technische identifiers) stuur je alleen de velden die je vertaald wilt hebben. Voor rich text met gemengde vertaalbare en niet-vertalende secties, gebruik het HTML-formaat — PolyLingo vertaalt tekstinhoud terwijl codeblokken en andere gestructureerde elementen automatisch behouden blijven.

Wat als mijn CMS geneste contenttypes heeft?

Voor diep geneste content (documenten met verwijzingen naar andere documenten) vertaal je elk documenttype onafhankelijk. Dit voorkomt circulaire verwijzingen en geeft je duidelijke controle over welke content vertaald wordt. Verwijzingen tussen documenten worden door het CMS onderhouden — PolyLingo raakt alleen de veldinhoud aan, niet de documentrelaties.

Hoe houd ik vertalingen synchroon als de broncontent verandert?

Het aanbevolen patroon is om het vertaal-script te triggeren bij elk publicatie-event via een CMS-webhook. Dit zorgt ervoor dat vertaalde content wordt bijgewerkt wanneer de bron verandert. Voor minder frequente contentupdates werkt het ook prima om het script ’s nachts te draaien of voor elke productie-deploy.

Is er een manier om vertalingen als "moet worden beoordeeld" te markeren in plaats van automatisch te publiceren?

Dit hangt af van je CMS. Contentful en Sanity ondersteunen beide concepten van conceptstatussen — je kunt vertaalde content als concept schrijven in plaats van gepubliceerd, zodat menselijke beoordeling mogelijk is voordat elke locale live gaat. De scriptvoorbeelden hierboven gebruiken direct publiceren/aanmaken; pas de laatste stap aan om concepten te maken voor een beoordelingsworkflow.

Voeg vandaag nog meertaligheid toe aan je headless CMS.

Gratis laag. 100.000 tokens per maand. Geen creditcard vereist.

Begin gratis met vertalen

Gratis laag — 100.000 tokens per maand. Werkt met elk CMS.

Meertalig voor headless CMS — Sanity, Contentful en verder — PolyLingo | PolyLingo