dorfteich/packages/shared/i18n/en/editor.json
Claude Fable 5 6c98a71d34
Some checks failed
CD / Build and push images (push) Successful in 3m57s
CD / Deploy to Test (push) Successful in 11s
CI / Lint, typecheck, test (push) Successful in 4m32s
CI / Build container images (push) Has been skipped
CD / Smoke tests against Test (push) Successful in 1m14s
CD / Promote to Int (push) Successful in 11s
CI / Auth e2e pack (push) Failing after 2m51s
CI / Import/export fidelity gate (push) Has been skipped
Favorites: personal page stars, golden icons, sidebar filter (#132)
Semantics changed from the issue during planning (documented there,
comment 1192): favorites are PERSONAL per user, not pond-wide — the
sys-fav label approach is dropped entirely. Storage is a page_favorites
table (userId+pageId, FK cascade); PUT/DELETE /pages/:id/favorite
toggles idempotently and needs read access only (#60 404 semantics —
a star is a note-to-self, not a page modification), GET
/ponds/:id/favorites lists the account's stars sliced to still-readable
pages. Trashed pages keep their rows, so restore keeps the star; purge
cascades it away.

Web: one shared ['favorites', pondId] query feeds the TopBar star
(between labels and history, golden when set), the golden tree icons in
the sidebar, and a latching "Favorites" filter button next to the view
switch that narrows either view (combinable with the label filter).
No public-API/MCP exposure — with the label approach gone, that parity
is no longer free; favorites stay UI-only for now.

New favorites e2e pack (star toggle, golden icon, filter, per-user
isolation) wired into CI; DB suite covers the round-trip, read gating,
and the trash/restore/purge lifecycle.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fb2VzvcoBPHkjh8bZ6PzQn
2026-07-16 12:03:55 +02:00

181 lines
6.4 KiB
JSON

{
"title": {
"placeholder": "Untitled page"
},
"mode": {
"edit": "Edit",
"view": "Read",
"toggleToEdit": "Switch to edit mode",
"toggleToView": "Switch to read mode"
},
"connection": {
"connecting": "Connecting …",
"connected": "Live",
"reconnecting": "Reconnecting …",
"offline": "Offline — your changes will sync when you reconnect"
},
"readOnly": {
"notice": "You have read-only access to this page, so you can't edit it."
},
"tooLarge": {
"notice": "This page has reached its maximum size, so your latest change wasn't saved. Please remove some content."
},
"presence": {
"label": "{{count}} people on this page",
"viewer": "{{name}} (read-only)"
},
"offline": {
"localOnly": "This page has changes saved only on this device. They'll sync automatically when you're back online."
},
"accessRevoked": {
"title": "Your edit permission was removed",
"description": "You can no longer edit this page. Your unsaved changes are still on this device — export them before you leave, as they won't be saved to the server.",
"copy": "Copy as Markdown",
"copied": "Copied!",
"copyFailed": "Copy failed",
"download": "Download as Markdown",
"discard": "Discard my changes",
"discardConfirm": "Discard the changes saved on this device? This cannot be undone."
},
"toolbar": {
"paragraph": "Paragraph",
"heading1": "Heading 1",
"heading2": "Heading 2",
"heading3": "Heading 3",
"heading4": "Heading 4",
"bold": "Bold",
"italic": "Italic",
"code": "Inline code",
"strikethrough": "Strikethrough",
"bulletList": "Bullet list",
"orderedList": "Numbered list",
"taskList": "Task list",
"blockquote": "Quote",
"codeBlock": "Code block",
"horizontalRule": "Horizontal rule",
"image": "Insert image",
"undo": "Undo",
"redo": "Redo",
"link": {
"add": "Add link",
"edit": "Edit URL",
"remove": "Remove link",
"openNewTab": "Open in new tab",
"urlLabel": "Link URL",
"apply": "Apply",
"cancel": "Cancel",
"invalidProtocol": "This link type is not allowed."
},
"table": {
"insert": "Insert table",
"addColumnBefore": "Add column before",
"addColumnAfter": "Add column after",
"deleteColumn": "Delete column",
"addRowBefore": "Add row before",
"addRowAfter": "Add row after",
"deleteRow": "Delete row",
"toggleHeaderRow": "Toggle header row",
"deleteTable": "Delete table"
},
"section": {
"label": "Section style",
"none": "No section",
"remove": "Unwrap section"
},
"pluginBlock": {
"label": "Insert plugin block",
"placeholder": "Insert block …"
}
},
"image": {
"uploading": "Uploading image …",
"uploadFailed": "Image upload failed",
"altLabel": "Alt text",
"widthLabel": "Image width",
"width": {
"small": "Small",
"medium": "Medium",
"full": "Full"
}
},
"history": {
"title": "Version history",
"open": "History",
"close": "Close",
"empty": "No versions yet.",
"error": "You can't view this page's history.",
"restore": "Restore this version",
"restored": "Restored",
"restoreConfirm": "Restore the page to this version? The current state is saved as a version first, so you can undo this.",
"diffTitle": "Changes from this version to now",
"viewTitle": "Preview",
"trigger": {
"auto": "Automatic snapshot",
"manual": "Manual snapshot",
"pre_restore": "Before a restore"
},
"saveVersion": "Save version",
"savePrompt": "Version name:",
"saveFailed": "The version could not be saved.",
"savedToast": "Version saved",
"savedToastNamed": "Version “{{label}}” saved",
"showAllContributors": "Show all contributors"
},
"page": {
"copyMarkdown": "Copy as Markdown",
"markdownCopied": "Copied!",
"markdownCopyFailed": "Copy failed",
"downloadMarkdown": "Download as Markdown",
"moreActions": "More actions",
"delete": "Move to trash",
"deleteConfirm": "Move this page to the trash? You can restore it from the pond's trash view.",
"moveTo": "Move to…",
"moveTitle": "Move page",
"moveRoot": "Top level",
"moveAction": "Move",
"moveCancel": "Cancel",
"deleteChildrenTitle": "Delete page with subpages",
"deleteChildrenHint_one": "“{{title}}” has one subpage — what should happen to it?",
"deleteChildrenHint_other": "“{{title}}” has {{count}} subpages — what should happen to them?",
"deletePromote": "Delete only this page — move the subpages up",
"deleteSubtree_one": "Delete the page and its subpage",
"deleteSubtree_other": "Delete the page and all {{count}} subpages",
"deleteCancel": "Cancel"
},
"trash": {
"link": "Trash",
"showLink": "Show trash",
"title": "Trash — {{pond}}",
"empty": "The trash is empty.",
"deletedAt": "Deleted {{date}}",
"restore": "Restore",
"select": "Select page “{{title}}”",
"selectAll": "Select all",
"restoreSelected_one": "Restore selection ({{count}})",
"restoreSelected_other": "Restore selection ({{count}})",
"purgeSelected_one": "Delete selection permanently ({{count}})",
"purgeSelected_other": "Delete selection permanently ({{count}})",
"purgeConfirmMany_one": "Permanently delete the selected page and its files? This cannot be undone.",
"purgeConfirmMany_other": "Permanently delete {{count}} selected pages and their files? This cannot be undone.",
"bulkFailed_one": "One page could not be processed. It stays selected — please retry.",
"bulkFailed_other": "{{count}} pages could not be processed. They stay selected — please retry.",
"purge": "Delete forever",
"purgeConfirm": "Permanently delete this page and its files? This cannot be undone.",
"pageTrashedHint": "This page has been moved to the trash.",
"restoreLink": "View in trash"
},
"favorites": {
"add": "Mark as favorite",
"remove": "Remove favorite"
},
"wikilink": {
"phantomTooltip": "This page does not exist yet",
"autocompleteLabel": "Link to a page",
"createHint": "Create page “{{title}}”"
},
"notFound": {
"hint": "You can create it right here — every wikilink pointing at this address will resolve to the new page.",
"create": "Create the page “{{slug}}”"
}
}