All checks were successful
CD / Build and push images (push) Successful in 3m2s
CI / Lint, typecheck, test (push) Successful in 2m15s
CI / Auth e2e pack (push) Successful in 2m42s
CI / Build container images (push) Has been skipped
CD / Deploy to Test (push) Successful in 8s
CD / Smoke tests against Test (push) Successful in 1m13s
CD / Promote to Int (push) Successful in 11s
Introduce Obsidian-style `[[page links]]` (ADR 0004).
- shared: reserved `wikilink` inline atom in the editor schema (attrs
`targetSlug`, optional `displayText`); markdown mapping `[[slug]]` /
`[[slug|text]]` via a markdown-it inline rule + serializer node; plain-text
and HTML derivation include the shown text. Round-trip + parse unit tests.
- web:
- `Wikilink` node extension with a React NodeView: shows the explicit
display text or the target's current title (so a rename updates the link),
renders a missing target as a dashed phantom with a tooltip, navigates on
click in read mode.
- `[[` autocomplete popup (`WikilinkAutocomplete`), dependency-free: filters
the pond's pages as you type with a create-new-page hint for misses,
Enter/click inserts the node and removes the typed `[[query`; ↑/↓/Enter/Esc
intercepted in the capture phase so ProseMirror does not act on them.
- `WikilinkContext` provides the pond's pages (slug→title) for live
resolution and the autocomplete, populated by the page editor.
- i18n `editor.wikilink.*` (de + en); wikilink + phantom + popup styles.
- e2e `wikilink.spec.ts` (new CI pack): type `[[`, autocomplete filters and
inserts a working link that resolves the target title and persists across a
reload. Phantom → live resolution on page creation is verified in #47.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PGdhRiwU1WRL4XxJfZYipY
136 lines
5.0 KiB
JSON
136 lines
5.0 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."
|
|
},
|
|
"presence": {
|
|
"label": "{{count}} Personen auf dieser Seite",
|
|
"viewer": "{{name}} (nur Lesen)"
|
|
},
|
|
"offline": {
|
|
"localOnly": "Diese Seite hat Änderungen, die nur auf diesem Gerät gespeichert sind. Sie werden automatisch synchronisiert, sobald du wieder online bist."
|
|
},
|
|
"accessRevoked": {
|
|
"title": "Deine Bearbeitungsberechtigung wurde entfernt",
|
|
"description": "Du kannst diese Seite nicht mehr bearbeiten. Deine ungespeicherten Änderungen liegen noch auf diesem Gerät — exportiere sie, bevor du die Seite verlässt, da sie nicht auf dem Server gespeichert werden.",
|
|
"copy": "Als Markdown kopieren",
|
|
"copied": "Kopiert!",
|
|
"copyFailed": "Kopieren fehlgeschlagen",
|
|
"download": "Als Markdown herunterladen",
|
|
"discard": "Meine Änderungen verwerfen",
|
|
"discardConfirm": "Die auf diesem Gerät gespeicherten Änderungen verwerfen? Das kann nicht rückgängig gemacht werden."
|
|
},
|
|
"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"
|
|
}
|
|
},
|
|
"history": {
|
|
"title": "Versionsverlauf",
|
|
"open": "Verlauf",
|
|
"close": "Schließen",
|
|
"empty": "Noch keine Versionen.",
|
|
"error": "Du kannst den Verlauf dieser Seite nicht ansehen.",
|
|
"restore": "Diese Version wiederherstellen",
|
|
"restored": "Wiederhergestellt",
|
|
"restoreConfirm": "Die Seite auf diese Version zurücksetzen? Der aktuelle Stand wird vorher als Version gesichert, sodass du das rückgängig machen kannst.",
|
|
"diffTitle": "Änderungen von dieser Version bis heute",
|
|
"viewTitle": "Vorschau",
|
|
"contributors_one": "{{count}} Beitragende:r",
|
|
"contributors_other": "{{count}} Beitragende",
|
|
"trigger": {
|
|
"auto": "Automatischer Schnappschuss",
|
|
"manual": "Benannte Version",
|
|
"pre_restore": "Vor einer Wiederherstellung"
|
|
}
|
|
},
|
|
"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"
|
|
},
|
|
"wikilink": {
|
|
"phantomTooltip": "Diese Seite existiert noch nicht",
|
|
"autocompleteLabel": "Auf eine Seite verlinken",
|
|
"createHint": "Seite „{{title}}“ anlegen"
|
|
}
|
|
}
|