All checks were successful
CD / Build and push images (push) Successful in 2m59s
CI / Lint, typecheck, test (push) Successful in 2m0s
CI / Auth e2e pack (push) Successful in 2m10s
CI / Build container images (push) Has been skipped
CD / Deploy to Test (push) Successful in 9s
CD / Smoke tests against Test (push) Successful in 1m14s
CD / Promote to Int (push) Successful in 11s
The editor now edits over the collaboration server instead of REST — the moment Dorfteich becomes collaborative (ADR 0003, realtime-collaboration.md). Web: - New `useCollabProvider` hook binds a page's Y.Doc to a HocuspocusProvider. The document loads and persists through the collab server (#35); there is no REST autosave and no REST seed (a REST seed would fork the doc lineage and duplicate content). The collab token is fetched lazily on every (re)connect via an async token function, so an expired token is replaced transparently and a permission change takes effect on the next reconnect. - Connection-state UI replaces the save indicator: connecting / connected ("Live") / reconnecting / offline, driven by provider status + navigator online state. Read-only (`ro`) tokens make the editor non-editable with a reason; an oversize-document stateless error (#35) surfaces a banner. - Removed `use-page-autosave.ts` and `yjs-base64.ts` (no longer used). API: - `PUT /pages/:id/state` is retired and returns 410 `rest_state_write_retired` (the criterion deferred here from #35). Collab is the sole writer of page state; the read paths remain. Removed the now-dead `saveState` service. e2e / CI: - The e2e static server proxies the `/collab` WebSocket upgrade (mirrors Caddy); vite dev gains a `/collab` ws proxy. The auth-e2e CI job starts the collab server and runs a new collab pack. - New `collab.spec.ts`: two browsers converge on one page (the milestone headline), and offline edits continue locally and sync on reconnect. The read-only live assertion is a `test.fixme` until real read-only grants exist — under interim access seeing and modifying coincide, so no `ro` token is issued yet (that arrives with #53). Reworked the api/trash tests and the content editor-basics test off the retired REST write path. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PGdhRiwU1WRL4XxJfZYipY
95 lines
3.1 KiB
JSON
95 lines
3.1 KiB
JSON
{
|
|
"title": {
|
|
"placeholder": "Unbenannte Seite"
|
|
},
|
|
"mode": {
|
|
"edit": "Bearbeiten",
|
|
"view": "Lesen",
|
|
"toggleToEdit": "In den Bearbeitungsmodus wechseln",
|
|
"toggleToView": "In den Lesemodus wechseln"
|
|
},
|
|
"connection": {
|
|
"connecting": "Verbindet …",
|
|
"connected": "Live",
|
|
"reconnecting": "Verbindung wird wiederhergestellt …",
|
|
"offline": "Offline — deine Änderungen werden synchronisiert, sobald du wieder verbunden bist"
|
|
},
|
|
"readOnly": {
|
|
"notice": "Du hast nur Lesezugriff auf diese Seite und kannst sie daher nicht bearbeiten."
|
|
},
|
|
"tooLarge": {
|
|
"notice": "Diese Seite hat ihre maximale Größe erreicht, daher wurde deine letzte Änderung nicht gespeichert. Bitte entferne etwas Inhalt."
|
|
},
|
|
"toolbar": {
|
|
"paragraph": "Absatz",
|
|
"heading1": "Überschrift 1",
|
|
"heading2": "Überschrift 2",
|
|
"heading3": "Überschrift 3",
|
|
"heading4": "Überschrift 4",
|
|
"bold": "Fett",
|
|
"italic": "Kursiv",
|
|
"code": "Inline-Code",
|
|
"strikethrough": "Durchgestrichen",
|
|
"bulletList": "Aufzählungsliste",
|
|
"orderedList": "Nummerierte Liste",
|
|
"taskList": "Aufgabenliste",
|
|
"blockquote": "Zitat",
|
|
"codeBlock": "Codeblock",
|
|
"horizontalRule": "Trennlinie",
|
|
"image": "Bild einfügen",
|
|
"undo": "Rückgängig",
|
|
"redo": "Wiederholen",
|
|
"link": {
|
|
"add": "Link hinzufügen",
|
|
"edit": "URL bearbeiten",
|
|
"remove": "Link entfernen",
|
|
"openNewTab": "In neuem Tab öffnen",
|
|
"urlLabel": "Link-URL",
|
|
"apply": "Übernehmen",
|
|
"cancel": "Abbrechen",
|
|
"invalidProtocol": "Dieser Link-Typ ist nicht erlaubt."
|
|
},
|
|
"table": {
|
|
"insert": "Tabelle einfügen",
|
|
"addColumnBefore": "Spalte davor einfügen",
|
|
"addColumnAfter": "Spalte danach einfügen",
|
|
"deleteColumn": "Spalte löschen",
|
|
"addRowBefore": "Zeile davor einfügen",
|
|
"addRowAfter": "Zeile danach einfügen",
|
|
"deleteRow": "Zeile löschen",
|
|
"toggleHeaderRow": "Kopfzeile umschalten",
|
|
"deleteTable": "Tabelle löschen"
|
|
}
|
|
},
|
|
"image": {
|
|
"uploading": "Bild wird hochgeladen …",
|
|
"uploadFailed": "Bild-Upload fehlgeschlagen",
|
|
"altLabel": "Alt-Text",
|
|
"widthLabel": "Bildbreite",
|
|
"width": {
|
|
"small": "Klein",
|
|
"medium": "Mittel",
|
|
"full": "Voll"
|
|
}
|
|
},
|
|
"page": {
|
|
"copyMarkdown": "Als Markdown kopieren",
|
|
"markdownCopied": "Kopiert!",
|
|
"markdownCopyFailed": "Kopieren fehlgeschlagen",
|
|
"downloadMarkdown": "Als Markdown herunterladen",
|
|
"delete": "In den Papierkorb verschieben",
|
|
"deleteConfirm": "Diese Seite in den Papierkorb verschieben? Du kannst sie über den Papierkorb des Teichs wiederherstellen."
|
|
},
|
|
"trash": {
|
|
"link": "Papierkorb",
|
|
"title": "Papierkorb — {{pond}}",
|
|
"empty": "Der Papierkorb ist leer.",
|
|
"deletedAt": "Gelöscht am {{date}}",
|
|
"restore": "Wiederherstellen",
|
|
"purge": "Endgültig löschen",
|
|
"purgeConfirm": "Diese Seite und ihre Dateien endgültig löschen? Das kann nicht rückgängig gemacht werden.",
|
|
"pageTrashedHint": "Diese Seite wurde in den Papierkorb verschoben.",
|
|
"restoreLink": "Im Papierkorb ansehen"
|
|
}
|
|
}
|