Payload CMS
Verbinde dein Payload CMS mit einer Lokalisierungs-Engine, wähle die Collections und Globals aus, die abgedeckt werden sollen, und Lingo.dev übersetzt die lokalisierten Felder in deine Zielsprachen und schreibt sie in Payload unter der jeweiligen Sprache zurück.
Funktioniert mit Payload-3-Projekten, in denen die Lokalisierung aktiviert ist und der Lexical-Rich-Text-Editor verwendet wird. Der ältere Slate-Editor wird nicht unterstützt. Lokalisierte text-, textarea- und richText-Felder werden übersetzt. Alles andere im Dokument bleibt unverändert.
Payload CMS ist im Enterprise-Plan enthalten. Wenn auf der Connect-Seite Payload CMS is not on your plan steht, melde dich bei uns — wir kümmern uns darum.
Bevor du loslegst#
Du brauchst drei Dinge:
- Payload 3 mit eingerichteter Lokalisierung. Achte darauf, dass deine Quell- und Ziel-Sprachen mit den Sprachen in deiner Payload-Konfiguration übereinstimmen.
- Ein Service-Benutzer mit API-Schlüssel. Aktiviere
useAPIKey: truefür deine Auth-Collection (normalerweiseusers), erstelle einen Benutzer für Lingo.dev und generiere im Payload-Admin einen API-Schlüssel dafür. Der Benutzer braucht Lese- und Aktualisierungszugriff auf jede Collection und jedes Global, die du übersetzen möchtest. - Eine Lokalisierungs-Engine. Ihr Glossar, ihre Markenstimme und ihre Regeln prägen die Übersetzungen.
Sprachcodes müssen zu deiner Payload-Konfiguration passen
Die Sprachen, die du in Lingo.dev auswählst, müssen exakt mit den Codes unter localization.locales übereinstimmen. Wenn Payload en und de verwendet, wähle Englisch und Deutsch, nicht Englisch (Vereinigte Staaten): en-US und en sind unterschiedliche Sprachen. Verwende deine Payload-defaultLocale als Ausgangssprache, denn auf Änderungen in dieser Sprache reagiert das Plugin.
Verbinde deine Payload-Instanz#
Öffne die Integration
Gehe zu Studio -> All integrations und klicke auf der Payload-CMS-Karte auf Connect.
Gib die Details deiner Instanz ein
| Feld | Was du eintragen musst |
|---|---|
| Adresse | Die Root-URL deiner Instanz, z. B. https://cms.example.com. Nur HTTPS |
| Auth-Collection | Die Collection, zu der dein Service-API-Schlüssel gehört, normalerweise users |
| API-Schlüssel | Der API-Schlüssel des Service-Benutzers |
| Custom headers | Optional. Wird mit jeder Anfrage an deine Instanz gesendet. Klicke für jede Kopfzeile auf Add header oder füge eine Name: value-Zeile ein, um eine Zeile auszufüllen |
Klicke auf Verify instance. Lingo.dev prüft den Schlüssel gegen deine Instanz, bevor es weitergeht.
Wähle aus, was übersetzt werden soll
| Einstellung | Was sie macht |
|---|---|
| Name | Wie diese Verbindung heißen soll, zum Beispiel Production oder Staging, damit du deine Instanzen auseinanderhalten kannst |
| Collections and Globals | Klicke die Einträge an, die übersetzt werden sollen. Einträge, die der Service-Benutzer nicht lesen und aktualisieren kann, sind durchgestrichen und lassen sich erst auswählen, wenn er Zugriff hat |
| Engine | Die Lokalisierungs-Engine, deren Glossar, Regeln und Markenstimme diese Übersetzungen befolgen |
| Ausgangssprache | Die Sprache, in der dein Redaktionsteam schreibt. Verwende dein Payload-defaultLocale |
| Zielsprachen | Die Sprachen, in die übersetzt werden soll |
| Modus | Publish übersetzt nur veröffentlichte Änderungen und veröffentlicht die Übersetzungen. Draft übersetzt auch als Entwurf gespeicherte Änderungen und speichert die Übersetzungen als Entwürfe. Siehe unten „Drafts vs Published“ |
Klicke auf Connect.
Installiere das Plugin
Im letzten Schritt wird deine Webhook URL angezeigt. Kopiere sie jetzt. Sie wird nur einmal angezeigt. Speichere sie in deiner Payload-Umgebung als LINGO_WEBHOOK_URL, installiere dann das Plugin und füge es deiner Konfiguration hinzu:
pnpm add @lingo.dev/payloadcmsimport { buildConfig } from "payload";
import { lingo } from "@lingo.dev/payloadcms";
export default buildConfig({
// ...your collections, globals, and localization config
plugins: [
lingo({
webhookUrl: process.env.LINGO_WEBHOOK_URL,
}),
],
});Klicke auf Done und deploye Payload anschließend neu. Ab jetzt wird jede in der Ausgangssprache veröffentlichte Änderung zur Übersetzung an Lingo.dev gesendet.
Was das Plugin macht
Es fügt einen GET /api/lingo/schema-Endpunkt hinzu, der Lingo.dev mitteilt, welche deiner Felder lokalisierter Text sind, sowie einen Hook, der Lingo.dev benachrichtigt, wenn sich ein Dokument oder Global ändert. Umfang, Sprachen und Engine verwaltest du im Dashboard, sodass du sie ohne erneutes Deployment ändern kannst. Lass webhookUrl weg, um den Hook zu überspringen und jede Übersetzung über das Dashboard zu starten.
Wähle aus, was übersetzt wird#
Die Verbindungsseite hat vier Tabs: Collections, Globals, Workflow runs und Settings.
Der Geltungsbereich wird pro Collection und pro Global festgelegt. Die Tabs Collections und Globals listen alles auf, was deine Instanz anbietet — jeweils eine Zeile pro Eintrag, inklusive der letzten Synchronisierung. Jede Zeile hat einen Sync-Schalter: Wenn du ihn aktivierst, wird ab dann jedes Dokument in dieser Collection oder in diesem Global einbezogen. Die Änderung wird sofort beim Umschalten gespeichert und gilt ohne neues Deployment schon für den nächsten Durchlauf. Mit dem Schalter in der Tabellenkopfzeile schaltest du Sync für alle Einträge in der Liste ein oder aus.
Eine mit no read + update markierte Zeile ist gesperrt: Der Service-Benutzer kann sie nicht lesen und aktualisieren, daher kann sie nicht übersetzt werden. Bei einer mit not localized yet markierten Zeile ist Sync ausgeschaltet.
Sprachen, Engine und Modus änderst du im Tab Settings.
Innerhalb eines Dokuments entscheidet deine Payload-Feldkonfiguration, was übersetzt wird:
| Feld | Übersetzt |
|---|---|
text-, textarea- und richText-Felder, die mit localized: true markiert sind. | Ja |
Dieselben Feldtypen innerhalb eines lokalisierten group, array, blocks oder tabs | Ja |
| Blöcke und Inline-Blöcke in Rich Text | Ja, ihre Textfelder nach denselben Regeln |
select, radio, checkbox, number, date, relationship, upload, json, code, email, point | Nein |
| Felder, die nicht lokalisiert sind und kein lokalisiertes übergeordnetes Feld haben. | Nein |
id, blockType, blockName | Nein |
Rich Text wird als Lexical-Baum übersetzt. Formatierung, Links, Uploads und Blockstruktur bleiben erhalten, und nur der enthaltene Text wird ersetzt. Ein Satz, der durch fett formatierten Text oder einen Link unterbrochen ist, wird als zusammenhängender Satz übersetzt.
Um ein Feld in den Umfang aufzunehmen, markiere es in Payload mit localized: true und deploye erneut. Beim nächsten Lauf wird es automatisch berücksichtigt.
Synchronisieren und neu übersetzen#
Automatische Durchläufe. Wenn webhookUrl im Plugin gesetzt ist, benachrichtigt jedes Speichern eines Dokuments oder Globals in der Ausgangssprache Lingo.dev. Speicherungen innerhalb eines kurzen Zeitfensters werden zusammengefasst und in einem einzigen Durchlauf verarbeitet. Speicherungen in anderen Sprachen, Entwurfsspeicherungen (es sei denn, die Verbindung ist im Modus Draft) und Inhalte außerhalb deines Geltungsbereichs werden ignoriert.
Manuelle Durchläufe. Zwei Schaltflächen, zwei unterschiedliche Jobs:
| Button | Was sie macht | Wann du ihn verwendest |
|---|---|---|
| Sync | Übersetzt nur das, was sich seit dem letzten Lauf geändert hat | Zum Nachziehen von Inhalten nach dem Verbinden oder für einen neuen Versuch nach einem Fehler |
| Retranslate | Übersetzt alles im Geltungsbereich noch einmal komplett von Grund auf | Nach Änderungen am Glossar, an der Markenstimme oder an den Regeln deiner Engine |
Beide befinden sich in der Seitenkopfzeile und gelten dort für alles, bei dem Sync aktiviert ist. Bei „Retranslate“ in der Kopfzeile musst du die Aktion zuerst bestätigen. Wenn du nur einige Collections oder Globals ausführen möchtest, markiere ihre Zeilen: Queue sync (N) und Queue retranslation (N) erscheinen dann und gelten nur für diese Zeilen. Eine Zeile lässt sich erst markieren, wenn ihr Sync-Schalter aktiviert ist.
Beim Verbinden wird noch nichts übersetzt. Um bereits vorhandene Inhalte zu übersetzen, klicke in der Seitenkopfzeile auf Sync. Wenn du später eine Zielsprache hinzufügst, funktioniert es genauso: Der nächste Sync füllt sie aus.
Pro Verbindung kann immer nur ein Durchlauf gleichzeitig laufen. Weitere Anfragen landen in der Warteschlange und starten der Reihe nach.
Retranslate überschreibt manuelle Bearbeitungen
Retranslate erstellt jedes übersetzte Feld in seinem Umfang neu, einschließlich Übersetzungen, die dein Team in Payload manuell bearbeitet hat. Sync erstellt nur Felder neu, deren Ausgangstext sich geändert hat, sodass manuelle Änderungen an anderen Stellen erhalten bleiben.
Einen Lauf verfolgen#
Der Tab Workflow runs listet jeden Durchlauf auf: wann er gestartet wurde, wodurch er ausgelöst wurde (Webhook oder Manual, dann Sync oder Retranslate), welche Sprachen er umfasst hat, wie lange er gedauert hat und welchen Status er hat. Ein Durchlauf in der Warteschlange oder ein laufender Durchlauf hat die Schaltfläche Stop. Öffne eine Zeile, um das Ergebnis pro Sprache zu sehen.
| Status | Bedeutung |
|---|---|
| Queued | Wartet auf den Lauf davor |
| Running | In Bearbeitung |
| Completed | Jede Übersetzung wurde zurückgeschrieben |
| Up to date | Seit dem letzten Lauf hat sich nichts innerhalb des Umfangs geändert. Kein Fehler |
| Failed | Der Durchlauf wurde gestoppt. Der Grund wird in der Zeile des Durchlaufs angezeigt |
| Cancelled | Von jemandem aus deinem Team gestoppt |
Ein fehlgeschlagener Durchlauf behält alles bei, was bereits geschrieben wurde. Die Fehlermeldung listet die Dokumente auf, die nicht geschrieben wurden, und bei der nächsten Synchronisierung wird erneut versucht, sie zu schreiben. Ein Dokument, das während des Durchlaufs von einer Editorin oder einem Editor gespeichert wurde, wird übersprungen und im nächsten Durchlauf berücksichtigt.
Wo Übersetzungen landen#
Jede Übersetzung wird im selben Dokument oder Global unter ihrer Zielsprache gespeichert – nach Payloads eigenem Lokalisierungsmodell. Es werden nur übersetzte Felder geschrieben. Alle anderen Felder bleiben unverändert. Rückschreibungen laufen über den Service-Benutzer und lösen keinen neuen Durchlauf aus.
Vorhandene Übersetzungen bleiben erhalten. Beim ersten Sync eines Dokuments bleibt alles, was in einer Zielsprache bereits vorhanden ist, an Ort und Stelle, und nur die fehlenden Felder werden übersetzt. Ein Feld, das noch den Payload-Standardwert enthält, gilt als fehlend. Verwende Retranslate, um vorhandene Übersetzungen zu ersetzen.
Entwürfe vs. veröffentlicht#
Im Modus Publish lösen nur veröffentlichte Änderungen einen Durchlauf aus, und Übersetzungen werden veröffentlicht, sobald sie geschrieben sind. Payload veröffentlicht immer das gesamte Dokument — daher gehen alle unveröffentlichten Entwurfsänderungen daran zusammen mit der Übersetzung live.
Im Modus Draft lösen auch als Entwurf gespeicherte Änderungen Durchläufe aus. Lingo.dev liest den neuesten Entwurf der Quelle und speichert jede Übersetzung als Entwurf. Für deine Leser ändert sich nichts, bis jemand die Übersetzung in Payload veröffentlicht. Nutze das, wenn du die Übersetzungsqualität auswertest oder wenn Übersetzungen eine Prüfung durchlaufen.
Du kannst den Modus später im Tab Settings ändern.
Verbindung verwalten#
Settings#
Der Tab Settings zeigt die Instanz, aus der die Verbindung liest, welche Collections und Globals Sync aktiviert haben und ob die Verbindung Working oder Cannot be reached ist. Dort kannst du den Namen, die Ausgangssprache, die Zielsprachen, die Engine und den Modus ändern. Bei jeder Änderung bleibt die Webhook-URL gleich — ein neues Deployment ist also nicht nötig.
Die Adresse und der API-Schlüssel werden beim Herstellen der Verbindung festgelegt und können danach nicht mehr geändert werden. Wenn Lingo.dev auf eine andere Adresse oder einen anderen Schlüssel zeigen soll, trenne die Verbindung und stelle sie erneut her.
Verbindung trennen#
Disconnect unten im Tab Settings sorgt dafür, dass Lingo.dev nicht länger aus der Instanz liest und in sie schreibt. Dabei werden die Verbindung, ihr Durchlaufverlauf und der Nachweis darüber entfernt, was bereits übersetzt wurde. Bereits geschriebene Übersetzungen bleiben in Payload erhalten. Entferne danach LINGO_WEBHOOK_URL oder das Plugin aus deiner Konfiguration.
Erneut verbinden heißt: neue Webhook-URL
Eine neue Verbindung erhält eine neue Webhook-URL. Aktualisiere deshalb LINGO_WEBHOOK_URL und deploye erneut, bevor automatische Läufe wieder funktionieren. Der erste Sync liest jedes Dokument im Umfang erneut ein, behält die Übersetzungen bei, die in Payload bereits vorhanden sind, und füllt die Lücken.
Einschränkungen#
| Einschränkung | Details |
|---|---|
| Payload-Version | Payload 3 mit konfigurierter Lokalisierung |
| Feldtypen | text-, textarea- und richText-Felder (nur Lexical), die mit localized markiert sind. |
| Umfang | Komplette Collections und Globals. Keine Auswahl auf Feldebene |
| Verbindungen | Mehrere pro Organisation, eine pro Payload-Instanz |
| Gleichzeitige Läufe | Eine pro Verbindung |
| Adresse | Nur HTTPS |
Fehlerbehebung#
Das Verbinden schlägt mit "Payload rejected the API key" fehl. Prüfe den Schlüssel, den Slug der Auth-Collection und ob useAPIKey für diese Collection aktiviert ist.
Eine Collection oder ein Global zeigt "no read + update" an. Gib dem Service-Benutzer in der Zugriffskonfiguration dieser Collection Lese- und Aktualisierungszugriff und lade dann die Verbindungsseite neu. Danach wird der Sync-Schalter der Zeile entsperrt.
Der erste Lauf schlägt mit "The Lingo plugin isn't installed" fehl. Füge @lingo.dev/payloadcms zu plugins in deiner Payload-Konfiguration hinzu und deploye erneut. Das Verbinden funktioniert ohne das Plugin, das Synchronisieren jedoch nicht.
Das Veröffentlichen in Payload startet keinen Durchlauf. Prüfe, ob LINGO_WEBHOOK_URL gesetzt ist, localization konfiguriert ist, die Collection oder das Global im Geltungsbereich liegt, die Speicherung in der Ausgangssprache erfolgt ist und es sich um eine Veröffentlichung statt um einen Entwurf handelt — außer die Verbindung ist im Modus Draft.
Ein Feld wird nicht übersetzt. Weder das Feld selbst noch ein übergeordnetes Feld hat localized: true, oder es ist kein text-, textarea- oder richText-Feld.
Der Tab Settings zeigt die Verbindung als Cannot be reached an. Prüfe, ob die Instanz erreichbar ist, der Schlüssel noch gültig ist und alle Gateway-Header weiterhin funktionieren. Die Adresse und der Schlüssel lassen sich bei einer bestehenden Verbindung nicht bearbeiten. Wenn sich also einer von beiden geändert hat, trenne die Verbindung, stelle sie erneut her und aktualisiere LINGO_WEBHOOK_URL mit der neuen Webhook-URL.