@kyro-cms/admin 0.12.3 → 0.12.5

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 (110) hide show
  1. package/dist/index.cjs +64 -26
  2. package/dist/index.d.cts +2 -1
  3. package/dist/index.d.ts +2 -1
  4. package/dist/index.js +64 -26
  5. package/package.json +8 -2
  6. package/src/components/ActionBar.tsx +16 -16
  7. package/src/components/ApiHealth.tsx +522 -0
  8. package/src/components/ApiKeysManager.tsx +6 -4
  9. package/src/components/AuditLogsPage.tsx +4 -2
  10. package/src/components/AutoForm.tsx +10 -7
  11. package/src/components/BrandingHub.tsx +3 -1
  12. package/src/components/Dashboard.tsx +44 -37
  13. package/src/components/DashboardMetrics.tsx +168 -58
  14. package/src/components/DetailView.tsx +125 -50
  15. package/src/components/DeveloperCenter.tsx +5 -3
  16. package/src/components/GraphQLPlayground.tsx +10 -8
  17. package/src/components/ListView.tsx +66 -45
  18. package/src/components/LoginPage.tsx +21 -19
  19. package/src/components/MarketplaceManager.tsx +3 -1
  20. package/src/components/MediaGallery.tsx +12 -9
  21. package/src/components/PluginsManager.tsx +6 -4
  22. package/src/components/RestPlayground.tsx +8 -6
  23. package/src/components/SessionsManager.tsx +3 -1
  24. package/src/components/Sidebar.astro +180 -92
  25. package/src/components/UserManagement.tsx +8 -6
  26. package/src/components/UserMenu.tsx +19 -17
  27. package/src/components/VersionHistoryPanel.tsx +6 -4
  28. package/src/components/WebhookManager.tsx +143 -15
  29. package/src/components/autoform/AutoFormApiView.tsx +3 -1
  30. package/src/components/autoform/AutoFormEditView.tsx +5 -3
  31. package/src/components/autoform/AutoFormHeader.tsx +6 -6
  32. package/src/components/blocks/AccordionBlock.tsx +5 -3
  33. package/src/components/blocks/ArrayBlock.tsx +5 -3
  34. package/src/components/blocks/BlockWrapper.tsx +5 -3
  35. package/src/components/blocks/CodeBlock.tsx +4 -2
  36. package/src/components/blocks/FileBlock.tsx +5 -3
  37. package/src/components/blocks/HeroBlock.tsx +5 -3
  38. package/src/components/blocks/ImageBlock.tsx +6 -4
  39. package/src/components/blocks/ListBlock.tsx +5 -3
  40. package/src/components/blocks/ParagraphBlock.tsx +3 -1
  41. package/src/components/blocks/RelationshipBlock.tsx +5 -3
  42. package/src/components/blocks/RichTextBlock.tsx +5 -3
  43. package/src/components/blocks/VideoBlock.tsx +5 -3
  44. package/src/components/fields/AccordionField.tsx +10 -51
  45. package/src/components/fields/ArrayField.tsx +9 -7
  46. package/src/components/fields/ArrayLayout.tsx +3 -1
  47. package/src/components/fields/BlocksField.tsx +24 -75
  48. package/src/components/fields/ButtonField.tsx +3 -1
  49. package/src/components/fields/CardField.tsx +6 -4
  50. package/src/components/fields/GroupLayout.tsx +2 -49
  51. package/src/components/fields/HeadingField.tsx +3 -1
  52. package/src/components/fields/HeadingSubheadingField.tsx +4 -2
  53. package/src/components/fields/HeroField.tsx +8 -6
  54. package/src/components/fields/JSONField.tsx +9 -10
  55. package/src/components/fields/LinkField.tsx +4 -2
  56. package/src/components/fields/ListField.tsx +3 -1
  57. package/src/components/fields/MarkdownField.tsx +3 -17
  58. package/src/components/fields/RelationshipBlockField.tsx +7 -5
  59. package/src/components/fields/RelationshipField.tsx +3 -1
  60. package/src/components/fields/RichTextField.tsx +19 -16
  61. package/src/components/fields/SecretField.tsx +9 -69
  62. package/src/components/fields/SelectField.tsx +11 -6
  63. package/src/components/fields/TabsLayout.tsx +2 -48
  64. package/src/components/fields/TextField.tsx +9 -7
  65. package/src/components/fields/UploadField.tsx +3 -1
  66. package/src/components/fields/VideoField.tsx +6 -4
  67. package/src/components/ui/BlockDrawer.tsx +3 -1
  68. package/src/components/ui/CommandPalette.tsx +9 -7
  69. package/src/components/ui/CommandPaletteWrapper.tsx +3 -1
  70. package/src/components/ui/IconPickerModal.tsx +4 -2
  71. package/src/components/ui/PageHeader.tsx +48 -20
  72. package/src/components/users/UserDetail.tsx +3 -1
  73. package/src/components/users/UserForm.tsx +5 -3
  74. package/src/fields/examples/sample-field-2.tsx +3 -1
  75. package/src/fields/examples/sample-field.tsx +3 -1
  76. package/src/hooks/useAutoFormState.ts +19 -11
  77. package/src/integration.ts +21 -0
  78. package/src/layouts/AdminLayout.astro +252 -189
  79. package/src/layouts/AuthLayout.astro +52 -31
  80. package/src/lib/api.ts +7 -7
  81. package/src/lib/autoform-store.ts +4 -0
  82. package/src/lib/deep-equal.ts +3 -3
  83. package/src/lib/i18n.ts +44 -0
  84. package/src/lib/vite-shim-plugin.ts +3 -0
  85. package/src/locales/de.json +163 -0
  86. package/src/locales/en.json +163 -0
  87. package/src/locales/es.json +163 -0
  88. package/src/locales/fr.json +163 -0
  89. package/src/locales/pt.json +163 -0
  90. package/src/pages/403.astro +2 -1
  91. package/src/pages/[collection]/[id].astro +23 -10
  92. package/src/pages/[collection]/index.astro +48 -34
  93. package/src/pages/audit/index.astro +2 -1
  94. package/src/pages/graphql-explorer.astro +2 -1
  95. package/src/pages/graphql.astro +2 -1
  96. package/src/pages/health.astro +9 -0
  97. package/src/pages/index.astro +6 -5
  98. package/src/pages/keys.astro +2 -1
  99. package/src/pages/marketplace.astro +2 -1
  100. package/src/pages/media.astro +2 -1
  101. package/src/pages/plugins.astro +2 -1
  102. package/src/pages/rest-playground.astro +2 -1
  103. package/src/pages/roles/index.astro +16 -52
  104. package/src/pages/sessions.astro +2 -1
  105. package/src/pages/settings/[slug].astro +45 -30
  106. package/src/pages/users/[id].astro +1 -0
  107. package/src/pages/users/index.astro +2 -1
  108. package/src/pages/users/new.astro +2 -1
  109. package/src/pages/webhooks.astro +2 -1
  110. package/src/pages/index_ALT.astro +0 -3
@@ -1,7 +1,9 @@
1
1
  ---
2
2
  import "../styles/main.css";
3
3
  import { adminPath, apiPath } from "../lib/paths";
4
- import { getSiteSettings, getGlobal } from "../lib/globals";
4
+ import { getSiteSettings, getGlobal, getBrandSettings } from "../lib/globals";
5
+ import { ClientRouter } from 'astro:transitions';
6
+ import LoadingIndicator from 'astro-loading-indicator/component';
5
7
 
6
8
  interface Props {
7
9
  title: string;
@@ -9,14 +11,16 @@ interface Props {
9
11
 
10
12
  const { title } = Astro.props;
11
13
  const siteSettings = await getSiteSettings({ request: Astro.request });
14
+ const brandSettings = await getBrandSettings({ request: Astro.request });
12
15
  const seoSettings = await getGlobal("seo-settings", { request: Astro.request });
13
16
 
14
- const siteName = siteSettings?.siteName || "Kyro CMS";
15
- const siteFavicon = siteSettings?.siteFavicon;
16
- const siteLogo = siteSettings?.siteLogo;
17
- const logoWidth = siteSettings?.logo?.width;
18
- const logoHeight = siteSettings?.logo?.height;
19
- const logoAlt = siteSettings?.logo?.altText || siteName;
17
+ const siteName = siteSettings?.siteName || brandSettings?.companyInfo?.companyName || "Kyro CMS";
18
+ const siteFavicon = siteSettings?.siteFavicon || brandSettings?.identity?.favicon;
19
+ const siteLogo = brandSettings?.identity?.primaryLogo || siteSettings?.siteLogo;
20
+ const darkLogo = brandSettings?.identity?.darkLogo;
21
+ const logoWidth = siteLogo?.width;
22
+ const logoHeight = siteLogo?.height;
23
+ const logoAlt = siteLogo?.altText || siteName;
20
24
  const siteDescription = siteSettings?.siteDescription || "";
21
25
 
22
26
  // SEO Logic
@@ -32,11 +36,17 @@ let displayTitle = title === "Login" && defaultTitle !== "Login" ? defaultTitle
32
36
  if (includeSiteName) {
33
37
  displayTitle = `${displayTitle}${titleSeparator}${siteName}`;
34
38
  }
39
+ const defaultLang = siteSettings?.defaultLanguage || "en";
35
40
  ---
36
41
 
37
42
  <!doctype html>
38
- <html lang="en">
43
+ <html lang={defaultLang}>
39
44
  <head>
45
+ <ClientRouter />
46
+ <LoadingIndicator color="var(--kyro-primary)" height="3px" />
47
+ <script is:inline define:vars={{ lang: defaultLang }}>
48
+ window.KYRO_LANG = lang;
49
+ </script>
40
50
  <meta charset="UTF-8" />
41
51
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
42
52
  <title>{displayTitle}</title>
@@ -83,31 +93,42 @@ if (includeSiteName) {
83
93
  <div class="w-full text-center mb-8">
84
94
  <a href="/" class="inline-flex items-center justify-center gap-2">
85
95
  {
86
- siteLogo ? (
87
- <img
88
- src={siteLogo.url}
89
- alt={logoAlt}
90
- style={{
91
- width: logoWidth ? `${logoWidth}px` : "auto",
92
- height: logoHeight ? `${logoHeight}px` : "40px",
93
- objectFit: "contain",
94
- }}
95
- class="rounded-lg"
96
- />
96
+ siteLogo || darkLogo ? (
97
+ <div class="flex items-center gap-3">
98
+ <div class="flex items-center">
99
+ {siteLogo && (
100
+ <img
101
+ src={siteLogo.url}
102
+ alt={logoAlt}
103
+ style={{
104
+ width: logoWidth ? `${logoWidth}px` : "auto",
105
+ height: logoHeight ? `${logoHeight}px` : "40px",
106
+ objectFit: "contain",
107
+ }}
108
+ class={`rounded-lg ${darkLogo ? "block dark:hidden" : ""}`}
109
+ />
110
+ )}
111
+ {darkLogo && (
112
+ <img
113
+ src={darkLogo.url}
114
+ alt={logoAlt}
115
+ style={{
116
+ width: logoWidth ? `${logoWidth}px` : "auto",
117
+ height: logoHeight ? `${logoHeight}px` : "40px",
118
+ objectFit: "contain",
119
+ }}
120
+ class={`rounded-lg ${siteLogo ? "hidden dark:block" : "block"}`}
121
+ />
122
+ )}
123
+ </div>
124
+ <span class="text-xl font-bold tracking-tighter text-[var(--kyro-text-primary)]">
125
+ {siteName}
126
+ </span>
127
+ </div>
97
128
  ) : (
98
129
  <>
99
- <svg class="w-7 h-7 text-[var(--kyro-text-primary)]" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
100
- <defs>
101
- <mask id="kyro-cutout-auth">
102
- <rect width="100" height="100" fill="white" />
103
- <path d="M 40 89.72 L 40 40 L 89.72 40 A 45 45 0 0 1 40 89.72 Z" stroke="black" stroke-width="8" fill="none" />
104
- </mask>
105
- </defs>
106
- <g mask="url(#kyro-cutout-auth)" fill="currentColor">
107
- <circle cx="45" cy="45" r="45" />
108
- <rect x="40" y="40" width="60" height="60" />
109
- </g>
110
- </svg>
130
+ <img src="/logo-white.svg" alt="Kyro CMS" class="w-7 h-7 hidden dark:block" />
131
+ <img src="/logo.svg" alt="Kyro CMS" class="w-7 h-7 block dark:hidden" />
111
132
  <span class="text-xl font-bold tracking-tighter text-[var(--kyro-text-primary)]">
112
133
  {siteName}
113
134
  </span>
package/src/lib/api.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { apiPath, adminPath, resolveApi, resolveAdmin, resolveMedia } from "./paths";
2
2
  import { toast } from "./stores";
3
3
 
4
- export interface ApiResponse<T = unknown> {
4
+ export interface ApiResponse<T = any> {
5
5
  docs?: T[];
6
6
  doc?: T;
7
7
  totalDocs?: number;
@@ -64,7 +64,7 @@ export async function fetchWithAuth(
64
64
  return response;
65
65
  }
66
66
 
67
- export async function apiGet<T = unknown>(
67
+ export async function apiGet<T = any>(
68
68
  url: string,
69
69
  options?: RequestInit & { autoToast?: boolean },
70
70
  ): Promise<T> {
@@ -78,7 +78,7 @@ export async function apiGet<T = unknown>(
78
78
  return response.json();
79
79
  }
80
80
 
81
- export async function apiPost<T = unknown>(
81
+ export async function apiPost<T = any>(
82
82
  url: string,
83
83
  body?: unknown,
84
84
  options?: RequestInit & { autoToast?: boolean },
@@ -101,7 +101,7 @@ export async function apiPost<T = unknown>(
101
101
  return response.json();
102
102
  }
103
103
 
104
- export async function apiPatch<T = unknown>(
104
+ export async function apiPatch<T = any>(
105
105
  url: string,
106
106
  body?: unknown,
107
107
  options?: RequestInit & { autoToast?: boolean },
@@ -124,7 +124,7 @@ export async function apiPatch<T = unknown>(
124
124
  return response.json();
125
125
  }
126
126
 
127
- export async function apiPatchNoThrow<T = unknown>(
127
+ export async function apiPatchNoThrow<T = any>(
128
128
  url: string,
129
129
  body?: unknown,
130
130
  ): Promise<{ ok: boolean; data?: T; error?: string }> {
@@ -139,7 +139,7 @@ export async function apiPatchNoThrow<T = unknown>(
139
139
  return { ok: true, data };
140
140
  }
141
141
 
142
- export async function apiDelete<T = unknown>(
142
+ export async function apiDelete<T = any>(
143
143
  url: string,
144
144
  options?: RequestInit & { autoToast?: boolean },
145
145
  ): Promise<T> {
@@ -216,7 +216,7 @@ export function buildDocumentUrl(
216
216
  return url;
217
217
  }
218
218
 
219
- export async function apiUpload<T = unknown>(
219
+ export async function apiUpload<T = any>(
220
220
  url: string,
221
221
  body: FormData,
222
222
  onProgress?: (percent: number) => void,
@@ -87,6 +87,7 @@ interface AutoFormStore {
87
87
  versions: Version[];
88
88
  loadingVersions: boolean;
89
89
  showPreview: boolean;
90
+ previewUrl: string | null;
90
91
  isMenuOpen: boolean;
91
92
  hasUnsavedChanges: boolean;
92
93
  loadingFields: Record<string, boolean>;
@@ -118,6 +119,7 @@ interface AutoFormStore {
118
119
  setVersions: (versions: Version[]) => void;
119
120
  setLoadingVersions: (loading: boolean) => void;
120
121
  setShowPreview: (show: boolean | ((prev: boolean) => boolean)) => void;
122
+ setPreviewUrl: (url: string | null) => void;
121
123
  setIsMenuOpen: (open: boolean | ((prev: boolean) => boolean)) => void;
122
124
  setHasUnsavedChanges: (hasChanges: boolean) => void;
123
125
  setLoadingFields: (fields: Record<string, boolean> | ((prev: Record<string, boolean>) => Record<string, boolean>)) => void;
@@ -187,6 +189,7 @@ export const useAutoFormStore = create<AutoFormStore>()(
187
189
  versions: [],
188
190
  loadingVersions: false,
189
191
  showPreview: false,
192
+ previewUrl: null,
190
193
  isMenuOpen: false,
191
194
  hasUnsavedChanges: false,
192
195
  loadingFields: {},
@@ -275,6 +278,7 @@ export const useAutoFormStore = create<AutoFormStore>()(
275
278
  showPreview:
276
279
  typeof show === "function" ? show(state.showPreview) : show,
277
280
  })),
281
+ setPreviewUrl: (previewUrl) => set({ previewUrl }),
278
282
  setIsMenuOpen: (open) =>
279
283
  set((state) => ({
280
284
  isMenuOpen: typeof open === "function" ? open(state.isMenuOpen) : open,
@@ -32,15 +32,15 @@ export function deepEqual(obj1: any, obj2: any): boolean {
32
32
  return false;
33
33
  }
34
34
 
35
- const keys1 = Object.keys(obj1);
36
- const keys2 = Object.keys(obj2);
35
+ const keys1 = Object.keys(obj1).filter(k => k !== 'id' && k !== '_key' && k !== '_id');
36
+ const keys2 = Object.keys(obj2).filter(k => k !== 'id' && k !== '_key' && k !== '_id');
37
37
 
38
38
  if (keys1.length !== keys2.length) {
39
39
  return false;
40
40
  }
41
41
 
42
42
  for (const key of keys1) {
43
- if (!Object.prototype.hasOwnProperty.call(obj2, key)) {
43
+ if (!keys2.includes(key)) {
44
44
  return false;
45
45
  }
46
46
  if (!deepEqual(obj1[key], obj2[key])) {
@@ -0,0 +1,44 @@
1
+ import i18n from "i18next";
2
+ import { initReactI18next } from "react-i18next";
3
+ import LanguageDetector from "i18next-browser-languagedetector";
4
+
5
+ // Import translation files
6
+ import translationEN from "../locales/en.json";
7
+ import translationFR from "../locales/fr.json";
8
+ import translationES from "../locales/es.json";
9
+ import translationDE from "../locales/de.json";
10
+ import translationPT from "../locales/pt.json";
11
+
12
+ const resources = {
13
+ en: {
14
+ translation: translationEN,
15
+ },
16
+ fr: {
17
+ translation: translationFR,
18
+ },
19
+ es: {
20
+ translation: translationES,
21
+ },
22
+ de: {
23
+ translation: translationDE,
24
+ },
25
+ pt: {
26
+ translation: translationPT,
27
+ },
28
+ };
29
+
30
+ const defaultLanguage = (typeof window !== 'undefined' && (window as any).KYRO_LANG) ? (window as any).KYRO_LANG : "en";
31
+
32
+ i18n
33
+ .use(LanguageDetector)
34
+ .use(initReactI18next)
35
+ .init({
36
+ resources,
37
+ fallbackLng: defaultLanguage,
38
+ lng: defaultLanguage,
39
+ interpolation: {
40
+ escapeValue: false, // React already escapes values
41
+ },
42
+ });
43
+
44
+ export default i18n;
@@ -29,11 +29,14 @@ export function useSyncExternalStoreShimPlugin(): Plugin {
29
29
  const SHIM_PATHS = new Set([
30
30
  "use-sync-external-store/shim",
31
31
  "use-sync-external-store/shim/index.js",
32
+ "use-sync-external-store",
32
33
  ]);
33
34
 
34
35
  const SHIM_WITH_SELECTOR_PATHS = new Set([
35
36
  "use-sync-external-store/shim/with-selector",
36
37
  "use-sync-external-store/shim/with-selector.js",
38
+ "use-sync-external-store/with-selector",
39
+ "use-sync-external-store/with-selector.js",
37
40
  ]);
38
41
 
39
42
  return {
@@ -0,0 +1,163 @@
1
+ {
2
+ "actions": {
3
+ "cancel": "Abbrechen",
4
+ "create": "{{item}} Erstellen",
5
+ "delete": "Löschen",
6
+ "deleteDocument": "Dokument Löschen",
7
+ "deleteEntry": "Eintrag Löschen",
8
+ "deleting": "Wird gelöscht...",
9
+ "duplicateDocument": "Dokument Duplizieren",
10
+ "duplicating": "Wird dupliziert...",
11
+ "edit": "Bearbeiten",
12
+ "new": "Neu",
13
+ "newDocument": "Neues Dokument",
14
+ "signOut": "Abmelden",
15
+ "view": "Ansehen"
16
+ },
17
+ "common": {
18
+ "na": "k.A.",
19
+ "no": "Nein",
20
+ "yes": "Ja"
21
+ },
22
+ "dashboard": {
23
+ "activeUsers": "Aktive Benutzer",
24
+ "authService": "Authentifizierungsdienst",
25
+ "cloudApi": "Cloud API",
26
+ "contentGrowth": "Inhaltswachstum",
27
+ "contentGrowthDesc": "Übersicht der Dokumentgeschwindigkeit in den letzten 7 Tagen",
28
+ "dbNode": "Datenbankknoten",
29
+ "description": "Alles sieht in Ihrer Kommandozentrale heute großartig aus.",
30
+ "mediaAssets": "Medieninhalte",
31
+ "mediaCdn": "Medien CDN",
32
+ "mediaLibrary": "Mediathek",
33
+ "mediaLibraryDesc": "Verwalten Sie hochauflösende Assets mit unserer flüssigen Galerie.",
34
+ "newAction": "Neues {{item}}",
35
+ "noCollections": "Keine Sammlungen zur Erstellung verfügbar.",
36
+ "openAssets": "Assets Öffnen",
37
+ "quickLinks": "Schnellzugriff",
38
+ "recentActivity": "Letzte Aktivitäten",
39
+ "statusActive": "Aktiv",
40
+ "statusHealthy": "Gesund",
41
+ "statusOptimal": "Optimal",
42
+ "statusSecure": "Sicher",
43
+ "systemHealth": "Systemgesundheit",
44
+ "systemStatus": "Systemstatus",
45
+ "totalContent": "Gesamter Inhalt",
46
+ "viewAuditLogs": "Audit-Protokolle ansehen",
47
+ "welcome": "Willkommen zurück, {{name}}"
48
+ },
49
+ "days": {
50
+ "fri": "Fr",
51
+ "mon": "Mo",
52
+ "sat": "Sa",
53
+ "sun": "So",
54
+ "thu": "Do",
55
+ "tue": "Di",
56
+ "wed": "Mi"
57
+ },
58
+ "detailView": {
59
+ "collections": "Sammlungen",
60
+ "coreConfiguration": "Kernkonfiguration",
61
+ "dateCreated": "Erstellungsdatum",
62
+ "deleteMessage": "Diese Aktion kann nicht rückgängig gemacht werden.",
63
+ "deleteTitle": "{{label}} löschen?",
64
+ "dynamicStatus": "Dynamischer Status",
65
+ "generatingPreview": "Vorschau-URL wird generiert...",
66
+ "globals": "Globale Variablen",
67
+ "justNow": "Gerade eben",
68
+ "lastModified": "Zuletzt Geändert",
69
+ "metadata": "Metadaten",
70
+ "newDocument": "Neues {{label}}",
71
+ "openPreview": "Vorschau in neuem Tab öffnen",
72
+ "publicAt": "Öffentlich um",
73
+ "quickLinks": "Schnellzugriff"
74
+ },
75
+ "listView": {
76
+ "actionsCol": "Aktionen",
77
+ "addFilter": "Filter hinzufügen",
78
+ "advancedFilters": "Erweiterte Filter",
79
+ "clearAll": "Alles löschen",
80
+ "columns": "Spalten",
81
+ "createdCol": "Erstellt",
82
+ "deleteBulkMessage_one": "Sind Sie sicher, dass Sie {{count}} Dokument löschen möchten? Dies kann nicht rückgängig gemacht werden.",
83
+ "deleteBulkMessage_other": "Sind Sie sicher, dass Sie {{count}} Dokumente löschen möchten? Dies kann nicht rückgängig gemacht werden.",
84
+ "deleteBulkTitle": "Dokumente Löschen",
85
+ "deleteMessage": "Sind Sie sicher, dass Sie dieses Dokument löschen möchten? Dies kann nicht rückgängig gemacht werden.",
86
+ "deleteSelected": "Auswahl löschen",
87
+ "deleteTitle": "Dokument löschen",
88
+ "filters": "Filter",
89
+ "getStartedCreate": "Beginnen Sie mit der Erstellung Ihres ersten {{item}}.",
90
+ "lastModifiedCol": "Zuletzt Geändert",
91
+ "noDocuments": "Keine Dokumente gefunden",
92
+ "noFilters": "Keine Filter angewendet. Klicken Sie auf \"Filter hinzufügen\", um einen zu erstellen.",
93
+ "searchPlaceholder": "Suchen...",
94
+ "selectedCount_one": "{{count}} ausgewählt",
95
+ "selectedCount_other": "{{count}} ausgewählt",
96
+ "toggleColumns": "Spalten umschalten",
97
+ "tryAdjustingFilters": "Versuchen Sie, Ihre Filter oder die Suchanfrage anzupassen."
98
+ },
99
+ "login": {
100
+ "confirmPassword": "Passwort bestätigen",
101
+ "createAccount": "Konto erstellen",
102
+ "createAccountDesc": "Erstellen Sie ein Konto, um auf die Verwaltung zuzugreifen",
103
+ "createAdminAccount": "Admin-Konto erstellen",
104
+ "creatingAccount": "Konto wird erstellt...",
105
+ "email": "E-Mail",
106
+ "enterCredentials": "Geben Sie Ihre Anmeldedaten ein, um auf die Verwaltung zuzugreifen",
107
+ "hasAccount": "Haben Sie bereits ein Konto?",
108
+ "noAccount": "Sie haben noch kein Konto?",
109
+ "password": "Passwort",
110
+ "setupAdmin": "Richten Sie Ihr Admin-Konto ein, um loszulegen",
111
+ "signIn": "Anmelden",
112
+ "signInAction": "Anmelden",
113
+ "signingIn": "Wird angemeldet...",
114
+ "signUp": "Registrieren"
115
+ },
116
+ "nav": {
117
+ "content": "Inhalt",
118
+ "dashboard": "Dashboard",
119
+ "developer": "Entwickler",
120
+ "media": "Medien",
121
+ "plugins": "Plugins",
122
+ "resources": "Ressourcen",
123
+ "settings": "Einstellungen",
124
+ "users": "Benutzer"
125
+ },
126
+ "sidebar": {
127
+ "darkMode": "Dunkler Modus",
128
+ "lightMode": "Heller Modus"
129
+ },
130
+ "toast": {
131
+ "accountCreated": "Konto erstellt!",
132
+ "connectionFailed": "Verbindung fehlgeschlagen",
133
+ "copyError": "Fehler beim Kopieren der Dokumentdaten",
134
+ "dataCopied": "Dokumentdaten in die Zwischenablage kopiert",
135
+ "dataPasted": "Dokumentdaten eingefügt",
136
+ "draftSaved": "Entwurf gespeichert",
137
+ "duplicated": "Dokument dupliziert",
138
+ "duplicateError": "Fehler beim Duplizieren des Dokuments",
139
+ "pasteError": "Die Zwischenablage enthält kein gültiges Dokument-JSON",
140
+ "published": "Erfolgreich veröffentlicht",
141
+ "publishError": "Fehler beim Veröffentlichen",
142
+ "saveError": "Fehler beim Speichern der Änderungen",
143
+ "unpublished": "Veröffentlichung rückgängig gemacht",
144
+ "unpublishError": "Fehler beim Rückgängigmachen der Veröffentlichung",
145
+ "updated": "Aktualisiert",
146
+ "welcomeBack": "Willkommen zurück!"
147
+ },
148
+ "userMenu": {
149
+ "account": "Konto",
150
+ "apiExplorer": "API Explorer",
151
+ "apiKeys": "API-Schlüssel",
152
+ "auditLogs": "Audit-Protokolle",
153
+ "developer": "Entwickler",
154
+ "documentation": "Dokumentation",
155
+ "getSupport": "Hilfe erhalten",
156
+ "graphqlPlayground": "GraphQL Playground",
157
+ "permissions": "Berechtigungen",
158
+ "profileSettings": "Profileinstellungen",
159
+ "resources": "Ressourcen",
160
+ "sessions": "Sitzungen",
161
+ "webHooks": "Webhooks"
162
+ }
163
+ }
@@ -0,0 +1,163 @@
1
+ {
2
+ "actions": {
3
+ "cancel": "Cancel",
4
+ "create": "Create {{item}}",
5
+ "delete": "Delete",
6
+ "deleteDocument": "Delete Document",
7
+ "deleteEntry": "Delete Entry",
8
+ "deleting": "Deleting...",
9
+ "duplicateDocument": "Duplicate Document",
10
+ "duplicating": "Duplicating...",
11
+ "edit": "Edit",
12
+ "new": "New",
13
+ "newDocument": "New Document",
14
+ "signOut": "Sign Out",
15
+ "view": "View"
16
+ },
17
+ "common": {
18
+ "na": "N/A",
19
+ "no": "No",
20
+ "yes": "Yes"
21
+ },
22
+ "dashboard": {
23
+ "activeUsers": "Active Users",
24
+ "authService": "Auth Service",
25
+ "cloudApi": "Cloud API",
26
+ "contentGrowth": "Content Growth",
27
+ "contentGrowthDesc": "Snapshot of document velocity over the last 7 days",
28
+ "dbNode": "Database Node",
29
+ "description": "Everything looks great in your command center today.",
30
+ "mediaAssets": "Media Assets",
31
+ "mediaCdn": "Media CDN",
32
+ "mediaLibrary": "Media Library",
33
+ "mediaLibraryDesc": "Manage high-fidelity assets with our liquid masonry gallery.",
34
+ "newAction": "New {{item}}",
35
+ "noCollections": "No collections available for creation.",
36
+ "openAssets": "Open Assets",
37
+ "quickLinks": "Quick Links",
38
+ "recentActivity": "Recent Activity",
39
+ "statusActive": "Active",
40
+ "statusHealthy": "Healthy",
41
+ "statusOptimal": "Optimal",
42
+ "statusSecure": "Secure",
43
+ "systemHealth": "System Health",
44
+ "systemStatus": "System Status",
45
+ "totalContent": "Total Content",
46
+ "viewAuditLogs": "View Audit Logs",
47
+ "welcome": "Welcome back, {{name}}"
48
+ },
49
+ "days": {
50
+ "fri": "Fri",
51
+ "mon": "Mon",
52
+ "sat": "Sat",
53
+ "sun": "Sun",
54
+ "thu": "Thu",
55
+ "tue": "Tue",
56
+ "wed": "Wed"
57
+ },
58
+ "detailView": {
59
+ "collections": "Collections",
60
+ "coreConfiguration": "Core Configuration",
61
+ "dateCreated": "Date Created",
62
+ "deleteMessage": "This action cannot be undone.",
63
+ "deleteTitle": "Delete {{label}}?",
64
+ "dynamicStatus": "Dynamic Status",
65
+ "generatingPreview": "Generating preview URL...",
66
+ "globals": "Globals",
67
+ "justNow": "Just now",
68
+ "lastModified": "Last Modified",
69
+ "metadata": "Metadata",
70
+ "newDocument": "New {{label}}",
71
+ "openPreview": "Open Preview in New Tab",
72
+ "publicAt": "Public At",
73
+ "quickLinks": "Quick Links"
74
+ },
75
+ "listView": {
76
+ "actionsCol": "Actions",
77
+ "addFilter": "Add Filter",
78
+ "advancedFilters": "Advanced Filters",
79
+ "clearAll": "Clear All",
80
+ "columns": "Columns",
81
+ "createdCol": "Created",
82
+ "deleteBulkMessage_one": "Are you sure you want to delete {{count}} document(s)? This cannot be undone.",
83
+ "deleteBulkMessage_other": "Are you sure you want to delete {{count}} document(s)? This cannot be undone.",
84
+ "deleteBulkTitle": "Delete Documents",
85
+ "deleteMessage": "Are you sure you want to delete this document? This cannot be undone.",
86
+ "deleteSelected": "Delete Selected",
87
+ "deleteTitle": "Delete Document",
88
+ "filters": "Filters",
89
+ "getStartedCreate": "Get started by creating your first {{item}}.",
90
+ "lastModifiedCol": "Last Modified",
91
+ "noDocuments": "No documents found",
92
+ "noFilters": "No filters applied. Click \"Add Filter\" to create one.",
93
+ "searchPlaceholder": "Search...",
94
+ "selectedCount_one": "{{count}} selected",
95
+ "selectedCount_other": "{{count}} selected",
96
+ "toggleColumns": "Toggle Columns",
97
+ "tryAdjustingFilters": "Try adjusting your filters or search query."
98
+ },
99
+ "login": {
100
+ "confirmPassword": "Confirm Password",
101
+ "createAccount": "Create Account",
102
+ "createAccountDesc": "Create an account to access the admin",
103
+ "createAdminAccount": "Create Admin Account",
104
+ "creatingAccount": "Creating account...",
105
+ "email": "Email",
106
+ "enterCredentials": "Enter your credentials to access the admin",
107
+ "hasAccount": "Already have an account?",
108
+ "noAccount": "Don't have an account?",
109
+ "password": "Password",
110
+ "setupAdmin": "Set up your admin account to get started",
111
+ "signIn": "Sign In",
112
+ "signInAction": "Sign in",
113
+ "signingIn": "Signing in...",
114
+ "signUp": "Sign up"
115
+ },
116
+ "nav": {
117
+ "dashboard": "Dashboard",
118
+ "media": "Media",
119
+ "users": "Users",
120
+ "plugins": "Plugins",
121
+ "settings": "Settings",
122
+ "content": "Content",
123
+ "developer": "Developer",
124
+ "resources": "Resources"
125
+ },
126
+ "sidebar": {
127
+ "darkMode": "Dark Mode",
128
+ "lightMode": "Light Mode"
129
+ },
130
+ "toast": {
131
+ "accountCreated": "Account created!",
132
+ "connectionFailed": "Connection failed",
133
+ "copyError": "Failed to copy document data",
134
+ "dataCopied": "Document data copied to clipboard",
135
+ "dataPasted": "Document data pasted",
136
+ "draftSaved": "Draft saved",
137
+ "duplicated": "Document duplicated",
138
+ "duplicateError": "Failed to duplicate document",
139
+ "pasteError": "Clipboard does not contain valid document JSON",
140
+ "published": "Published successfully",
141
+ "publishError": "Failed to publish",
142
+ "saveError": "Failed to save changes",
143
+ "unpublished": "Document unpublished",
144
+ "unpublishError": "Failed to unpublish",
145
+ "updated": "Updated",
146
+ "welcomeBack": "Welcome back!"
147
+ },
148
+ "userMenu": {
149
+ "account": "Account",
150
+ "apiExplorer": "API Explorer",
151
+ "apiKeys": "API Keys",
152
+ "auditLogs": "Audit Logs",
153
+ "developer": "Developer",
154
+ "documentation": "Documentation",
155
+ "getSupport": "Get Support",
156
+ "graphqlPlayground": "GraphQL Playground",
157
+ "permissions": "Permissions",
158
+ "profileSettings": "Profile Settings",
159
+ "resources": "Resources",
160
+ "sessions": "Sessions",
161
+ "webHooks": "Web Hooks"
162
+ }
163
+ }