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
2.9 KiB
JSON
97 lines
2.9 KiB
JSON
{
|
||
"statusbar": {
|
||
"label": "Page information",
|
||
"updated": "Updated {{date}}",
|
||
"words_one": "{{count}} word",
|
||
"words_other": "{{count}} words",
|
||
"readingTime": "~{{minutes}} min read"
|
||
},
|
||
"layout": {
|
||
"sidebar": {
|
||
"expand": "Show sidebar",
|
||
"collapse": "Hide sidebar",
|
||
"resize": "Resize sidebar",
|
||
"label": "Pages",
|
||
"placeholder": "Your ponds and pages will appear here.",
|
||
"empty": "No pages yet.",
|
||
"sortLabel": "Sort pages",
|
||
"sortMode": {
|
||
"alpha": "A–Z",
|
||
"created": "Creation date",
|
||
"manual": "Manual order"
|
||
},
|
||
"reorder": {
|
||
"up": "Move up",
|
||
"down": "Move down",
|
||
"dragHint": "Drag to reorder",
|
||
"moved": "Moved {{title}} to position {{position}} of {{count}}.",
|
||
"reparented": "Moved {{title}} under {{parent}}."
|
||
},
|
||
"newPage": "+ New page",
|
||
"newPageHint": "New page",
|
||
"newPageTitle": "Title",
|
||
"newPageUnder": "Will be created under “{{title}}”.",
|
||
"create": "Create",
|
||
"cancel": "Cancel",
|
||
"view": {
|
||
"toggleLabel": "Sidebar view",
|
||
"folders": "Folders",
|
||
"labels": "Labels",
|
||
"unlabeled": "Unlabeled",
|
||
"expand": "Expand subpages",
|
||
"collapseNode": "Collapse subpages",
|
||
"defaultTitle": "Sidebar view",
|
||
"defaultLabel": "Default view",
|
||
"defaultHint": "The default for all members; everyone can switch their own sidebar locally.",
|
||
"saved": "Saved."
|
||
},
|
||
"favorites": {
|
||
"filter": "Favorites",
|
||
"empty": "No favorites in this pond yet."
|
||
}
|
||
},
|
||
"pondSwitcher": {
|
||
"label": "Switch pond",
|
||
"trigger": "Select a pond"
|
||
},
|
||
"user": {
|
||
"anonymous": "Not signed in"
|
||
}
|
||
},
|
||
"pondHome": {
|
||
"empty": "This pond doesn't have any pages yet — create one from the sidebar."
|
||
},
|
||
"home": {
|
||
"title": "Welcome to Dorfteich",
|
||
"intro": "Dorfteich is an open-source wiki with real-time collaboration. This instance is being set up.",
|
||
"api": {
|
||
"checking": "Checking API …",
|
||
"ok": "API reachable",
|
||
"error": "API not reachable"
|
||
}
|
||
},
|
||
"notFound": {
|
||
"title": "Page not found",
|
||
"body": "The address you opened does not exist.",
|
||
"home": "Back to the start page"
|
||
},
|
||
"pond": {
|
||
"create": {
|
||
"menuItem": "+ New pond",
|
||
"title": "Create a shared pond",
|
||
"nameLabel": "Name",
|
||
"descriptionLabel": "Description (optional)",
|
||
"submit": "Create pond",
|
||
"cancel": "Cancel",
|
||
"quotaHint": "Shared ponds count against your quota — ask a site admin if creation is rejected."
|
||
},
|
||
"delete": {
|
||
"title": "Delete pond",
|
||
"hint": "Moves this pond with all of its pages to the site-level trash. A site admin can restore it. Your personal pond cannot be deleted.",
|
||
"confirmLabel": "Type the pond name to confirm: {{name}}",
|
||
"submit": "Delete pond",
|
||
"deleted": "Pond deleted."
|
||
}
|
||
}
|
||
}
|