Files
Peter Meier 261c2fe338
All checks were successful
Deploy to Server / deploy (push) Successful in 2m28s
Add environments (spaces) support
- API client sends _environment param on all content/asset requests
- GET /api/environments endpoint to list configured environments
- EnvironmentSwitcher in Sidebar with i18n label "Space"
- clearSession() also clears environment from sessionStorage
- .env.example documents ADMIN_USERNAME/PASSWORD/SESSION_SECRET

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-15 22:46:52 +01:00

463 lines
20 KiB
JSON
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
{
"LoginPage": {
"title": "Anmelden bei RustyCMS",
"usernameLabel": "Benutzername",
"usernamePlaceholder": "Benutzername",
"passwordLabel": "Passwort",
"passwordPlaceholder": "Passwort",
"submit": "Anmelden",
"loggingIn": "Anmelden…",
"invalidCredentials": "Ungültige Zugangsdaten",
"networkError": "Netzwerkfehler, bitte erneut versuchen"
},
"EnvironmentSwitcher": {
"label": "Space"
},
"Sidebar": {
"dashboard": "Dashboard",
"types": "Typen",
"assets": "Assets",
"settings": "Einstellungen",
"login": "Anmelden",
"logout": "Abmelden",
"searchPlaceholder": "Sammlungen suchen…",
"searchAriaLabel": "Sammlungen suchen",
"closeMenu": "Menü schließen",
"loading": "Laden…",
"errorLoading": "Fehler beim Laden der Sammlungen",
"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.",
"slugPrefix": "Präfix",
"slugSuffixPlaceholder": "z. B. meine-kampagne",
"slugSuffixAriaLabel": "Slug-Suffix (Präfix ist fest)",
"slugPlaceholder": "z. B. mein-beitrag",
"slugHint": "Kleinbuchstaben (a-z), Ziffern (0-9), Bindestriche. Leerzeichen werden zu Bindestrichen.",
"savedSuccessfully": "Erfolgreich gespeichert.",
"errorSaving": "Fehler beim Speichern",
"validationErrors": "Bitte korrigieren Sie die Fehler im Formular (z.B. Pflichtfelder).",
"saving": "Speichern…",
"save": "Speichern",
"backToList": "Zurück zur Liste",
"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",
"pickFromAssets": "Aus Assets wählen",
"loadingAssets": "Assets werden geladen…",
"noAssets": "Noch keine Assets. Lade Bilder im Bereich Assets hoch.",
"status": "Status",
"statusDraft": "Entwurf",
"statusPublished": "Veröffentlicht",
"statusHint": "Entwürfe sind über die öffentliche API nicht sichtbar."
},
"SearchableSelect": {
"placeholder": "— Bitte auswählen —",
"clearLabel": "— Auswahl aufheben —",
"filterPlaceholder": "Filtern…",
"emptyLabel": "Keine Treffer"
},
"ReferenceField": {
"typeLabel": "Typ: {collection}",
"typesLabel": "Typen: {collections}",
"selectType": "— Typ wählen —",
"newEntry": "Neuer Eintrag",
"openEntry": "Eintrag öffnen",
"noCollection": "Keine Referenz-Collection im Schema. Setze {collectionCode} oder {collectionsCode} im Typ, oder starte die API und lade die Seite neu."
},
"ReferenceArrayField": {
"typeLabel": "Typ: {collection}",
"typesLabel": "Typen: {collections}",
"componentType": "Komponententyp",
"selectType": "— Typ wählen —",
"selectFromExisting": "— Aus vorhandenen wählen —",
"filterPlaceholder": "Filtern…",
"emptyLabel": "Keine Treffer",
"selectExistingAriaLabel": "Vorhandenen Eintrag zum Hinzufügen auswählen",
"moveUp": "Nach oben",
"moveDown": "Nach unten",
"remove": "Entfernen",
"newComponent": "Neue {collection}-Komponente",
"createNewComponent": "+ Neue Komponente erstellen…",
"openInNewTab": "In neuem Tab öffnen; dann Seite neu laden.",
"openEntry": "Eintrag öffnen",
"noCollection": "Keine Referenz-Collection im Schema. Setze {collectionCode} oder {collectionsCode} im Typ, oder starte die API und lade die Seite neu."
},
"MarkdownEditor": {
"bold": "Fett",
"italic": "Kursiv",
"code": "Code",
"link": "Link",
"bulletList": "Aufzählungsliste",
"bulletListButton": "• Liste",
"placeholder": "Markdown eingeben… **fett**, *kursiv*, [Link](url), - Liste",
"preview": "Vorschau",
"emptyPreview": "Leer — Vorschau erscheint beim Tippen."
},
"PaginationLinks": {
"back": "Zurück",
"next": "Weiter",
"pageInfo": "Seite {page} von {totalPages} ({total} Einträge)"
},
"DataPreviewPanel": {
"hide": "Daten-Vorschau ausblenden",
"show": "Daten-Vorschau",
"loading": "Laden…",
"errorLoading": "Fehler beim Laden"
},
"SchemaPanel": {
"hide": "Schema ausblenden",
"show": "Schema anzeigen"
},
"SchemaAndEditBar": {
"editSchema": "Schema bearbeiten"
},
"SchemaAndPreviewBar": {
"hideSchema": "Schema ausblenden",
"showSchema": "Schema anzeigen",
"editSchema": "Schema bearbeiten",
"hidePreview": "Daten-Vorschau ausblenden",
"showPreview": "Daten-Vorschau",
"sectionSchema": "Schema",
"sectionDataPreview": "Aktuelle Daten",
"copyCode": "Code kopieren",
"loading": "Laden…",
"errorLoading": "Fehler beim Laden"
},
"ReferenceOrInlineField": {
"reference": "Referenz",
"inline": "Eingebettet",
"inlineObject": "Eingebettetes Objekt (keine Referenz)",
"noInlineSchema": "Kein Inline-Schema. Seite neu laden oder API prüfen (useFields / collection)."
},
"LocaleSwitcher": {
"label": "Sprache"
},
"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ähle eine Sammlung zur Inhaltsverwaltung.",
"newContentType": "Neuer Inhaltstyp",
"searchPlaceholder": "Inhaltstypen suchen…",
"filterByTag": "Tag:",
"tagAll": "Alle",
"noResults": "Kein Inhaltstyp entspricht Suche oder Filter.",
"noCollections": "Keine Sammlungen geladen. Prüfe ob die RustyCMS-API unter {url} erreichbar ist.",
"recentSectionTitle": "Letzte 3 bearbeitete Beiträge",
"recentSectionLink": "Alle Beiträge",
"recentSectionEmpty": "Noch keine Beiträge.",
"loading": "Laden…"
},
"TypesPage": {
"title": "Typen",
"newType": "Neuer Typ",
"description": "Inhaltstypen (Sammlungen). Schema bearbeiten oder Typ löschen. Beim Löschen wird nur die Typdefinitionsdatei entfernt; vorhandene Inhaltseinträge bleiben erhalten.",
"searchPlaceholder": "Inhaltstypen suchen…",
"filterByTag": "Tag:",
"tagAll": "Alle",
"noResults": "Keine Typen entsprechen Ihrer Suche oder dem Filter.",
"loading": "Laden…",
"errorLoading": "Fehler beim Laden der Typen: {error}",
"noTypes": "Noch keine Typen vorhanden. Erstelle einen mit \"Neuer Typ\".",
"colName": "Name",
"colDescription": "Beschreibung",
"colCategory": "Kategorie",
"colActions": "Aktionen",
"confirmDelete": "\"{name}\" löschen?",
"confirmDeleteFinal": "\"{name}\" wirklich löschen? Dies kann nicht rückgängig gemacht werden.",
"delete": "Löschen",
"yesDelete": "Ja, löschen",
"deleting": "…",
"cancel": "Abbrechen",
"edit": "Bearbeiten"
},
"NewTypePage": {
"title": "Neuen Typ anlegen",
"description": "Erstellt einen neuen Inhaltstyp (Sammlung). Die Schemadatei wird auf dem Server unter {path} gespeichert und per Hot-Reload geladen.",
"nameRequired": "Name ist erforderlich.",
"nameInvalid": "Name: nur Kleinbuchstaben, Ziffern und Unterstriche.",
"fieldRequired": "Mindestens ein Feld erforderlich.",
"fieldNamesUnique": "Feldnamen müssen eindeutig sein.",
"errorCreating": "Fehler beim Erstellen des Typs.",
"nameLabel": "Name",
"namePlaceholder": "z. B. produkt, blogbeitrag",
"nameHint": "Nur Kleinbuchstaben, Ziffern und Unterstriche.",
"descriptionLabel": "Beschreibung",
"categoryLabel": "Kategorie",
"categoryPlaceholder": "z. B. inhalt",
"tagsLabel": "Tags (kommagetrennt)",
"tagsPlaceholder": "z. B. inhalt, blog",
"strictLabel": "Strikt (unbekannte Felder ablehnen)",
"fieldsLabel": "Felder",
"addField": "Feld hinzufügen",
"fieldNamePlaceholder": "Feldname",
"fieldTypeLabel": "Feldtyp",
"required": "Pflichtfeld",
"removeField": "Feld entfernen",
"collectionPlaceholder": "Sammlung (z. B. seite)",
"allowedSlugsPlaceholder": "Erlaubte Slugs (kommagetrennt, optional)",
"allowedCollectionsPlaceholder": "Erlaubte Inhaltstypen (kommagetrennt, optional)",
"arrayItemType": "Array-Elementtyp",
"itemTypePlaceholder": "z. B. string, reference",
"arrayExplain": "Dieses Feld ist in JSON eine Liste [ ]. Jeder Eintrag hat denselben Typ—wähle 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ügen",
"objectFieldNamePlaceholder": "Unterfeldname",
"arrayReferenceHelp": "Alle Slugs in der Liste müssen in dieser Sammlung existieren (oder in der Whitelist stehen).",
"multiSelectOptions": "Optionen",
"multiSelectOptionsPlaceholder": "z. B. option1, option2, option3",
"multiSelectOptionsHelp": "Komma- oder zeilengetrennte Liste erlaubter Werte. Es können mehrere ausgewählt werden.",
"stringWidgetLabel": "Eingabeart",
"stringWidgetSingleline": "Einzeilig",
"stringWidgetTextarea": "Mehrzeilig (Textbereich)",
"stringWidgetCode": "Code (Syntax-Hervorhebung)",
"stringWidgetImageUrl": "Bild- / Asset-URL (Vorschau + Picker)",
"codeLanguageLabel": "Code-Sprache",
"codeLanguageCss": "CSS",
"codeLanguageJavascript": "JavaScript",
"codeLanguageJson": "JSON",
"codeLanguageHtml": "HTML",
"defaultValueLabel": "Standardwert",
"defaultValuePlaceholder": "z. B. \"text\", 0, true, [\"a\",\"b\"]",
"defaultValueHelp": "JSON-Wert; leer lassen = keiner. Wird bei neuen Einträgen verwendet.",
"defaultValueInvalid": "Ungültiges JSON für Standardwert im Feld \"{field}\"",
"defaultValueBoolean": "Standard: angehakt",
"defaultValueEmpty": "Leer lassen = keiner",
"defaultValueMultiSelectSetOptions": "Zuerst Optionen oben eintragen, dann Standard auswählen.",
"defaultValueArrayPlaceholder": "Kommagetrennte Werte",
"fieldDescriptionPlaceholder": "Feldbeschreibung (optional)",
"creating": "Erstellen…",
"createType": "Typ erstellen",
"cancel": "Abbrechen"
},
"EditTypePage": {
"fieldRequired": "Mindestens ein Feld erforderlich.",
"fieldNamesUnique": "Feldnamen müssen eindeutig sein.",
"errorSaving": "Fehler beim Speichern des Typs.",
"missingName": "Typname fehlt.",
"backToTypes": "Zurück zu Typen",
"loading": "Laden…",
"errorLoading": "Fehler beim Laden des Typs: {error}",
"title": "Typ bearbeiten: {name}",
"description": "Beschreibung, Kategorie, Tags und Felder ändern. Die Schemadatei wird auf dem Server aktualisiert.",
"nameLabel": "Name",
"descriptionLabel": "Beschreibung",
"categoryLabel": "Kategorie",
"categoryPlaceholder": "z. B. inhalt",
"tagsLabel": "Tags (kommagetrennt)",
"tagsPlaceholder": "z. B. inhalt, blog",
"strictLabel": "Strikt (unbekannte Felder ablehnen)",
"extendsLabel": "Erweitert",
"extendsDescription": "Dieser Typ erbt Felder von diesen Typen. Gehe zum jeweiligen Typ, um geerbte Felder zu bearbeiten.",
"extendsPlaceholder": "Typ zum Erweitern wählen",
"extendsNoneAvailable": "Keine weiteren Typen zum Hinzufügen",
"addExtend": "Hinzufügen",
"removeExtend": "Aus Erweiterungen entfernen",
"fieldsLabel": "Felder",
"addField": "Feld hinzufügen",
"moveFieldUp": "Feld nach oben",
"moveFieldDown": "Feld nach unten",
"moveFieldToTop": "Ganz nach oben",
"moveFieldToBottom": "Ganz nach unten",
"fieldNamePlaceholder": "Feldname",
"fieldTypeLabel": "Feldtyp",
"required": "Pflichtfeld",
"removeField": "Feld entfernen",
"collectionPlaceholder": "Sammlung (z. B. seite)",
"allowedSlugsPlaceholder": "Erlaubte Slugs (kommagetrennt, optional)",
"allowedCollectionsPlaceholder": "Erlaubte Inhaltstypen (kommagetrennt, optional)",
"patternLabel": "Pattern (Regex)",
"patternPlaceholder": "z. B. ^[A-Z]{2,4}-\\d{3,6}$",
"minLengthLabel": "Min. Länge",
"maxLengthLabel": "Max. Länge",
"arrayItemType": "Array-Elementtyp",
"itemTypePlaceholder": "z. B. string, reference",
"arrayExplain": "Dieses Feld ist in JSON eine Liste [ ]. Jeder Eintrag hat denselben Typ—wähle 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ügen",
"objectFieldNamePlaceholder": "Unterfeldname",
"arrayReferenceHelp": "Alle Slugs in der Liste müssen in dieser Sammlung existieren (oder in der Whitelist stehen).",
"multiSelectOptions": "Optionen",
"multiSelectOptionsPlaceholder": "z. B. option1, option2, option3",
"multiSelectOptionsHelp": "Komma- oder zeilengetrennte Liste erlaubter Werte. Es können mehrere ausgewählt werden.",
"stringWidgetLabel": "Eingabeart",
"stringWidgetSingleline": "Einzeilig",
"stringWidgetTextarea": "Mehrzeilig (Textbereich)",
"stringWidgetCode": "Code (Syntax-Hervorhebung)",
"stringWidgetImageUrl": "Bild- / Asset-URL (Vorschau + Picker)",
"codeLanguageLabel": "Code-Sprache",
"codeLanguageCss": "CSS",
"codeLanguageJavascript": "JavaScript",
"codeLanguageJson": "JSON",
"codeLanguageHtml": "HTML",
"defaultValueLabel": "Standardwert",
"defaultValuePlaceholder": "z. B. \"text\", 0, true, [\"a\",\"b\"]",
"defaultValueHelp": "JSON-Wert; leer lassen = keiner. Wird bei neuen Einträgen verwendet.",
"defaultValueInvalid": "Ungültiges JSON für Standardwert im Feld \"{field}\"",
"defaultValueBoolean": "Standard: angehakt",
"defaultValueEmpty": "Leer lassen = keiner",
"defaultValueMultiSelectSetOptions": "Zuerst Optionen oben eintragen, dann Standard auswählen.",
"defaultValueArrayPlaceholder": "Kommagetrennte Werte",
"fieldDescriptionPlaceholder": "Feldbeschreibung (optional)",
"saving": "Speichern…",
"save": "Speichern",
"cancel": "Abbrechen"
},
"ErrorBoundary": {
"title": "Etwas ist schiefgelaufen",
"reload": "Seite neu laden"
},
"Breadcrumbs": {
"ariaLabel": "Breadcrumb",
"content": "Inhalte"
},
"ContentListPage": {
"title": "Einträge",
"newEntry": "Neuer Eintrag",
"colActions": "Aktionen",
"colStatus": "Status",
"colCreated": "Erstellt",
"colLastEdited": "Zuletzt geändert",
"published": "Veröffentlicht",
"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",
"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",
"sectionSchema": "Schema"
},
"ContentEditPage": {
"title": "Eintrag bearbeiten",
"created": "Erstellt",
"lastEdited": "Zuletzt geändert",
"apiLink": "API-Link (Daten-Vorschau):",
"referrersSection": "Referenziert von",
"noReferrers": "Kein anderer Eintrag verweist auf diesen.",
"openReferrer": "Eintrag öffnen"
},
"AssetsPage": {
"titleAll": "Alle Assets",
"titleRoot": "Root",
"assetCount": "{count} Bild(er)",
"assetCountFiltered": "{count} von {total} Bild(ern)",
"searchPlaceholder": "Nach Dateiname suchen…",
"dateFrom": "Von Datum",
"dateTo": "Bis Datum",
"mimeFilter": "Typ",
"mimeFilterAll": "Alle Typen",
"upload": "Hochladen",
"uploading": "Wird hochgeladen…",
"uploadedCount": "{count} Datei(en) hochgeladen.",
"dropZoneHintRoot": "Klicken oder hierher ziehen (Root)",
"dropZoneHintFolder": "Klicken oder hierher ziehen → \"{folder}\"",
"loading": "Laden…",
"errorLoading": "Fehler beim Laden der Assets",
"noAssets": "Noch keine Assets hier.",
"urlCopied": "URL kopiert.",
"copyUrl": "URL kopieren",
"confirmDelete": "\"{filename}\" löschen?",
"confirmDeleteDesc": "Dies kann nicht rückgängig gemacht werden.",
"yesDelete": "Ja, löschen",
"deleting": "…",
"cancel": "Abbrechen",
"deleted": "\"{filename}\" gelöscht.",
"folders": "Ordner",
"all": "Alle",
"root": "Root",
"newFolder": "Neuer Ordner",
"folderNamePlaceholder": "z. B. blog",
"folderCreated": "Ordner \"{name}\" erstellt.",
"folderDeleted": "Ordner \"{name}\" gelöscht.",
"confirmDeleteFolder": "Ordner \"{name}\" löschen?",
"confirmDeleteFolderDesc": "Nur leere Ordner können gelöscht werden.",
"renameTitle": "Bild umbenennen",
"renameFilenameLabel": "Dateiname",
"rename": "Umbenennen",
"renaming": "Wird umbenannt…",
"renamed": "\"{filename}\" umbenannt.",
"copyWithTransformTitle": "Kopie mit Transformation",
"copyWithTransformDesc": "Neues Asset aus diesem Bild mit Größe/Beschnitt/Format. Gleicher Ordner.",
"copyWithTransformNewName": "Neuer Dateiname",
"copyWithTransformCreate": "Kopie erstellen",
"copyWithTransformDone": "Transformierte Kopie erstellt.",
"transformPresetThumb": "Thumb 300px",
"transformPresetSquare": "Quadrat 1:1",
"transformPresetMedium": "Mittel 800px",
"transformPresetJpeg": "JPEG 1200px",
"transformWidth": "Breite",
"transformHeight": "Höhe",
"transformAspect": "Seitenverhältnis",
"transformFit": "Fit",
"transformFormat": "Format",
"transformQuality": "Qualität (1100)",
"creating": "Wird erstellt…"
}
}