Neue schlanke Statuszeile (letzte Aktualisierung · Wortzahl · geschätzte Lesezeit) zwischen Seitenkopf und Artikel — im authentifizierten Lesemodus und in der öffentlichen Ansicht. - Geteilte Komponente `PageStatusBar` (Datum via Intl in der aktiven Sprache, Lesezeit = ceil(Wörter/200), Singular/Plural, Lesezeit ausgeblendet bei 0 Wörtern). - `countWords`/`htmlToText`-Helfer in lib/word-count.ts. - Authentifiziert (`PageEditorPage`, nur Lesemodus): Wortzahl aus dem vorhandenen Markdown-Export (geteilter Query-Key ['page-markdown']), `updatedAt` direkt von `page.data`. - Öffentlich (`PublicPageView`): Wortzahl aus dem server-gerenderten HTML per DOMParser — kein Editor-Bundle nötig; kein Backend-Change. - i18n common.statusbar (de+en), CSS `.page-statusbar` (middot-getrennt, gedämpft). Gates grün (typecheck/lint/i18n:check); visuell verifiziert. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0155v2aT8AG1kZDQEZiCLBWC
97 lines
3.3 KiB
JSON
97 lines
3.3 KiB
JSON
{
|
||
"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": "A–Z",
|
||
"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"
|
||
}
|
||
},
|
||
"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."
|
||
}
|
||
}
|
||
}
|