Enhance documentation and admin UI: Add detailed implementation guidelines in CLAUDE.md, introduce a referrer index in README.md, and update admin UI translations for improved user experience. Update package dependencies for better functionality and performance.

This commit is contained in:
Peter Meier
2026-03-13 10:55:33 +01:00
parent 7754d800f5
commit 606455c59b
42 changed files with 3814 additions and 421 deletions

View File

@@ -10,6 +10,7 @@
"dashboard": "Dashboard",
"types": "Typen",
"assets": "Assets",
"settings": "Einstellungen",
"login": "Anmelden",
"logout": "Abmelden",
"searchPlaceholder": "Sammlungen suchen…",
@@ -20,6 +21,7 @@
"noResults": "Keine Ergebnisse für \"{query}\""
},
"ContentForm": {
"copyCode": "Code kopieren",
"slugRequired": "Slug ist erforderlich.",
"slugInUse": "Slug bereits vergeben.",
"slugMustStartWith": "Der Slug muss mit \"{prefix}\" beginnen.",
@@ -36,6 +38,11 @@
"pleaseSelect": "— Bitte auswählen —",
"removeEntry": "Entfernen",
"addEntry": "+ Eintrag hinzufügen",
"arrayAddItem": "Eintrag hinzufügen",
"arrayRemoveItem": "Eintrag entfernen",
"arrayItemPlaceholder": "Wert",
"arrayItemPlaceholderNumber": "Zahl",
"arrayHint": "Liste von Werten. Einträge unten hinzufügen oder entfernen.",
"keyPlaceholder": "Schlüssel",
"valuePlaceholder": "Wert",
"pickAsset": "Bild wählen",
@@ -58,6 +65,7 @@
"typesLabel": "Typen: {collections}",
"selectType": "\u2014 Typ w\u00e4hlen \u2014",
"newEntry": "Neuer Eintrag",
"openEntry": "Eintrag \u00f6ffnen",
"noCollection": "Keine Referenz-Collection im Schema. Setze {collectionCode} oder {collectionsCode} im Typ, oder starte die API und lade die Seite neu."
},
"ReferenceArrayField": {
@@ -72,9 +80,10 @@
"moveUp": "Nach oben",
"moveDown": "Nach unten",
"remove": "Entfernen",
"newComponent": "+ Neue {collection}-Komponente",
"newComponent": "Neue {collection}-Komponente",
"createNewComponent": "+ Neue Komponente erstellen\u2026",
"openInNewTab": "In neuem Tab \u00f6ffnen; dann Seite neu laden.",
"openEntry": "Eintrag \u00f6ffnen",
"noCollection": "Keine Referenz-Collection im Schema. Setze {collectionCode} oder {collectionsCode} im Typ, oder starte die API und lade die Seite neu."
},
"MarkdownEditor": {
@@ -112,6 +121,9 @@
"editSchema": "Schema bearbeiten",
"hidePreview": "Daten-Vorschau ausblenden",
"showPreview": "Daten-Vorschau",
"sectionSchema": "Schema",
"sectionDataPreview": "Aktuelle Daten",
"copyCode": "Code kopieren",
"loading": "Laden\u2026",
"errorLoading": "Fehler beim Laden"
},
@@ -127,6 +139,34 @@
"ContentLocaleSwitcher": {
"label": "Inhaltssprache"
},
"Settings": {
"title": "Einstellungen",
"connection": "Verbindung",
"apiUrl": "API-URL",
"backendStatus": "Backend-Status",
"checking": "Prüfe…",
"apiReachable": "API erreichbar",
"apiUnreachable": "API nicht erreichbar",
"contentLocales": "Inhalts-Sprachen",
"default": "Standard",
"thisDevice": "Dieses Gerät",
"uiLanguage": "Oberflächen-Sprache",
"itemsPerPage": "Einträge pro Seite",
"itemsPerPageHint": "Gilt für Inhaltslisten.",
"refreshData": "Daten aktualisieren",
"refreshDataSuccess": "Daten aktualisiert.",
"clearSession": "Session bereinigen",
"clearSessionHint": "Entfernt API-Schlüssel und alle Admin-Voreinstellungen (z. B. auf geteilten Rechnern).",
"clearSessionConfirmTitle": "Session bereinigen?",
"clearSessionConfirmDescription": "Du wirst abgemeldet und alle gespeicherten Einstellungen (z. B. Einträge pro Seite) werden gelöscht. Anschließend kannst du dich wieder anmelden.",
"clearSessionConfirmAction": "Bereinigen",
"cancel": "Abbrechen",
"apiKeyStatus": "API-Schlüssel",
"apiKeyFromEnv": "Aus Umgebung (nur Lesen).",
"apiKeyManual": "Manuell gesetzt (diese Sitzung).",
"logout": "Abmelden",
"login": "Anmelden"
},
"Dashboard": {
"title": "Dashboard",
"subtitle": "W\u00e4hle eine Sammlung zur Inhaltsverwaltung.",
@@ -141,6 +181,10 @@
"title": "Typen",
"newType": "Neuer Typ",
"description": "Inhaltstypen (Sammlungen). Schema bearbeiten oder Typ l\u00f6schen. Beim L\u00f6schen wird nur die Typdefinitionsdatei entfernt; vorhandene Inhaltseintr\u00e4ge bleiben erhalten.",
"searchPlaceholder": "Inhaltstypen suchen…",
"filterByTag": "Tag:",
"tagAll": "Alle",
"noResults": "Keine Typen entsprechen Ihrer Suche oder dem Filter.",
"loading": "Laden\u2026",
"errorLoading": "Fehler beim Laden der Typen: {error}",
"noTypes": "Noch keine Typen vorhanden. Erstelle einen mit \"Neuer Typ\".",
@@ -176,9 +220,44 @@
"fieldsLabel": "Felder",
"addField": "Feld hinzuf\u00fcgen",
"fieldNamePlaceholder": "Feldname",
"fieldTypeLabel": "Feldtyp",
"required": "Pflichtfeld",
"removeField": "Feld entfernen",
"collectionPlaceholder": "Sammlung (z.\u00a0B. seite)",
"allowedSlugsPlaceholder": "Erlaubte Slugs (kommagetrennt, optional)",
"allowedCollectionsPlaceholder": "Erlaubte Inhaltstypen (kommagetrennt, optional)",
"arrayItemType": "Array-Elementtyp",
"itemTypePlaceholder": "z.\u00a0B. string, reference",
"arrayExplain": "Dieses Feld ist in JSON eine Liste [ ]. Jeder Eintrag hat denselben Typ—w\u00e4hle unten, was ein Element ist.",
"arrayEachEntry": "Ein Listeneintrag ist",
"itemKindString": "Einfacher Text (string)",
"itemKindNumber": "Zahl (number)",
"itemKindObject": "Objekt (feste Unterfelder pro Eintrag)",
"itemKindReference": "Referenz (Slug auf einen Eintrag einer Sammlung)",
"objectItemFieldsLabel": "Felder pro Listeneintrag",
"addObjectField": "Unterfeld hinzuf\u00fcgen",
"objectFieldNamePlaceholder": "Unterfeldname",
"arrayReferenceHelp": "Alle Slugs in der Liste m\u00fcssen in dieser Sammlung existieren (oder in der Whitelist stehen).",
"multiSelectOptions": "Optionen",
"multiSelectOptionsPlaceholder": "z.\u00a0B. option1, option2, option3",
"multiSelectOptionsHelp": "Komma- oder zeilengetrennte Liste erlaubter Werte. Es k\u00f6nnen mehrere ausgew\u00e4hlt werden.",
"stringWidgetLabel": "Eingabeart",
"stringWidgetSingleline": "Einzeilig",
"stringWidgetTextarea": "Mehrzeilig (Textbereich)",
"stringWidgetCode": "Code (Syntax-Hervorhebung)",
"codeLanguageLabel": "Code-Sprache",
"codeLanguageCss": "CSS",
"codeLanguageJavascript": "JavaScript",
"codeLanguageJson": "JSON",
"codeLanguageHtml": "HTML",
"defaultValueLabel": "Standardwert",
"defaultValuePlaceholder": "z.\u00a0B. \"text\", 0, true, [\"a\",\"b\"]",
"defaultValueHelp": "JSON-Wert; leer lassen = keiner. Wird bei neuen Eintr\u00e4gen verwendet.",
"defaultValueInvalid": "Ung\u00fcltiges JSON f\u00fcr Standardwert im Feld \"{field}\"",
"defaultValueBoolean": "Standard: angehakt",
"defaultValueEmpty": "Leer lassen = keiner",
"defaultValueMultiSelectSetOptions": "Zuerst Optionen oben eintragen, dann Standard ausw\u00e4hlen.",
"defaultValueArrayPlaceholder": "Kommagetrennte Werte",
"fieldDescriptionPlaceholder": "Feldbeschreibung (optional)",
"creating": "Erstellen\u2026",
"createType": "Typ erstellen",
@@ -204,9 +283,44 @@
"fieldsLabel": "Felder",
"addField": "Feld hinzuf\u00fcgen",
"fieldNamePlaceholder": "Feldname",
"fieldTypeLabel": "Feldtyp",
"required": "Pflichtfeld",
"removeField": "Feld entfernen",
"collectionPlaceholder": "Sammlung (z.\u00a0B. seite)",
"allowedSlugsPlaceholder": "Erlaubte Slugs (kommagetrennt, optional)",
"allowedCollectionsPlaceholder": "Erlaubte Inhaltstypen (kommagetrennt, optional)",
"arrayItemType": "Array-Elementtyp",
"itemTypePlaceholder": "z.\u00a0B. string, reference",
"arrayExplain": "Dieses Feld ist in JSON eine Liste [ ]. Jeder Eintrag hat denselben Typ—w\u00e4hle unten, was ein Element ist.",
"arrayEachEntry": "Ein Listeneintrag ist",
"itemKindString": "Einfacher Text (string)",
"itemKindNumber": "Zahl (number)",
"itemKindObject": "Objekt (feste Unterfelder pro Eintrag)",
"itemKindReference": "Referenz (Slug auf einen Eintrag einer Sammlung)",
"objectItemFieldsLabel": "Felder pro Listeneintrag",
"addObjectField": "Unterfeld hinzuf\u00fcgen",
"objectFieldNamePlaceholder": "Unterfeldname",
"arrayReferenceHelp": "Alle Slugs in der Liste m\u00fcssen in dieser Sammlung existieren (oder in der Whitelist stehen).",
"multiSelectOptions": "Optionen",
"multiSelectOptionsPlaceholder": "z.\u00a0B. option1, option2, option3",
"multiSelectOptionsHelp": "Komma- oder zeilengetrennte Liste erlaubter Werte. Es k\u00f6nnen mehrere ausgew\u00e4hlt werden.",
"stringWidgetLabel": "Eingabeart",
"stringWidgetSingleline": "Einzeilig",
"stringWidgetTextarea": "Mehrzeilig (Textbereich)",
"stringWidgetCode": "Code (Syntax-Hervorhebung)",
"codeLanguageLabel": "Code-Sprache",
"codeLanguageCss": "CSS",
"codeLanguageJavascript": "JavaScript",
"codeLanguageJson": "JSON",
"codeLanguageHtml": "HTML",
"defaultValueLabel": "Standardwert",
"defaultValuePlaceholder": "z.\u00a0B. \"text\", 0, true, [\"a\",\"b\"]",
"defaultValueHelp": "JSON-Wert; leer lassen = keiner. Wird bei neuen Eintr\u00e4gen verwendet.",
"defaultValueInvalid": "Ung\u00fcltiges JSON f\u00fcr Standardwert im Feld \"{field}\"",
"defaultValueBoolean": "Standard: angehakt",
"defaultValueEmpty": "Leer lassen = keiner",
"defaultValueMultiSelectSetOptions": "Zuerst Optionen oben eintragen, dann Standard ausw\u00e4hlen.",
"defaultValueArrayPlaceholder": "Kommagetrennte Werte",
"fieldDescriptionPlaceholder": "Feldbeschreibung (optional)",
"saving": "Speichern\u2026",
"save": "Speichern",
@@ -227,20 +341,33 @@
"noEntries": "Keine Einträge.",
"noEntriesCreate": "Noch keine Einträge. Erstellen Sie den ersten.",
"edit": "Bearbeiten",
"delete": "Löschen",
"draft": "Entwurf",
"searchPlaceholder": "Suchen…",
"loading": "Laden…",
"sortBy": "Sortieren nach {field}",
"sortAsc": "Aufsteigend",
"sortDesc": "Absteigend"
"sortDesc": "Absteigend",
"typeDependencies": "Typ-Abhängigkeiten",
"confirmDelete": "\"{slug}\" löschen?",
"confirmDeleteDescription": "Dies kann nicht rückgängig gemacht werden.",
"cancel": "Abbrechen",
"deleting": "Löschen…",
"yesDelete": "Ja, löschen",
"deleted": "Eintrag gelöscht.",
"errorDeleting": "Fehler beim Löschen."
},
"ContentNewPage": {
"breadcrumbNew": "Neu",
"title": "Neuen Eintrag anlegen"
"title": "Neuen Eintrag anlegen",
"sectionSchema": "Schema"
},
"ContentEditPage": {
"title": "Eintrag bearbeiten",
"apiLink": "API-Link (Daten-Vorschau):"
"apiLink": "API-Link (Daten-Vorschau):",
"referrersSection": "Referenziert von",
"noReferrers": "Kein anderer Eintrag verweist auf diesen.",
"openReferrer": "Eintrag öffnen"
},
"AssetsPage": {
"titleAll": "Alle Assets",

View File

@@ -10,6 +10,7 @@
"dashboard": "Dashboard",
"types": "Types",
"assets": "Assets",
"settings": "Settings",
"login": "Login",
"logout": "Logout",
"searchPlaceholder": "Search collections…",
@@ -20,6 +21,7 @@
"noResults": "No results for \"{query}\""
},
"ContentForm": {
"copyCode": "Copy code",
"slugRequired": "Slug is required.",
"slugInUse": "Slug already in use.",
"slugMustStartWith": "Slug must start with \"{prefix}\".",
@@ -36,6 +38,11 @@
"pleaseSelect": "— Please select —",
"removeEntry": "Remove",
"addEntry": "+ Add entry",
"arrayAddItem": "Add item",
"arrayRemoveItem": "Remove item",
"arrayItemPlaceholder": "Value",
"arrayItemPlaceholderNumber": "Number",
"arrayHint": "List of values. Add or remove items below.",
"keyPlaceholder": "Key",
"valuePlaceholder": "Value",
"pickAsset": "Pick image",
@@ -58,6 +65,7 @@
"typesLabel": "Types: {collections}",
"selectType": "— Select type —",
"newEntry": "New entry",
"openEntry": "Open entry",
"noCollection": "No reference collection in schema. Set {collectionCode} or {collectionsCode} in the type, or start the API and reload the page."
},
"ReferenceArrayField": {
@@ -72,9 +80,10 @@
"moveUp": "Move up",
"moveDown": "Move down",
"remove": "Remove",
"newComponent": "+ New {collection} component",
"newComponent": "New {collection} component",
"createNewComponent": "+ Create new component…",
"openInNewTab": "Open in new tab; then reload this page.",
"openEntry": "Open entry",
"noCollection": "No reference collection in schema. Set {collectionCode} or {collectionsCode} in the type, or start the API and reload the page."
},
"MarkdownEditor": {
@@ -112,6 +121,9 @@
"editSchema": "Edit schema",
"hidePreview": "Hide data preview",
"showPreview": "Data preview",
"sectionSchema": "Schema",
"sectionDataPreview": "Current data",
"copyCode": "Copy code",
"loading": "Loading…",
"errorLoading": "Error loading"
},
@@ -127,6 +139,34 @@
"ContentLocaleSwitcher": {
"label": "Content language"
},
"Settings": {
"title": "Settings",
"connection": "Connection",
"apiUrl": "API URL",
"backendStatus": "Backend status",
"checking": "Checking…",
"apiReachable": "API reachable",
"apiUnreachable": "API unreachable",
"contentLocales": "Content locales",
"default": "default",
"thisDevice": "This device",
"uiLanguage": "UI language",
"itemsPerPage": "Items per page",
"itemsPerPageHint": "Applies to content list pages.",
"refreshData": "Refresh data",
"refreshDataSuccess": "Data refreshed.",
"clearSession": "Clear session",
"clearSessionHint": "Removes API key and all admin preferences (e.g. on shared devices).",
"clearSessionConfirmTitle": "Clear session?",
"clearSessionConfirmDescription": "This will log you out and remove all stored preferences (e.g. items per page). You can log in again afterwards.",
"clearSessionConfirmAction": "Clear",
"cancel": "Cancel",
"apiKeyStatus": "API key",
"apiKeyFromEnv": "Set from environment (read-only).",
"apiKeyManual": "Set manually (this session).",
"logout": "Log out",
"login": "Log in"
},
"Dashboard": {
"title": "Dashboard",
"subtitle": "Choose a collection to manage content.",
@@ -141,6 +181,10 @@
"title": "Types",
"newType": "New type",
"description": "Content types (collections). Edit the schema or delete a type. Deleting removes the type definition file; existing content entries are not removed.",
"searchPlaceholder": "Search content types…",
"filterByTag": "Tag:",
"tagAll": "All",
"noResults": "No content types match your search or filter.",
"loading": "Loading…",
"errorLoading": "Error loading types: {error}",
"noTypes": "No types yet. Create one with \"New type\".",
@@ -176,9 +220,44 @@
"fieldsLabel": "Fields",
"addField": "Add field",
"fieldNamePlaceholder": "Field name",
"fieldTypeLabel": "Field type",
"required": "Required",
"removeField": "Remove field",
"collectionPlaceholder": "Collection (e.g. page)",
"allowedSlugsPlaceholder": "Allowed slugs (comma-separated, optional)",
"allowedCollectionsPlaceholder": "Allowed content types (comma-separated, optional)",
"arrayItemType": "Array item type",
"itemTypePlaceholder": "e.g. string, reference",
"arrayExplain": "This field is a list [ ] in JSON. Every position in the list has the same type—pick what one entry is below.",
"arrayEachEntry": "One list entry is",
"itemKindString": "Plain text (string)",
"itemKindNumber": "Number",
"itemKindObject": "Object (fixed sub-fields per entry)",
"itemKindReference": "Reference (slug to an entry in a collection)",
"objectItemFieldsLabel": "Fields on each list object",
"addObjectField": "Add sub-field",
"objectFieldNamePlaceholder": "Sub-field name",
"arrayReferenceHelp": "All slugs in the list must exist in this collection (unless you use allowed slugs).",
"multiSelectOptions": "Options",
"multiSelectOptionsPlaceholder": "e.g. option1, option2, option3",
"multiSelectOptionsHelp": "Comma- or newline-separated list of allowed values. User can select multiple.",
"stringWidgetLabel": "Input style",
"stringWidgetSingleline": "Single line",
"stringWidgetTextarea": "Multi-line (textarea)",
"stringWidgetCode": "Code (syntax highlighting)",
"codeLanguageLabel": "Code language",
"codeLanguageCss": "CSS",
"codeLanguageJavascript": "JavaScript",
"codeLanguageJson": "JSON",
"codeLanguageHtml": "HTML",
"defaultValueLabel": "Default value",
"defaultValuePlaceholder": "e.g. \"text\", 0, true, [\"a\",\"b\"]",
"defaultValueHelp": "JSON value; leave empty for none. Used when creating new entries.",
"defaultValueInvalid": "Invalid JSON for default value in field \"{field}\"",
"defaultValueBoolean": "Default: checked",
"defaultValueEmpty": "Leave empty for none",
"defaultValueMultiSelectSetOptions": "Set options above first, then choose defaults.",
"defaultValueArrayPlaceholder": "Comma-separated values",
"fieldDescriptionPlaceholder": "Field description (optional)",
"creating": "Creating…",
"createType": "Create type",
@@ -204,9 +283,44 @@
"fieldsLabel": "Fields",
"addField": "Add field",
"fieldNamePlaceholder": "Field name",
"fieldTypeLabel": "Field type",
"required": "Required",
"removeField": "Remove field",
"collectionPlaceholder": "Collection (e.g. page)",
"allowedSlugsPlaceholder": "Allowed slugs (comma-separated, optional)",
"allowedCollectionsPlaceholder": "Allowed content types (comma-separated, optional)",
"arrayItemType": "Array item type",
"itemTypePlaceholder": "e.g. string, reference",
"arrayExplain": "This field is a list [ ] in JSON. Every position in the list has the same type—pick what one entry is below.",
"arrayEachEntry": "One list entry is",
"itemKindString": "Plain text (string)",
"itemKindNumber": "Number",
"itemKindObject": "Object (fixed sub-fields per entry)",
"itemKindReference": "Reference (slug to an entry in a collection)",
"objectItemFieldsLabel": "Fields on each list object",
"addObjectField": "Add sub-field",
"objectFieldNamePlaceholder": "Sub-field name",
"arrayReferenceHelp": "All slugs in the list must exist in this collection (unless you use allowed slugs).",
"multiSelectOptions": "Options",
"multiSelectOptionsPlaceholder": "e.g. option1, option2, option3",
"multiSelectOptionsHelp": "Comma- or newline-separated list of allowed values. User can select multiple.",
"stringWidgetLabel": "Input style",
"stringWidgetSingleline": "Single line",
"stringWidgetTextarea": "Multi-line (textarea)",
"stringWidgetCode": "Code (syntax highlighting)",
"codeLanguageLabel": "Code language",
"codeLanguageCss": "CSS",
"codeLanguageJavascript": "JavaScript",
"codeLanguageJson": "JSON",
"codeLanguageHtml": "HTML",
"defaultValueLabel": "Default value",
"defaultValuePlaceholder": "e.g. \"text\", 0, true, [\"a\",\"b\"]",
"defaultValueHelp": "JSON value; leave empty for none. Used when creating new entries.",
"defaultValueInvalid": "Invalid JSON for default value in field \"{field}\"",
"defaultValueBoolean": "Default: checked",
"defaultValueEmpty": "Leave empty for none",
"defaultValueMultiSelectSetOptions": "Set options above first, then choose defaults.",
"defaultValueArrayPlaceholder": "Comma-separated values",
"fieldDescriptionPlaceholder": "Field description (optional)",
"saving": "Saving…",
"save": "Save",
@@ -227,20 +341,33 @@
"noEntries": "No entries.",
"noEntriesCreate": "No entries yet. Create the first one.",
"edit": "Edit",
"delete": "Delete",
"draft": "Draft",
"searchPlaceholder": "Search…",
"loading": "Loading…",
"sortBy": "Sort by {field}",
"sortAsc": "Ascending",
"sortDesc": "Descending"
"sortDesc": "Descending",
"typeDependencies": "Type dependencies",
"confirmDelete": "Delete \"{slug}\"?",
"confirmDeleteDescription": "This cannot be undone.",
"cancel": "Cancel",
"deleting": "Deleting…",
"yesDelete": "Yes, delete",
"deleted": "Entry deleted.",
"errorDeleting": "Error deleting entry."
},
"ContentNewPage": {
"breadcrumbNew": "New",
"title": "Create new entry"
"title": "Create new entry",
"sectionSchema": "Schema"
},
"ContentEditPage": {
"title": "Edit entry",
"apiLink": "API link (data preview):"
"apiLink": "API link (data preview):",
"referrersSection": "Referenced by",
"noReferrers": "No other entries reference this one.",
"openReferrer": "Open entry"
},
"AssetsPage": {
"titleAll": "All assets",