@rigel-cms/rigel 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/README.md +8 -0
  2. package/docs/content-locales.md +53 -0
  3. package/docs/extensions.md +194 -0
  4. package/package.json +16 -3
  5. package/src/article-body.ts +49 -37
  6. package/src/article-render.ts +25 -2
  7. package/src/article.ts +44 -0
  8. package/src/config.ts +26 -2
  9. package/src/editor/App.svelte +149 -107
  10. package/src/editor/blocks/extension.ts +29 -0
  11. package/src/editor/blocks/index.ts +17 -15
  12. package/src/editor/blocks/video.ts +2 -1
  13. package/src/editor/i18n/README.md +23 -0
  14. package/src/editor/i18n/de/connection.json +136 -0
  15. package/src/editor/i18n/de/defaults.json +6 -0
  16. package/src/editor/i18n/de/fields.json +130 -0
  17. package/src/editor/i18n/de/local.json +49 -0
  18. package/src/editor/i18n/de/media.json +166 -0
  19. package/src/editor/i18n/de/richtext.json +116 -0
  20. package/src/editor/i18n/de/shell.json +182 -0
  21. package/src/editor/i18n/de/system.json +14 -0
  22. package/src/editor/i18n/de/validation.json +82 -0
  23. package/src/editor/i18n/en/connection.json +136 -0
  24. package/src/editor/i18n/en/defaults.json +6 -0
  25. package/src/editor/i18n/en/fields.json +130 -0
  26. package/src/editor/i18n/en/local.json +49 -0
  27. package/src/editor/i18n/en/media.json +166 -0
  28. package/src/editor/i18n/en/richtext.json +116 -0
  29. package/src/editor/i18n/en/shell.json +182 -0
  30. package/src/editor/i18n/en/system.json +14 -0
  31. package/src/editor/i18n/en/validation.json +82 -0
  32. package/src/editor/i18n/es/connection.json +136 -0
  33. package/src/editor/i18n/es/defaults.json +6 -0
  34. package/src/editor/i18n/es/fields.json +130 -0
  35. package/src/editor/i18n/es/local.json +49 -0
  36. package/src/editor/i18n/es/media.json +166 -0
  37. package/src/editor/i18n/es/richtext.json +116 -0
  38. package/src/editor/i18n/es/shell.json +182 -0
  39. package/src/editor/i18n/es/system.json +14 -0
  40. package/src/editor/i18n/es/validation.json +82 -0
  41. package/src/editor/i18n/format.ts +26 -0
  42. package/src/editor/i18n/fr/connection.json +136 -0
  43. package/src/editor/i18n/fr/defaults.json +6 -0
  44. package/src/editor/i18n/fr/fields.json +130 -0
  45. package/src/editor/i18n/fr/local.json +49 -0
  46. package/src/editor/i18n/fr/media.json +166 -0
  47. package/src/editor/i18n/fr/richtext.json +116 -0
  48. package/src/editor/i18n/fr/shell.json +182 -0
  49. package/src/editor/i18n/fr/system.json +14 -0
  50. package/src/editor/i18n/fr/validation.json +82 -0
  51. package/src/editor/i18n/index.ts +18 -0
  52. package/src/editor/i18n/it/connection.json +136 -0
  53. package/src/editor/i18n/it/defaults.json +6 -0
  54. package/src/editor/i18n/it/fields.json +130 -0
  55. package/src/editor/i18n/it/local.json +49 -0
  56. package/src/editor/i18n/it/media.json +166 -0
  57. package/src/editor/i18n/it/richtext.json +116 -0
  58. package/src/editor/i18n/it/shell.json +182 -0
  59. package/src/editor/i18n/it/system.json +14 -0
  60. package/src/editor/i18n/it/validation.json +82 -0
  61. package/src/editor/i18n/ja/connection.json +136 -0
  62. package/src/editor/i18n/ja/defaults.json +6 -0
  63. package/src/editor/i18n/ja/fields.json +130 -0
  64. package/src/editor/i18n/ja/local.json +49 -0
  65. package/src/editor/i18n/ja/media.json +166 -0
  66. package/src/editor/i18n/ja/richtext.json +116 -0
  67. package/src/editor/i18n/ja/shell.json +182 -0
  68. package/src/editor/i18n/ja/system.json +14 -0
  69. package/src/editor/i18n/ja/validation.json +82 -0
  70. package/src/editor/i18n/locales.ts +13 -0
  71. package/src/editor/i18n/nl/connection.json +136 -0
  72. package/src/editor/i18n/nl/defaults.json +6 -0
  73. package/src/editor/i18n/nl/fields.json +130 -0
  74. package/src/editor/i18n/nl/local.json +49 -0
  75. package/src/editor/i18n/nl/media.json +166 -0
  76. package/src/editor/i18n/nl/richtext.json +116 -0
  77. package/src/editor/i18n/nl/shell.json +182 -0
  78. package/src/editor/i18n/nl/system.json +14 -0
  79. package/src/editor/i18n/nl/validation.json +82 -0
  80. package/src/editor/i18n/ru/connection.json +138 -0
  81. package/src/editor/i18n/ru/defaults.json +6 -0
  82. package/src/editor/i18n/ru/fields.json +132 -0
  83. package/src/editor/i18n/ru/local.json +49 -0
  84. package/src/editor/i18n/ru/media.json +166 -0
  85. package/src/editor/i18n/ru/richtext.json +116 -0
  86. package/src/editor/i18n/ru/shell.json +182 -0
  87. package/src/editor/i18n/ru/system.json +14 -0
  88. package/src/editor/i18n/ru/validation.json +82 -0
  89. package/src/editor/i18n/server.ts +13 -0
  90. package/src/editor/i18n/zh/connection.json +136 -0
  91. package/src/editor/i18n/zh/defaults.json +6 -0
  92. package/src/editor/i18n/zh/fields.json +130 -0
  93. package/src/editor/i18n/zh/local.json +49 -0
  94. package/src/editor/i18n/zh/media.json +166 -0
  95. package/src/editor/i18n/zh/richtext.json +116 -0
  96. package/src/editor/i18n/zh/shell.json +182 -0
  97. package/src/editor/i18n/zh/system.json +14 -0
  98. package/src/editor/i18n/zh/validation.json +82 -0
  99. package/src/editor/lib/ActionDialog.svelte +5 -4
  100. package/src/editor/lib/BlockEditor.svelte +305 -88
  101. package/src/editor/lib/CollectionPanel.svelte +17 -15
  102. package/src/editor/lib/DatePicker.svelte +15 -12
  103. package/src/editor/lib/ExtensionMount.svelte +12 -0
  104. package/src/editor/lib/Field.svelte +3 -2
  105. package/src/editor/lib/ImagePicker.svelte +82 -81
  106. package/src/editor/lib/MarkdownEditor.svelte +25 -24
  107. package/src/editor/lib/MediaPicker.svelte +6 -5
  108. package/src/editor/lib/MenuEditor.svelte +31 -30
  109. package/src/editor/lib/PreviewFrame.svelte +11 -6
  110. package/src/editor/lib/PropertiesTabs.svelte +3 -2
  111. package/src/editor/lib/PublishDialog.svelte +15 -14
  112. package/src/editor/lib/ReferenceSelect.svelte +3 -2
  113. package/src/editor/lib/SchemaField.svelte +15 -13
  114. package/src/editor/lib/SchemaPanel.svelte +20 -19
  115. package/src/editor/lib/Select.svelte +5 -4
  116. package/src/editor/lib/SeoGuidance.svelte +6 -5
  117. package/src/editor/lib/Settings.svelte +54 -54
  118. package/src/editor/lib/Shortcuts.svelte +7 -6
  119. package/src/editor/lib/SitePreview.svelte +10 -9
  120. package/src/editor/lib/TopBar.svelte +18 -17
  121. package/src/editor/lib/UnsavedChanges.svelte +7 -6
  122. package/src/editor/lib/VisualEditor.svelte +19 -18
  123. package/src/editor/lib/calendar.ts +10 -4
  124. package/src/editor/lib/embed-preview.ts +23 -5
  125. package/src/editor/lib/extension-preview.ts +121 -0
  126. package/src/editor/lib/github-auth.ts +23 -22
  127. package/src/editor/lib/github-backend.ts +96 -91
  128. package/src/editor/lib/images.ts +33 -31
  129. package/src/editor/lib/menu-tree.ts +5 -4
  130. package/src/editor/lib/preview-frame.ts +4 -3
  131. package/src/editor/lib/schema-edit.ts +3 -2
  132. package/src/editor/lib/settings.ts +5 -3
  133. package/src/editor/lib/slash-command.ts +1 -0
  134. package/src/editor/lib/tooltip.ts +1 -1
  135. package/src/editor/main.ts +9 -0
  136. package/src/editor/styles.css +15 -3
  137. package/src/env.d.ts +11 -1
  138. package/src/extensions.ts +160 -0
  139. package/src/index.ts +1 -1
  140. package/src/manifest/collections.ts +6 -5
  141. package/src/manifest/content-locales.ts +45 -0
  142. package/src/manifest/menu.ts +12 -10
  143. package/src/manifest/navigation.ts +13 -8
  144. package/src/manifest/references.ts +8 -7
  145. package/src/manifest/seo.ts +4 -3
  146. package/src/manifest/types.ts +4 -0
  147. package/src/preview.ts +36 -2
  148. package/src/routes/local-api.ts +5 -3
  149. package/src/routes/local-documents.ts +20 -16
  150. package/src/routes/local-media.ts +21 -16
  151. package/src/routes/local-menu.ts +9 -7
  152. package/src/routes/local-post.ts +18 -12
  153. package/src/routes/media-files.ts +10 -8
  154. package/src/routes/rigel-page.astro +2 -1
  155. package/src/schema/store.ts +22 -20
  156. package/src/schema/types.ts +2 -0
  157. package/src/schema/validate.ts +73 -69
  158. package/src/slugs.ts +11 -10
  159. package/src/vite/manifest-plugin.ts +38 -2
@@ -0,0 +1,29 @@
1
+ import { DecoratorNode, type LexicalEditor, type NodeKey } from "lexical";
2
+ import type { BlockData } from "../../extensions";
3
+ import { validateBlockData } from "../../extensions";
4
+
5
+ export function cloneBlockData(data: unknown): BlockData {
6
+ validateBlockData(data);
7
+ return JSON.parse(JSON.stringify(data));
8
+ }
9
+
10
+ export class ExtensionNode extends DecoratorNode<null> {
11
+ __name: string;
12
+ __data: BlockData;
13
+ static getType() { return "extension"; }
14
+ static clone(node: ExtensionNode) { return new ExtensionNode(node.__name, node.__data, node.__key); }
15
+ constructor(name: string, data: BlockData, key?: NodeKey) { super(key); this.__name = name; this.__data = cloneBlockData(data); }
16
+ static importJSON(raw: unknown) { const node = raw as { name: string; data: BlockData }; return new ExtensionNode(node.name, node.data); }
17
+ exportJSON() { return { type: "extension", version: 1, name: this.__name, data: cloneBlockData(this.__data) }; }
18
+ setData(data: BlockData) { this.getWritable().__data = cloneBlockData(data); }
19
+ createDOM(_config: unknown, editor: LexicalEditor) {
20
+ const element = (editor.getRootElement()?.ownerDocument ?? document).createElement("div");
21
+ element.contentEditable = "false";
22
+ element.dataset.rigelExtensionEditor = this.__name;
23
+ return element;
24
+ }
25
+ updateDOM() { return false; }
26
+ decorate() { return null; }
27
+ isInline() { return false; }
28
+ getTextContent() { return this.__name; }
29
+ }
@@ -1,3 +1,4 @@
1
+ import { translate } from "../i18n";
1
2
  import { HeadingNode } from "@lexical/rich-text";
2
3
  import type { LexicalNode } from "lexical";
3
4
  import type { ICONS } from "../lib/icons";
@@ -9,6 +10,7 @@ import { TableNode, TableRowNode, TableCellNode } from "@lexical/table";
9
10
  import { ImageNode, create as image } from "./image";
10
11
  import { VideoNode } from "./video";
11
12
  import { EmbedNode } from "./embed";
13
+ import { ExtensionNode } from "./extension";
12
14
  import { DividerNode, create as divider } from "./divider";
13
15
  import { create as quote } from "./quote";
14
16
  import { create as bullet } from "./bulleted-list";
@@ -24,19 +26,19 @@ import { create as h6 } from "./h6";
24
26
  import { create as table } from "./table";
25
27
 
26
28
  export const blockTypes: { value: string; label: string; icon: keyof typeof ICONS; create: () => LexicalNode }[] = [
27
- { value: "paragraph", label: "Paragraph", icon: "paragraph", create: paragraph },
28
- { value: "h1", label: "Heading 1", icon: "heading1", create: h1 },
29
- { value: "h2", label: "Heading 2", icon: "heading2", create: h2 },
30
- { value: "h3", label: "Heading 3", icon: "heading3", create: h3 },
31
- { value: "h4", label: "Heading 4", icon: "heading4", create: h4 },
32
- { value: "h5", label: "Heading 5", icon: "heading5", create: h5 },
33
- { value: "h6", label: "Heading 6", icon: "heading6", create: h6 },
34
- { value: "quote", label: "Quote", icon: "quotes", create: quote },
35
- { value: "bullet", label: "Bulleted list", icon: "listBullets", create: bullet },
36
- { value: "number", label: "Numbered list", icon: "listNumbers", create: number },
37
- { value: "code", label: "Code block", icon: "code", create: code },
38
- { value: "image", label: "Image", icon: "image", create: image },
39
- { value: "divider", label: "Divider", icon: "minus", create: divider },
40
- { value: "table", label: "Table", icon: "table", create: table },
29
+ { value: "paragraph", get label() { return translate("richtext.paragraph"); }, icon: "paragraph", create: paragraph },
30
+ { value: "h1", get label() { return translate("richtext.heading", { level: 1 }); }, icon: "heading1", create: h1 },
31
+ { value: "h2", get label() { return translate("richtext.heading", { level: 2 }); }, icon: "heading2", create: h2 },
32
+ { value: "h3", get label() { return translate("richtext.heading", { level: 3 }); }, icon: "heading3", create: h3 },
33
+ { value: "h4", get label() { return translate("richtext.heading", { level: 4 }); }, icon: "heading4", create: h4 },
34
+ { value: "h5", get label() { return translate("richtext.heading", { level: 5 }); }, icon: "heading5", create: h5 },
35
+ { value: "h6", get label() { return translate("richtext.heading", { level: 6 }); }, icon: "heading6", create: h6 },
36
+ { value: "quote", get label() { return translate("richtext.quote"); }, icon: "quotes", create: quote },
37
+ { value: "bullet", get label() { return translate("richtext.bulletedList"); }, icon: "listBullets", create: bullet },
38
+ { value: "number", get label() { return translate("richtext.numberedList"); }, icon: "listNumbers", create: number },
39
+ { value: "code", get label() { return translate("richtext.codeBlock"); }, icon: "code", create: code },
40
+ { value: "image", get label() { return translate("richtext.image"); }, icon: "image", create: image },
41
+ { value: "divider", get label() { return translate("richtext.divider"); }, icon: "minus", create: divider },
42
+ { value: "table", get label() { return translate("richtext.table"); }, icon: "table", create: table },
41
43
  ];
42
- export const blockNodes = [HeadingNode, QuoteNode, ListNode, ListItemNode, LinkNode, CodeNode, ImageNode, VideoNode, EmbedNode, DividerNode, TableNode, TableRowNode, TableCellNode];
44
+ export const blockNodes = [HeadingNode, QuoteNode, ListNode, ListItemNode, LinkNode, CodeNode, ExtensionNode, ImageNode, VideoNode, EmbedNode, DividerNode, TableNode, TableRowNode, TableCellNode];
@@ -1,3 +1,4 @@
1
+ import { translate } from "../i18n";
1
2
  import { DecoratorNode, type NodeKey } from "lexical";
2
3
  import { safePreviewUrl } from "../../preview-urls";
3
4
  import { createVideoOverlay } from "../lib/embed-preview";
@@ -22,7 +23,7 @@ export class VideoNode extends DecoratorNode<null> {
22
23
  video.playsInline = true;
23
24
  const preview = document.createElement("div");
24
25
  preview.style.cssText = "position:relative;min-height:220px";
25
- preview.append(video, createVideoOverlay(document, "Video", this.__video.src, true));
26
+ preview.append(video, createVideoOverlay(document, () => translate("richtext.video"), this.__video.src, true));
26
27
  figure.append(preview);
27
28
  if (this.__video.caption) { const caption = document.createElement("figcaption"); caption.textContent = this.__video.caption; figure.append(caption); }
28
29
  return figure;
@@ -0,0 +1,23 @@
1
+ # Editor translations
2
+
3
+ English source messages live in `en/*.json`, grouped by editor area. Keys stay namespaced and stable. UI components use `$t(key, parameters)`; TypeScript event handlers use `translate(key, parameters)`.
4
+
5
+ Rigel includes English and French by default and starts in English. Set `languages` in the Astro integration to choose additional interface languages:
6
+
7
+ ```ts
8
+ rigel({ languages: ["es"] })
9
+ ```
10
+
11
+ This includes English and Spanish, not French. English is always included as the default and fallback. Use `languages: []` for English only. Only included languages appear in Settings → Language; excluded catalogs stay out of the generated client and server bundles. A saved preference for an excluded language returns to English.
12
+
13
+ Supported codes are `en`, `fr`, `es`, `ru`, `zh`, `ja`, `it`, `de` and `nl`. `zh` is Simplified Chinese. Russian includes `.few` and `.many` plural forms; Chinese and Japanese use `.other` for every count.
14
+
15
+ Keep translated filenames and keys aligned with the English source. Translate values only; missing messages fall back to English. Do not ship English copies as finished translations. Restart the development server after adding a new locale directory if it still shows the old language list.
16
+
17
+ Keep placeholders such as `{name}` and `{count}` intact. Translate whole sentences, not fragments. Counted messages use `.one` and `.other` suffixes; languages can also provide `.few`, `.many`, `.zero` and `.two`. Native `Intl.PluralRules` selects the form from the numeric `count` parameter.
18
+
19
+ Site content, developer-defined schema labels, JSON keys, URLs and Git identifiers are not interface translations. Shared manifest helpers accept an optional translator and otherwise use English without importing browser state.
20
+
21
+ Built-in fields carry a `labelKey`; explicit site labels stay unchanged. Local editor requests send the chosen interface language in `Accept-Language`. Each API request resolves its own translator, so validation errors do not share mutable language state. Developer configuration diagnostics and protocol identifiers remain technical text.
22
+
23
+ Run `pnpm test`, `pnpm typecheck` and `pnpm build`. Catalog checks reject missing static message keys, duplicate keys and untranslated literal template text.
@@ -0,0 +1,136 @@
1
+ {
2
+ "connection.invalidAuthOrigin": "Ungültiger Origin des Authentifizierungs-Gateways.",
3
+ "connection.authorizationDenied": "Die GitHub-Autorisierung wurde verweigert. Melde dich erneut an und genehmige den Zugriff, um fortzufahren.",
4
+ "connection.tokenExchangeFailed": "Das Authentifizierungs-Gateway konnte den Autorisierungscode von GitHub nicht gegen ein Token eintauschen. Der Repository-Zugriff wurde noch nicht geprüft.",
5
+ "connection.loginFailed": "Die GitHub-Anmeldung ist fehlgeschlagen. Bitte melde dich erneut an.",
6
+ "connection.invalidCredentials": "GitHub hat ungültige oder abgelaufene Zugangsdaten zurückgegeben. Bitte melde dich erneut an.",
7
+ "connection.loginOpenFailed": "Die GitHub-Anmeldung konnte nicht geöffnet werden. Erlaube Pop-ups und versuche es erneut.",
8
+ "connection.loginBlocked": "Das Pop-up zur GitHub-Anmeldung wurde blockiert. Erlaube Pop-ups und versuche es erneut.",
9
+ "connection.loginCancelled": "Die GitHub-Anmeldung wurde abgebrochen. Bitte versuche es erneut.",
10
+ "connection.loginTimeout": "Die Zeit für die GitHub-Anmeldung ist abgelaufen. Bitte versuche es erneut.",
11
+ "connection.invalidSession": "Die GitHub-Sitzung ist ungültig. Bitte melde dich erneut an.",
12
+ "connection.invalidConfiguration": "Ungültige Konfiguration des GitHub-Repositorys oder der App.",
13
+ "connection.unreachable": "GitHub ist nicht erreichbar. Prüfe deine Verbindung und versuche es erneut.",
14
+ "connection.sessionExpired": "Die GitHub-Sitzung ist abgelaufen oder wurde widerrufen. Bitte melde dich erneut an.",
15
+ "connection.accessRateLimited": "Das Anfragelimit von GitHub wurde erreicht. Warte einige Minuten und versuche es erneut.",
16
+ "connection.accessDenied": "GitHub hat den Zugriff verweigert. Prüfe die App-Berechtigungen und die Freigabe durch die Organisation und melde dich dann erneut an.",
17
+ "connection.repositoryUnavailable": "Das GitHub-Repository oder die Installation ist nicht verfügbar. Prüfe den Repository-Namen und die App-Installation und versuche es dann erneut.",
18
+ "connection.accessCheckFailed": "GitHub konnte den Zugriff nicht überprüfen. Bitte versuche es später erneut.",
19
+ "connection.invalidAccessResponse": "GitHub hat eine ungültige Antwort auf die Zugriffsprüfung zurückgegeben. Bitte versuche es erneut.",
20
+ "connection.incompleteAccessListing": "Die Liste der zugänglichen GitHub-Repositorys ist unvollständig. Versuche es erneut oder schränke die Repository-Auswahl der App ein.",
21
+ "connection.invalidUser": "GitHub hat einen ungültigen Benutzer zurückgegeben. Bitte melde dich erneut an.",
22
+ "connection.invalidRepository": "GitHub hat ein ungültiges Repository zurückgegeben. Bitte versuche es erneut.",
23
+ "connection.unsafePath": "Unsicherer GitHub-Inhaltspfad",
24
+ "connection.invalidBranch": "Ungültiger GitHub-Branch",
25
+ "connection.connectFirst": "Verbinde zuerst das konfigurierte GitHub-Repository",
26
+ "connection.dedicatedDraftBranch": "Änderungen an GitHub-Inhalten erfordern einen eigenen Entwurfs-Branch, niemals den Veröffentlichungs-Branch",
27
+ "connection.overlappingDirectories": "GitHub-Inhaltsverzeichnisse dürfen sich nicht überschneiden",
28
+ "connection.invalidFilename": "Ungültiger Dateiname für Inhalte",
29
+ "connection.requestFailed": "GitHub-Anfrage fehlgeschlagen; prüfe deine Verbindung und verbinde dich erneut",
30
+ "connection.malformedResponse": "Fehlerhaft aufgebaute GitHub-API-Antwort",
31
+ "connection.malformedSha": "Fehlerhaft aufgebaute GitHub-SHA",
32
+ "connection.malformedPayload": "Fehlerhaft aufgebaute GitHub-Inhaltsnutzdaten",
33
+ "connection.invalidPayload": "Ungültige oder zu große GitHub-Inhaltsnutzdaten",
34
+ "connection.invalidUtf8": "Ungültige UTF-8-Kodierung der GitHub-Inhaltsnutzdaten",
35
+ "connection.contentTooLarge": "Der Inhalt überschreitet das Limit von 1 MiB",
36
+ "connection.invalidRemoteJson": "Ungültiges JSON der entfernten Inhalte",
37
+ "connection.incompleteTree": "Unvollständiger GitHub-Baum; Inhalte können nicht sicher geladen werden",
38
+ "connection.malformedTreeEntry": "Fehlerhaft aufgebauter GitHub-Baumeintrag",
39
+ "connection.duplicateTreePath": "Doppelter Pfad im GitHub-Baum",
40
+ "connection.invalidDirectory": "Das Inhaltsverzeichnis muss ein tatsächliches GitHub-Verzeichnis sein",
41
+ "connection.invalidFile": "Der Inhalt muss eine vorhandene reguläre GitHub-Datei sein",
42
+ "connection.blobShaMismatch": "Die GitHub-Blob-SHA stimmt nicht überein",
43
+ "connection.invalidRemoteFilename": "Ungültiger Dateiname für entfernte Inhalte",
44
+ "connection.invalidCopyGroups": "Textgruppen müssen Werteobjekte enthalten",
45
+ "connection.invalidDocument": "Das entfernte Dokument muss ein Objekt sein",
46
+ "connection.missingCollection": "Die konfigurierte GitHub-Sammlung fehlt",
47
+ "connection.invalidArticle": "Ungültiger entfernter Artikel",
48
+ "connection.menuSlugMismatch": "Der Slug des entfernten Menüs stimmt nicht mit dem Dateinamen überein",
49
+ "connection.reloadDraft": "Lade die Entwurfsinhalte erneut, bevor du in diesem Repository speicherst",
50
+ "connection.draftConflictUnsaved": "Konflikt im GitHub-Entwurfs-Branch; vor dem Speichern neu laden. Deine ungespeicherten Änderungen sind noch vorhanden.",
51
+ "connection.draftConflict": "Konflikt im GitHub-Entwurfs-Branch; vor dem Speichern neu laden.",
52
+ "connection.branchUpdateUnverified": "Die Aktualisierung des GitHub-Branchs konnte nicht verifiziert werden; versuche es erneut oder lade neu.",
53
+ "connection.deletionUnverified": "Die Löschung auf GitHub konnte nicht verifiziert werden; lade neu",
54
+ "connection.saveChanged": "Der auf GitHub gespeicherte Stand hat sich vor der Verifizierung geändert; lade neu",
55
+ "connection.waitBeforeSaving": "Warte, bis die Veröffentlichung abgeschlossen ist, bevor du speicherst.",
56
+ "connection.invalidValues": "Die Inhaltswerte müssen ein Objekt sein",
57
+ "connection.unknownCopyPage": "Unbekannte Textseite",
58
+ "connection.reloadCopyPage": "Lade die Textseite vor dem Speichern erneut",
59
+ "connection.unknownCollection": "Unbekannte Sammlung",
60
+ "connection.missingSchema": "Kein Dokumentschema konfiguriert",
61
+ "connection.unknownDocument": "Unbekannter Dokumenttyp oder Slug",
62
+ "connection.creationDisabled": "Das Erstellen von Einträgen ist für diesen Dokumenttyp deaktiviert",
63
+ "connection.menusNotConfigured": "Menüs müssen vom Website-Entwickler konfiguriert werden",
64
+ "connection.selectContent": "Wähle vor dem Speichern bearbeitbare Inhalte aus",
65
+ "connection.incompletePublishTree": "Unvollständiger GitHub-Baum. Veröffentlichen ist nicht verfügbar; prüfe diese Änderung auf GitHub.",
66
+ "connection.malformedPublishTree": "Fehlerhaft aufgebauter GitHub-Veröffentlichungsbaum",
67
+ "connection.malformedPublishTreeMode": "Fehlerhafter Dateimodus im GitHub-Veröffentlichungsbaum",
68
+ "connection.publishWriteRequired": "Zum Veröffentlichen ist Schreibzugriff auf das Repository erforderlich.",
69
+ "connection.squashDisabled": "Squash-Merges sind deaktiviert. Bitte den Repository-Inhaber, sie vor dem Veröffentlichen zu aktivieren.",
70
+ "connection.automaticDeletionEnabled": "Bitte den Repository-Inhaber, vor dem Veröffentlichen das automatische Löschen des Head-Branchs zu deaktivieren, damit der Entwurfs-Branch erhalten bleibt.",
71
+ "connection.comparisonTargetMismatch": "Der GitHub-Vergleich stimmt nicht mit dem geprüften Ziel überein.",
72
+ "connection.comparisonLimit": "GitHub-Vergleiche mit 300 oder mehr Dateien werden nicht unterstützt. Veröffentliche diese Änderung auf GitHub; eine unvollständige Liste wird nicht angezeigt.",
73
+ "connection.unsupportedComparison": "Unvollständiger oder nicht unterstützter GitHub-Dateivergleich. Veröffentliche diese Änderung auf GitHub.",
74
+ "connection.incompleteRename": "Unvollständiger GitHub-Vergleich einer Umbenennung",
75
+ "connection.incompleteComparison": "Unvollständiger GitHub-Dateivergleich. Veröffentlichen ist nicht verfügbar; eine unvollständige Liste wird nicht angezeigt.",
76
+ "connection.publishFileLimit": "Das Veröffentlichen von 300 oder mehr Dateien wird nicht unterstützt. Prüfe und veröffentliche diese Änderung auf GitHub.",
77
+ "connection.branchesChangedDuringReview": "Die Branches haben sich während der Prüfung geändert. Prüfe die Änderungen vor dem Veröffentlichen erneut.",
78
+ "connection.waitForWrite": "Warte, bis der aktuelle Speicher- oder Veröffentlichungsvorgang abgeschlossen ist.",
79
+ "connection.reviewFirst": "Prüfe die gespeicherten Änderungen vor dem Veröffentlichen.",
80
+ "connection.branchesChanged": "Die Branches haben sich geändert. Prüfe die Änderungen vor dem Veröffentlichen erneut.",
81
+ "connection.pullRequestMismatch": "Der Pull Request stimmt nicht mehr mit dieser Prüfung überein. Prüfe die Änderungen erneut.",
82
+ "connection.incompletePullRequests": "Unvollständige Liste der GitHub-Pull-Requests",
83
+ "connection.multiplePullRequests": "Mehrere passende Pull Requests gefunden. Kläre dies vor dem Veröffentlichen auf GitHub.",
84
+ "connection.pullRequestListingStopped": "Unvollständige Liste der GitHub-Pull-Requests; die Veröffentlichung wurde gestoppt.",
85
+ "connection.publishSettingsChanged": "Die Veröffentlichungseinstellungen oder der Zugriff haben sich geändert. Aktiviere Squash-Merges, deaktiviere das automatische Löschen von Branches und prüfe den Schreibzugriff. Prüfe anschließend erneut.",
86
+ "connection.pullRequestCreationUnconfirmed": "Die vorherige Erstellung eines Pull Requests ist nicht bestätigt. Prüfe GitHub, bevor du es erneut versuchst; es wurde kein Duplikat erstellt.",
87
+ "connection.pullRequestTargetChanged": "Der Pull Request oder das Ziel hat sich geändert. Prüfe die Änderungen vor dem Veröffentlichen erneut.",
88
+ "connection.syncUnverified": "GitHub synchronisiert die Entwürfe noch, oder die Synchronisierung konnte nicht verifiziert werden. Warte, lade die Entwurfsinhalte erneut und prüfe sie noch einmal. Es wurde nichts veröffentlicht.",
89
+ "connection.mergeBlocked": "GitHub hat diesen Merge nicht zugelassen. Löse Konflikte und erfülle die erforderlichen Prüfungen, Reviews oder Branch-Schutzregeln auf GitHub. Versuche es dann erneut. Keine Schutzmaßnahme wird umgangen.",
90
+ "connection.mergeFailed": "GitHub hat den Pull Request nicht zusammengeführt. Prüfe die erforderlichen Prüfungen, Reviews und Branch-Schutzregeln und versuche es dann erneut.",
91
+ "connection.publishUnverified": "Das Veröffentlichungsergebnis konnte nicht verifiziert werden. Prüfe diesen Pull Request auf GitHub, bevor du es erneut versuchst.",
92
+ "connection.publishPermissions": "Zum Veröffentlichen sind Lese-/Schreibberechtigungen für Contents und Pull requests der GitHub App, die Genehmigung des Installationsinhabers und Schreibzugriff auf das Repository erforderlich. Verbinde dich nach der Genehmigung erneut. Die Branch-Schutzregeln gelten weiterhin.",
93
+ "connection.publishRejected": "GitHub hat die Veröffentlichung abgelehnt. Prüfe Konflikte, erforderliche Prüfungen/Reviews, Branch-Schutzregeln und Squash-Einstellungen. Prüfe die Änderungen erneut, wenn sich einer der Branches geändert hat.",
94
+ "connection.waitBeforeDeleting": "Warte, bis die Veröffentlichung abgeschlossen ist, bevor du löschst.",
95
+ "connection.contentExists": "Der Inhalt existiert bereits; wähle einen anderen Slug",
96
+ "connection.reloadContent": "Lade diesen Inhalt erneut, bevor du ihn änderst",
97
+ "connection.requestRateLimited": "GitHub-Anfragelimit erreicht; warte vor einem erneuten Versuch ({status})",
98
+ "connection.requestSessionExpired": "GitHub-Sitzung abgelaufen; verbinde dich erneut ({status})",
99
+ "connection.requestAccessDenied": "GitHub-Zugriff verweigert; prüfe die Berechtigungen der Repository-Installation ({status})",
100
+ "connection.requestUnavailable": "GitHub-Repository, Branch oder Datei nicht verfügbar; prüfe den Zugriff und lade neu ({status})",
101
+ "connection.requestConflict": "GitHub-Inhaltskonflikt; vor dem Speichern neu laden ({status})",
102
+ "connection.requestRejected": "GitHub hat diese Änderung abgelehnt; der Pfad oder Branch existiert möglicherweise bereits; lade neu ({status})",
103
+ "connection.requestError": "GitHub-Anfrage fehlgeschlagen; prüfe den Repository-Zugriff und versuche es dann erneut ({status})",
104
+ "connection.publishOutcomeUnconfirmed": "Das Veröffentlichungsergebnis ist nicht bestätigt. Prüfe Pull Request #{number} auf GitHub oder versuche es erneut, um das Ergebnis zu verifizieren, bevor du eine weitere Veröffentlichung startest.",
105
+ "connection.cancel": "Abbrechen",
106
+ "connection.working": "Wird bearbeitet…",
107
+ "connection.actionFailed": "Die Aktion konnte nicht abgeschlossen werden. Versuche es erneut.",
108
+ "connection.publishTitle": "Gespeicherte Änderungen veröffentlichen",
109
+ "connection.closePublishReview": "Veröffentlichungsprüfung schließen",
110
+ "connection.publishDescription": "Die Veröffentlichung umfasst {scope}, einschließlich Dateien außerhalb der CMS-Inhaltsordner. Ungespeicherte Änderungen werden niemals einbezogen oder automatisch gespeichert.",
111
+ "connection.publishScope": "alle gespeicherten Änderungen im Entwurfs-Branch",
112
+ "connection.loadingReview": "Vollständige Dateiprüfung wird geladen…",
113
+ "connection.publishBranches": "{branch} nach {publishBranch}, als ein einzelner Squash-Commit.",
114
+ "connection.syncDescription": "Der Veröffentlichungs-Branch enthält Änderungen, die in den Entwürfen fehlen, darunter frühere Squash-Veröffentlichungen. Synchronisiere ihn zuerst ausdrücklich mit den Entwürfen über einen normalen GitHub-Merge. Dadurch wird nichts veröffentlicht. Konflikte stoppen die Synchronisierung. Prüfe anschließend die aktualisierten Dateien vor dem Veröffentlichen erneut.",
115
+ "connection.treeDifferences": "Dies sind die aktuellen Unterschiede zwischen den Bäumen, nicht die endgültige Veröffentlichungsliste:",
116
+ "connection.fileCount.one": "{count} Datei",
117
+ "connection.fileCount.other": "{count} Dateien",
118
+ "connection.allChangedFiles": "Alle geänderten Dateien",
119
+ "connection.previousFilename": "Zuvor: {filename}",
120
+ "connection.noSavedChanges": "Keine gespeicherten Änderungen zum Veröffentlichen. Die Branch-Bäume sind identisch.",
121
+ "connection.publishSafety": "Beide Branch-Versionen werden vor dem Veröffentlichen erneut geprüft. GitHub fixiert die Entwurfsversion, kann die Zielversion aber nicht atomar sperren; eine Aktualisierung des Ziels im allerletzten Moment kann daher weiterhin zu einem Wettlauf führen. Erforderliche Prüfungen, Reviews und Branch-Schutzregeln gelten.",
122
+ "connection.close": "Schließen",
123
+ "connection.reviewAgain": "Erneut prüfen",
124
+ "connection.syncDraftsFirst": "Zuerst Entwürfe synchronisieren",
125
+ "connection.confirmPublish": "Veröffentlichen bestätigen",
126
+ "connection.unsavedTitle": "Ungespeicherte Änderungen",
127
+ "connection.keepEditing": "Weiter bearbeiten",
128
+ "connection.unsavedDescription": "Du hast ungespeicherte Änderungen. Vor dem Verlassen speichern oder diesen Entwurf verwerfen?",
129
+ "connection.discardChanges": "Änderungen verwerfen",
130
+ "connection.saving": "Wird gespeichert…",
131
+ "connection.saveAndLeave": "Speichern und verlassen",
132
+ "connection.fileStatus.added": "hinzugefügt",
133
+ "connection.fileStatus.modified": "geändert",
134
+ "connection.fileStatus.removed": "entfernt",
135
+ "connection.fileStatus.renamed": "umbenannt"
136
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "defaults.draft": "Entwurf",
3
+ "defaults.seoTitle": "SEO-Titel",
4
+ "defaults.seoDescription": "SEO-Beschreibung",
5
+ "defaults.socialImage": "Bild für soziale Medien"
6
+ }
@@ -0,0 +1,130 @@
1
+ {
2
+ "fields.remove": "Entfernen",
3
+ "fields.addItem": "Element hinzufügen",
4
+ "fields.colorPicker": "Farbauswahl für {label}",
5
+ "fields.colorHexValue": "Hex-Wert für {label}",
6
+ "fields.hideValue": "{label} ausblenden",
7
+ "fields.showValue": "{label} anzeigen",
8
+ "fields.choose": "Auswählen…",
9
+ "fields.itemNumber": "Element {number}",
10
+ "fields.moveItemUp": "Element {number} von {label} nach oben verschieben",
11
+ "fields.moveItemDown": "Element {number} von {label} nach unten verschieben",
12
+ "fields.duplicateItem": "Element {number} von {label} duplizieren",
13
+ "fields.removeItem": "Element {number} von {label} entfernen",
14
+ "fields.itemLabel": "{label}, Element {number}",
15
+ "fields.moveUp": "Nach oben verschieben",
16
+ "fields.moveDown": "Nach unten verschieben",
17
+ "fields.duplicate": "Duplizieren",
18
+ "fields.selectLabel": "{label} auswählen…",
19
+ "fields.unavailableReference": "Nicht verfügbar ({id})",
20
+ "fields.noEntries": "Es wurden noch keine Einträge definiert.",
21
+ "fields.properties": "Eigenschaften",
22
+ "fields.content": "Inhalte",
23
+ "fields.seo": "SEO",
24
+ "fields.selectOptions": "Optionen auswählen…",
25
+ "fields.noOptions": "Keine Optionen verfügbar.",
26
+ "fields.demoContentNotice": "Beispielfelder zum Testen. Diese Werte sind von den Einstellungen Ihrer Website getrennt.",
27
+ "fields.sharedContentNotice": "Gemeinsam genutzte Inhalte. Änderungen erscheinen auf jeder Seite, die darauf verweist.",
28
+ "fields.pageProperties": "Seiteneigenschaften",
29
+ "fields.urlSlug": "URL-Slug",
30
+ "fields.documentSlugHint": "Ändert die URL, nicht die Dokumentkennung oder den Dateinamen. Die Website-Route muss die Slug-Metadaten verwenden.",
31
+ "fields.newPageNotice": "Neue Seite. Beim Speichern wird die JSON-Datei geschrieben. Die Route ist verfügbar, sobald die Datei auf der Website vorliegt.",
32
+ "fields.structure": "Struktur",
33
+ "fields.moveSectionUp": "{label} nach oben verschieben",
34
+ "fields.moveSectionDown": "{label} nach unten verschieben",
35
+ "fields.duplicateSection": "{label} duplizieren",
36
+ "fields.removeSection": "{label} entfernen",
37
+ "fields.sectionTypeToAdd": "Typ des hinzuzufügenden Abschnitts",
38
+ "fields.chooseSection": "Abschnitt auswählen…",
39
+ "fields.addSection": "Abschnitt hinzufügen",
40
+ "fields.pendingSections.one": "{count} neuer Abschnitt erscheint nach dem Speichern.",
41
+ "fields.pendingSections.other": "{count} neue Abschnitte erscheinen nach dem Speichern.",
42
+ "fields.sectionProperties": "Abschnittseigenschaften",
43
+ "fields.editReference": "{label} bearbeiten ↗",
44
+ "fields.articleDetails": "Artikeldetails",
45
+ "fields.collectionSlugHint": "Ändert die URL, nicht den Dateinamen der Inhalte. Die Website-Route muss die Slug-Metadaten verwenden.",
46
+ "fields.commaSeparatedLabel": "{label} (durch Kommas getrennt)",
47
+ "fields.editArticleBody": "Artikeltext in der Vorschau bearbeiten",
48
+ "fields.loadingPreview": "Vorschau wird geladen…",
49
+ "fields.editArticleBodyHint": "Klicken Sie zum Bearbeiten auf den Artikeltext in der Vorschau. Änderungen an den Inhalten müssen gespeichert werden.",
50
+ "fields.seoNotSet": "Nicht festgelegt",
51
+ "fields.seoTooShort": "Zu kurz",
52
+ "fields.seoTooLong": "Zu lang",
53
+ "fields.seoRecommendedLength": "Empfohlene Länge",
54
+ "fields.seoTitleLength": "Länge des SEO-Titels",
55
+ "fields.seoDescriptionLength": "Länge der SEO-Beschreibung",
56
+ "fields.seoLengthDetails": "{count} Zeichen. {status}. Empfohlen: {min} bis {max}.",
57
+ "fields.seoRecommendedCharacters": "Empfohlen: {min}–{max} Zeichen.",
58
+ "fields.seoRecommendedImageSize": "Empfohlene Größe: 1200 × 628 px.",
59
+ "fields.section": "Abschnitt",
60
+ "fields.menuItemNotFound": "Menüeintrag nicht gefunden",
61
+ "fields.menuMoveIntoSelf": "Ein Eintrag kann nicht in sich selbst oder in einen seiner Untereinträge verschoben werden",
62
+ "fields.menuDropTargetMissing": "Das Ablageziel ist nicht mehr vorhanden",
63
+ "fields.menuMoveDepthLimit": "Diese Verschiebung überschreitet die Begrenzung auf {maxDepth} Ebenen",
64
+ "fields.menuItemMoved": "Menüeintrag verschoben",
65
+ "fields.menuCannotMoveItem": "Eintrag kann nicht verschoben werden",
66
+ "fields.menuMaximumLevels": "Höchstens {maxDepth} Ebenen",
67
+ "fields.menuNewItem": "Neuer Eintrag",
68
+ "fields.menuItemAdded": "Menüeintrag hinzugefügt",
69
+ "fields.menuMoveCancelled": "Verschieben abgebrochen",
70
+ "fields.menuItems": "Menüeinträge",
71
+ "fields.menuPath": "Menüpfad",
72
+ "fields.menuUntitledItem": "Eintrag ohne Titel",
73
+ "fields.menuItemDetails": "Details zu {label}",
74
+ "fields.menuItemActions": "Aktionen für {label}",
75
+ "fields.menuUp": "Nach oben",
76
+ "fields.menuDown": "Nach unten",
77
+ "fields.menuIndent": "Einrücken",
78
+ "fields.menuOutdent": "Ausrücken",
79
+ "fields.menuLabel": "Beschriftung",
80
+ "fields.menuLabelFor": "Beschriftung für {id}",
81
+ "fields.menuUrl": "URL",
82
+ "fields.menuUrlFor": "URL für {id}",
83
+ "fields.menuUrlPlaceholder": "/about oder https://example.com",
84
+ "fields.menuOpenInNewTab": "In neuem Tab öffnen",
85
+ "fields.menuGroupItems": "Einträge",
86
+ "fields.menuDragItem": "{label} ziehen",
87
+ "fields.menuOpenItem": "{label} öffnen",
88
+ "fields.menuEmptyGroup": "Keine Einträge in dieser Gruppe.",
89
+ "fields.menuEmpty": "Noch keine Menüeinträge.",
90
+ "fields.menuAddChild": "Untereintrag hinzufügen",
91
+ "fields.menuMaximumLevelsHint": "Höchstens {maxDepth} Ebenen.",
92
+ "fields.menuRemoveTitle": "„{label}“ entfernen?",
93
+ "fields.menuRemoveDescription": "Dadurch werden der Eintrag und alle seine Untereinträge aus dem Entwurf entfernt. Klicken Sie auf Speichern, um die Änderung dauerhaft zu übernehmen.",
94
+ "fields.menuItemRemoved": "Menüeintrag entfernt",
95
+ "fields.calendarHeading": "{month} {year}",
96
+ "fields.chooseDate": "Datum auswählen…",
97
+ "fields.calendarFor": "Kalender für {label}",
98
+ "fields.previousMonth": "Vorheriger Monat",
99
+ "fields.calendarMonth": "Kalendermonat",
100
+ "fields.calendarYear": "Kalenderjahr",
101
+ "fields.nextMonth": "Nächster Monat",
102
+ "fields.today": "Heute",
103
+ "fields.clear": "Leeren",
104
+ "fields.month.january": "Januar",
105
+ "fields.month.february": "Februar",
106
+ "fields.month.march": "März",
107
+ "fields.month.april": "April",
108
+ "fields.month.may": "Mai",
109
+ "fields.month.june": "Juni",
110
+ "fields.month.july": "Juli",
111
+ "fields.month.august": "August",
112
+ "fields.month.september": "September",
113
+ "fields.month.october": "Oktober",
114
+ "fields.month.november": "November",
115
+ "fields.month.december": "Dezember",
116
+ "fields.weekday.sunday": "Sonntag",
117
+ "fields.weekday.monday": "Montag",
118
+ "fields.weekday.tuesday": "Dienstag",
119
+ "fields.weekday.wednesday": "Mittwoch",
120
+ "fields.weekday.thursday": "Donnerstag",
121
+ "fields.weekday.friday": "Freitag",
122
+ "fields.weekday.saturday": "Samstag",
123
+ "fields.weekdayShort.sunday": "So",
124
+ "fields.weekdayShort.monday": "Mo",
125
+ "fields.weekdayShort.tuesday": "Di",
126
+ "fields.weekdayShort.wednesday": "Mi",
127
+ "fields.weekdayShort.thursday": "Do",
128
+ "fields.weekdayShort.friday": "Fr",
129
+ "fields.weekdayShort.saturday": "Sa"
130
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "local.documentTooLarge": "Das Dokument überschreitet die Grenze von 1 MiB",
3
+ "local.dataRequired": "Der Anfrageinhalt muss ein data-Objekt enthalten",
4
+ "local.unknownDocument": "Unbekanntes Dokument",
5
+ "local.readDocumentFailed": "Dokument konnte nicht gelesen werden",
6
+ "local.documentDeveloperOnly": "Dokumente werden vom Website-Entwickler erstellt und entfernt",
7
+ "local.unknownDocumentTarget": "Unbekannter Dokumenttyp oder Slug",
8
+ "local.saveDocumentFailed": "Dokument konnte nicht gespeichert werden",
9
+ "local.unknownCollectionSlug": "Unbekannte Sammlung oder unbekannter Slug",
10
+ "local.invalidArticle": "Ungültiger Artikel",
11
+ "local.postExists": "Ein Beitrag mit diesem Slug existiert bereits. Lade die Sammlung neu und erstelle den Entwurf erneut.",
12
+ "local.postNotFound": "Dieser Beitrag existiert nicht",
13
+ "local.invalidMenuSlug": "Ungültiger Menü-Slug",
14
+ "local.menuDeveloperOnly": "Menüs werden vom Website-Entwickler definiert. Nur vorhandene Menüs können bearbeitet werden.",
15
+ "local.menuSlugMismatch": "Der Menü-Slug muss mit dem Slug der Anfrage übereinstimmen",
16
+ "local.menuNotFound": "Dieses Menü existiert nicht",
17
+ "local.notFound": "Nicht gefunden",
18
+ "local.unsupportedMedia": "Nicht unterstützter oder nicht zum Dateinamen passender Medientyp",
19
+ "local.mediaTooLarge": "Die Mediendatei überschreitet {limit} MB",
20
+ "local.emptyMedia": "Der Anfrageinhalt enthält keine Mediendaten",
21
+ "local.readImageFailed": "Bilddaten konnten nicht gelesen werden",
22
+ "local.emptyImage": "Der Anfrageinhalt enthält keine Bilddaten",
23
+ "local.mediaBytesMismatch": "Der Medientyp stimmt nicht mit den Dateibytes überein",
24
+ "local.saveImageFailed": "Bild konnte nicht gespeichert werden",
25
+ "local.saveMetadataFailed": "Metadaten konnten nicht gespeichert werden",
26
+ "local.mediaUrlRequired": "Eine Medien-URL ist erforderlich",
27
+ "local.fileNotFound": "Datei nicht gefunden",
28
+ "local.deleteFileFailed": "Datei konnte nicht gelöscht werden. Bitte erneut versuchen.",
29
+ "local.missingSlug": "Slug fehlt",
30
+ "local.copyNotFound": "Kein copy-Modul für {slug} vorhanden",
31
+ "local.copyValuesNotFound": "Der values-Block in {slug}.ts wurde nicht gefunden",
32
+ "local.unknownDocumentType": "Unbekannter Dokumenttyp {type}",
33
+ "local.creatingDisabled": "Das Erstellen von Einträgen ist für diesen Dokumenttyp deaktiviert",
34
+ "local.invalidDocumentSlug": "Ungültiger Dokument-Slug",
35
+ "local.documentObjectRequired": "Das Dokument muss ein Objekt sein",
36
+ "local.documentExists": "Ein Dokument mit diesem Slug existiert bereits",
37
+ "local.documentNotFound": "Dieses Dokument existiert nicht",
38
+ "local.writeDocumentFailed": "Dokument konnte nicht geschrieben werden",
39
+ "local.invalidMetadataBody": "Ungültiger Anfrageinhalt",
40
+ "local.unknownMetadataField": "Unbekanntes Metadatenfeld",
41
+ "local.unknownAsset": "Unbekannte Datei",
42
+ "local.invalidDisplayName": "Ungültiger Anzeigename",
43
+ "local.metadataTitleString": "Der Titel muss eine Zeichenfolge sein",
44
+ "local.metadataDescriptionString": "Die Beschreibung muss eine Zeichenfolge sein",
45
+ "local.metadataAltString": "Der Alternativtext muss eine Zeichenfolge sein",
46
+ "local.metadataAltImagesOnly": "Alternativtext ist nur für Bilder verfügbar",
47
+ "local.mediaDirectoryUnavailable": "Medienverzeichnis nicht verfügbar",
48
+ "local.menuStorageUnavailable": "Auf das Menü konnte nicht zugegriffen werden: Die gespeicherten Daten sind ungültig oder der Speicherort ist unsicher oder nicht verfügbar."
49
+ }