Headless CMS + PolyLingo

Mehrsprachigkeit für Headless CMS.

Polylang hat WordPress-Seiten einen vollständigen mehrsprachigen Workflow gegeben. PolyLingo bringt diesen Workflow zu Sanity, Contentful, Webflow, Framer und jedem anderen Headless CMS — über eine REST-API, die sich an einem Nachmittag integrieren lässt.

Sanity
vollständiges Integrationsbeispiel
Contentful
vollständiges Integrationsbeispiel
Webflow
vollständiges Integrationsbeispiel
36
Zielsprachen

Mehrsprachigkeit bei Headless CMS ist ein ungelöstes Problem.

Sanity hat das Internationalisierungs-Plugin. Contentful hat Lokalisierungen. Aber keines von beiden übersetzt Ihre Inhalte — sie speichern sie nur in mehreren Sprachen. Das Befüllen dieser Sprachfelder ist immer noch ein manueller Prozess. Exportieren Sie die englischen Inhalte, führen Sie sie durch ein Übersetzungstool, das Ihre Rich-Text- oder JSON-Struktur zerstört, korrigieren Sie die Ausgabe, importieren Sie sie zurück, wiederholen Sie das für jede Sprache. Für ein aktives Content-Team, das regelmäßig veröffentlicht, skaliert dieser Workflow nicht. Er existiert auch für die meisten kleineren Setups nicht, was bedeutet, dass die Inhalte oft gar nicht übersetzt werden.

Die Headless-CMS-Architektur trennt Content-Management von der Inhaltsauslieferung. Das ist gut für Flexibilität. Aber es entsteht eine Lücke: Das CMS speichert Sprachvarianten, aber nichts füllt diese Sprachvarianten mit übersetzten Inhalten. Diese Schicht müssen Sie selbst bauen.

Die meisten Teams landen in einer von zwei Situationen: Sie übersetzen Inhalte manuell, indem sie sie in DeepL kopieren und zurückeinfügen (langsam, fehleranfällig, nicht skalierbar), oder sie schreiben eine benutzerdefinierte Integration mit einer Übersetzungs-API, die sie dauerhaft warten müssen. Keine der beiden Lösungen ist gut. PolyLingo ist eine saubere dritte Option.

PolyLingo ist die Übersetzungsschicht, die Ihrem CMS fehlt.

PolyLingo integriert sich direkt in Ihren CMS-Veröffentlichungsworkflow. Richten Sie einen Webhook ein, der ausgelöst wird, wenn Inhalte veröffentlicht werden, übergeben Sie die Inhalte an PolyLingo, erhalten Sie übersetzte Versionen für jede Sprache und schreiben Sie diese zurück in Ihr CMS. Für Sanity sind das nur ein paar Zeilen in einer Server-Aktion. Für Contentful ist es ein Webhook-Handler. Für benutzerdefinierte Setups ist es ein HTTP-Aufruf. Das Übersetzungsmodell versteht Ihr Inhaltsformat — Markdown, HTML, JSON, Rich Text — und bewahrt die Struktur durchgehend.

Das Muster ist bei jedem CMS konsistent: Inhalte in der Quellsprache abrufen, die PolyLingo-API mit allen Zielsprachen aufrufen, die übersetzten Inhalte über die Management-API zurück ins CMS schreiben. Dies läuft als Build-Skript, CI-Job oder Webhook-Handler — je nachdem, was zu Ihrem Workflow passt.

PolyLingo verarbeitet Markdown, HTML und Klartext, sodass es mit jedem Format funktioniert, das Ihr CMS für reichhaltige Inhalte verwendet. Strukturierte Felder (Überschriften, Haupttext, Auszug) können einzeln übersetzt werden, um Ihnen granularen Einfluss darauf zu geben, welche Felder übersetzt werden.

🟠

Sanity + PolyLingo

Das Document Internationalization Plugin von Sanity erstellt verknüpfte Dokumentvarianten pro Locale. Das untenstehende Skript holt die englischen Basisdokumente und erstellt automatisch übersetzte Varianten für jede Zielsprache.

Funktioniert mit dem Dokument-Level-i18n-Muster (ein Dokument pro Locale) sowie dem Feld-Level-Muster (alle Locales in einem Dokument). Für das Feld-Level-Muster über Felder statt Dokumente iterieren.

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 speichert Locale-Varianten als Felder im selben Eintrag. Das untenstehende Skript verwendet die Contentful Management API, um englische Einträge abzurufen, zu übersetzen und die übersetzten Inhalte direkt in die locale-spezifischen Felder zu schreiben — kein manuelles Kopieren und Einfügen erforderlich.

Contentful verwendet BCP 47 Locale-Codes (z. B. es-ES statt es). Ordnen Sie die ISO 639-1-Codes von PolyLingo entsprechend Ihrer Contentful-Locale-Konfiguration zu.

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

Die Localization API von Webflow (verfügbar in CMS- und Business-Plänen) unterstützt locale-spezifische Feldinhalte. Das untenstehende Skript holt CMS-Sammlungsobjekte, übersetzt das HTML-Body-Feld und schreibt die Übersetzungen über die Webflow v2 API zurück in jede Locale-Variante.

Webflow speichert Rich-Text-Felder als HTML. Die HTML-Übersetzung von PolyLingo bewahrt alle von Webflow generierten Markups — benutzerdefinierte Klassen, Attribute und eingebettete Elemente — unverändert.

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 } }) }
    )
  }
}

Was PolyLingo Headless-CMS-Nutzern bietet

  • Sanity — Übersetzung beim Veröffentlichen via Webhook, Rückschreiben in Dokument-Lokalisierungen
  • Contentful — automatische Übersetzung von Einträgen, wenn die englische Lokalisierung aktualisiert wird
  • Webflow — Übersetzung von CMS-Sammlungsobjekten über die API
  • Jedes Headless CMS mit API — das Integrationsmuster ist dasselbe
  • Rich Text, Markdown und HTML werden alle korrekt erhalten
  • Alle 36 Sprachen in einer Anfrage — keine Aufrufe pro Sprache
  • Funktioniert mit jedem CMS, das eine Management-API hat
  • Inhalte können bei jeder Veröffentlichung neu übersetzt werden — keine manuelle Synchronisation

Der Standard-Workflow für mehrsprachige CMS

1

Erstellen Sie Inhalte in Ihrer Quellsprache

Erstellen und veröffentlichen Sie Inhalte in Englisch (oder welcher Sprache auch immer Ihre Quelle ist). Ihr CMS speichert dies als autoritative Version. Sie müssen Ihren redaktionellen Workflow nicht ändern.

2

Starten Sie das Übersetzungsskript

Führen Sie das Skript manuell, zeitgesteuert oder über einen Webhook aus, der bei Veröffentlichungsereignissen in Ihrem CMS ausgelöst wird. Das Skript ruft PolyLingo einmal pro Dokument mit allen Zielsprachen auf und schreibt alle Übersetzungen in einem Durchgang zurück in Ihr CMS.

3

Bereitstellen — übersetzte Inhalte sind live

Ihr Frontend liest wie gewohnt locale-spezifische Inhalte aus dem CMS. Es sind keine Änderungen am Frontend-Code erforderlich. Die übersetzten Inhalte erscheinen in der richtigen Sprache für jede Locale-Route.

Für wen das gebaut wurde

✍️

Content-Teams bei Sanity oder Contentful

Ihre Redakteure veröffentlichen auf Englisch. Übersetzte Inhalte erscheinen automatisch in allen Locales, ohne dass das Redaktionsteam mit Übersetzungstools interagieren muss.

🏢

Agenturen, die mehrsprachige Websites erstellen

Jede Kundenwebsite, die Sie erstellen, benötigt Mehrsprachigkeit. PolyLingo bietet Ihnen eine wiederverwendbare, abrechenbare Integration, die mit jedem Headless CMS in Ihrem Stack funktioniert.

🌍

E-Commerce mit lokalisierten Produktinhalten

Produktbeschreibungen, Kategorieseiten und Blog-Inhalte — alle automatisch übersetzt beim Veröffentlichen. Kombinieren Sie dies mit locale-spezifischer Preisgestaltung für ein vollständig lokalisiertes Einkaufserlebnis.

Häufig gestellte Fragen zu Headless CMS Mehrsprachigkeit

Funktioniert PolyLingo auch mit CMS, die hier nicht aufgeführt sind?

Ja. Jedes CMS mit einer Management-API kann mit demselben Muster integriert werden — Inhalte abrufen, PolyLingo aufrufen, zurückschreiben. Prismic, Storyblok, DatoCMS, Strapi, Ghost und Directus haben alle Management-APIs und funktionieren mit diesem Ansatz. Die Integrationsbeispiele für Sanity, Contentful und Webflow oben veranschaulichen das Muster.

Kann ich Rich Text mit eingebetteten Bildern und Links übersetzen?

Ja. Die HTML-Übersetzung bewahrt alle eingebetteten Elemente, einschließlich Bilder (src- und alt-Attribute werden korrekt behandelt), Links (href bleibt erhalten, Linktext wird übersetzt) und Iframes. Die einzige Ausnahme sind Inhalte, die explizit als nicht übersetzbar markiert sind — Codeblöcke zum Beispiel werden niemals übersetzt.

Wie gehe ich mit Inhalten um, die nicht übersetzt werden sollen?

Für strukturierte Inhalte mit nicht übersetzbaren Feldern (Slugs, Daten, technische Identifikatoren) senden Sie nur die Felder, die übersetzt werden sollen. Für Rich Text mit gemischten übersetzbaren und nicht übersetzbaren Abschnitten verwenden Sie das HTML-Format — PolyLingo übersetzt den Textinhalt und bewahrt Codeblöcke und andere strukturierte Elemente automatisch.

Was ist, wenn mein CMS verschachtelte Inhaltstypen hat?

Für tief verschachtelte Inhalte (Dokumente mit Verweisen auf andere Dokumente) übersetzen Sie jeden Dokumenttyp unabhängig. Das vermeidet zirkuläre Verweise und gibt Ihnen saubere Kontrolle darüber, welche Inhalte übersetzt werden. Verweise zwischen Dokumenten werden vom CMS verwaltet — PolyLingo berührt nur die Feldinhalte, nicht die Dokumentbeziehungen.

Wie halte ich Übersetzungen synchron, wenn sich die Quellinhalte ändern?

Das empfohlene Muster ist, das Übersetzungsskript bei jedem Veröffentlichungsereignis über einen CMS-Webhook auszulösen. So wird sichergestellt, dass übersetzte Inhalte aktualisiert werden, sobald sich die Quelle ändert. Für selteneren Content-Updates funktioniert es ebenso gut, das Skript nachts oder vor jedem Produktions-Deployment auszuführen.

Gibt es eine Möglichkeit, Übersetzungen als "Überprüfung erforderlich" zu markieren, anstatt sie automatisch zu veröffentlichen?

Das hängt von Ihrem CMS ab. Contentful und Sanity unterstützen beide Entwurfszustände — Sie können übersetzte Inhalte als Entwurf statt veröffentlicht speichern, sodass eine menschliche Überprüfung vor dem Live-Schalten jeder Locale möglich ist. Die Skriptbeispiele oben verwenden sofortiges Veröffentlichen/Erstellen; ändern Sie den letzten Schritt, um stattdessen Entwürfe zu erstellen für einen Review-Workflow.

Fügen Sie heute Mehrsprachigkeit zu Ihrem Headless CMS hinzu.

Kostenloses Kontingent. 100.000 Tokens pro Monat. Keine Kreditkarte erforderlich.

Kostenlos mit Übersetzen starten

Kostenloses Kontingent — 100.000 Tokens pro Monat. Funktioniert mit jedem CMS.

Mehrsprachigkeit für Headless CMS — Sanity, Contentful und mehr — PolyLingo | PolyLingo