dorfteich/packages/shared/i18n/de/common.json
Claude Opus 5 1b992c8626
All checks were successful
CI / Lint, typecheck, test (pull_request) Successful in 7m22s
CI / Build container images (pull_request) Successful in 11s
CI / Auth e2e pack (pull_request) Successful in 9m39s
CI / Import/export fidelity gate (pull_request) Successful in 1m4s
#305: a full pond archive before deletion and before purge
Deleting a pond already had a strict prompt — typing the pond name, stricter
than a confirm dialog. That was never the gap. The gap is that the person who
deletes it loses access the moment they do: the pond leaves their view, only a
Site Admin can bring it back, and the export is no longer reachable for them.
So the archive is offered INSIDE the deletion flow, before the button.

What it contains, and why it is not the existing export:

- Every page the requester may read, as Markdown, as before.
- **Every attachment of the pond**, not only the embedded ones. An
  attachment nobody put on a page would otherwise vanish unnoticed — which
  is the whole reason this issue exists.
- `manifest.json`: pond settings (EFFECTIVE, defaults filled in — a
  preservation format must not require its reader to know Dorfteich's
  defaults), labels, the page hierarchy and sort keys, comments, and
  attachment metadata including the #199 hash so a reader can verify bytes.
  It extends the #210 manifest rather than adding a second descriptor, and
  carries an explicit `formatVersion`.
- `README.txt`, because the manifest is for machines: whoever unpacks a
  folder of Markdown a year from now must not believe they hold a one-click
  restore.

Decisions worth naming:

- **"Complete" describes the RESULT, not the route.** A pond admin who may
  read every page gets `complete: true`; only an archive that actually
  leaves pages out is incomplete. The Site-Admin route skips the read filter
  (an archive taken before an irreversible purge must not depend on which
  ponds the operator happens to be a member of) — those are two different
  questions and the first version of this conflated them.
- **The omission is named before the download**, with its number, in the UI
  and in the manifest. An archive silently missing content is worse than no
  archive, because it ends the search.
- **Not downloading stays allowed.** A pond of test pages should not require
  one, and the server cannot tell whether a file arrived anyway — so the
  finality is stated in text instead of enforced.
- **A plain link, not fetch-into-a-blob.** The api streams the ZIP; buffering
  a whole pond in the tab to draw a progress bar would trade memory for
  cosmetics. The browser reports progress and completion; what it cannot say
  — that the archive is being BUILT — is announced in a live region.
- Read trail unchanged in kind (ADR 0023): one `export` event per classified
  page before any classified byte enters the stream. Attachments never travel
  without their page, so the same events cover them.
- New audit action `pond.archived` (catalogue v1.7) with page and attachment
  counts, omitted pages, and completeness.

Format documented in `docs/architecture/pond-archive-format.md`, including
what is deliberately NOT in it (history, permissions, trash).

Verified by hand, not only asserted: a real pond's archive downloaded and
unpacked — README, manifest, three page files, the media file; the manifest's
effective settings, per-page classification, the VS-NfD frontmatter and
marking preserved in the classified page's Markdown, and the attachment's
sha256 present. Plus six api tests (including that an unembedded attachment
travels and that a Site Admin gets a complete archive without membership) and
the a11y pack 11/11 in both schemes, which now also scans the pond settings
screen.

Not done, because there is nothing to attach it to: the Site Admin's purge
dialog (#193) exists only as an api endpoint — there is no pond-trash UI in
the web app. The api half is here and tested, so it becomes a link when that
screen is built.
2026-08-01 19:36:10 +02:00

114 lines
4.6 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"statusbar": {
"label": "Seiteninformationen",
"updated": "Aktualisiert {{date}}",
"words_one": "{{count}} Wort",
"words_other": "{{count}} Wörter",
"readingTime": "ca. {{minutes}} Min. Lesezeit"
},
"layout": {
"sidebar": {
"expand": "Seitenleiste einblenden",
"collapse": "Seitenleiste ausblenden",
"resize": "Breite der Seitenleiste anpassen",
"label": "Seiten",
"placeholder": "Deine Teiche und Seiten erscheinen hier.",
"empty": "Noch keine Seiten.",
"sortLabel": "Seiten sortieren",
"sortMode": {
"alpha": "AZ",
"created": "Erstellungsdatum",
"manual": "Manuelle Reihenfolge"
},
"reorder": {
"up": "Nach oben",
"down": "Nach unten",
"dragHint": "Zum Umsortieren ziehen",
"moved": "{{title}} an Position {{position}} von {{count}} verschoben.",
"reparented": "{{title}} unter {{parent}} eingeordnet."
},
"newPage": "+ Neue Seite",
"newPageHint": "Neue Seite",
"newPageTitle": "Titel",
"newPageUnder": "Wird unter „{{title}}“ angelegt.",
"create": "Erstellen",
"cancel": "Abbrechen",
"view": {
"toggleLabel": "Ansicht der Seitenleiste",
"folders": "Ordner",
"labels": "Labels",
"unlabeled": "Ohne Label",
"expand": "Unterseiten ausklappen",
"collapseNode": "Unterseiten einklappen",
"defaultTitle": "Seitenleisten-Ansicht",
"defaultLabel": "Standard-Ansicht",
"defaultHint": "Der Standard für alle Mitglieder; jeder kann seine eigene Seitenleiste lokal umschalten.",
"saved": "Gespeichert."
},
"favorites": {
"filter": "Favoriten",
"empty": "Noch keine Favoriten in diesem Teich."
}
},
"pondSwitcher": {
"label": "Teich wechseln",
"trigger": "Teich auswählen"
},
"user": {
"anonymous": "Nicht angemeldet"
},
"skipToContent": "Zum Inhalt springen"
},
"pondHome": {
"empty": "Dieser Teich hat noch keine Seiten lege eine über die Seitenleiste an."
},
"home": {
"title": "Willkommen im Dorfteich",
"intro": "Dorfteich ist ein Open-Source-Wiki mit Echtzeit-Zusammenarbeit. Diese Instanz wird gerade eingerichtet.",
"api": {
"checking": "Prüfe API …",
"ok": "API erreichbar",
"error": "API nicht erreichbar"
}
},
"notFound": {
"title": "Seite nicht gefunden",
"body": "Die aufgerufene Adresse existiert nicht.",
"home": "Zurück zur Startseite"
},
"pond": {
"create": {
"menuItem": "+ Neuer Teich",
"title": "Gemeinsamen Teich anlegen",
"nameLabel": "Name",
"descriptionLabel": "Beschreibung (optional)",
"submit": "Teich anlegen",
"cancel": "Abbrechen",
"quotaHint": "Gemeinsame Teiche zählen gegen dein Kontingent — frag eine Site-Adminin/einen Site-Admin, falls das Anlegen abgelehnt wird."
},
"delete": {
"title": "Teich löschen",
"hint": "Verschiebt diesen Teich mit allen Seiten in den Instanz-Papierkorb. Ein Site-Admin kann ihn wiederherstellen. Dein persönlicher Teich kann nicht gelöscht werden.",
"confirmLabel": "Zur Bestätigung den Teichnamen eintippen: {{name}}",
"submit": "Teich löschen",
"deleted": "Teich gelöscht."
},
"archive": {
"intro": "Bevor du löschst: Lade hier ein Vollarchiv dieses Teichs herunter. Es enthält alle Seiten als Markdown, ALLE Dateianhänge — auch die, die auf keiner Seite eingebunden sind — sowie Einstellungen, Labels, Kommentare und die Seitenstruktur in einer manifest.json.",
"omitted_one": "Achtung: Eine Seite dieses Teichs kannst du nicht lesen und fehlt deshalb im Archiv.",
"omitted_other": "Achtung: {{count}} Seiten dieses Teichs kannst du nicht lesen und fehlen deshalb im Archiv.",
"noImport": "Das Archiv ist ein Bewahrungsformat: Es lässt sich derzeit nicht wieder einspielen. Das Format ist dokumentiert, damit ein Importer später geschrieben werden kann — verlasse dich also nicht darauf, den Teich damit auf Knopfdruck zurückzuholen.",
"download": "Vollarchiv herunterladen",
"started": "Das Archiv wird erstellt; der Download startet, sobald es fertig ist.",
"finality": "Du musst nicht herunterladen. Ohne Archiv gilt aber: Nach Ablauf der Aufbewahrungsfrist im Papierkorb wird der Teich endgültig entfernt — danach bleibt nichts von ihm übrig, weder Seiten noch Dateien."
}
},
"settingsNav": {
"label": "Abschnitte"
},
"tableActions": "Aktionen",
"classification": {
"label": "Einstufung"
}
}