@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.
- package/dist/index.cjs +64 -26
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +64 -26
- package/package.json +8 -2
- package/src/components/ActionBar.tsx +16 -16
- package/src/components/ApiHealth.tsx +522 -0
- package/src/components/ApiKeysManager.tsx +6 -4
- package/src/components/AuditLogsPage.tsx +4 -2
- package/src/components/AutoForm.tsx +10 -7
- package/src/components/BrandingHub.tsx +3 -1
- package/src/components/Dashboard.tsx +44 -37
- package/src/components/DashboardMetrics.tsx +168 -58
- package/src/components/DetailView.tsx +125 -50
- package/src/components/DeveloperCenter.tsx +5 -3
- package/src/components/GraphQLPlayground.tsx +10 -8
- package/src/components/ListView.tsx +66 -45
- package/src/components/LoginPage.tsx +21 -19
- package/src/components/MarketplaceManager.tsx +3 -1
- package/src/components/MediaGallery.tsx +12 -9
- package/src/components/PluginsManager.tsx +6 -4
- package/src/components/RestPlayground.tsx +8 -6
- package/src/components/SessionsManager.tsx +3 -1
- package/src/components/Sidebar.astro +180 -92
- package/src/components/UserManagement.tsx +8 -6
- package/src/components/UserMenu.tsx +19 -17
- package/src/components/VersionHistoryPanel.tsx +6 -4
- package/src/components/WebhookManager.tsx +143 -15
- package/src/components/autoform/AutoFormApiView.tsx +3 -1
- package/src/components/autoform/AutoFormEditView.tsx +5 -3
- package/src/components/autoform/AutoFormHeader.tsx +6 -6
- package/src/components/blocks/AccordionBlock.tsx +5 -3
- package/src/components/blocks/ArrayBlock.tsx +5 -3
- package/src/components/blocks/BlockWrapper.tsx +5 -3
- package/src/components/blocks/CodeBlock.tsx +4 -2
- package/src/components/blocks/FileBlock.tsx +5 -3
- package/src/components/blocks/HeroBlock.tsx +5 -3
- package/src/components/blocks/ImageBlock.tsx +6 -4
- package/src/components/blocks/ListBlock.tsx +5 -3
- package/src/components/blocks/ParagraphBlock.tsx +3 -1
- package/src/components/blocks/RelationshipBlock.tsx +5 -3
- package/src/components/blocks/RichTextBlock.tsx +5 -3
- package/src/components/blocks/VideoBlock.tsx +5 -3
- package/src/components/fields/AccordionField.tsx +10 -51
- package/src/components/fields/ArrayField.tsx +9 -7
- package/src/components/fields/ArrayLayout.tsx +3 -1
- package/src/components/fields/BlocksField.tsx +24 -75
- package/src/components/fields/ButtonField.tsx +3 -1
- package/src/components/fields/CardField.tsx +6 -4
- package/src/components/fields/GroupLayout.tsx +2 -49
- package/src/components/fields/HeadingField.tsx +3 -1
- package/src/components/fields/HeadingSubheadingField.tsx +4 -2
- package/src/components/fields/HeroField.tsx +8 -6
- package/src/components/fields/JSONField.tsx +9 -10
- package/src/components/fields/LinkField.tsx +4 -2
- package/src/components/fields/ListField.tsx +3 -1
- package/src/components/fields/MarkdownField.tsx +3 -17
- package/src/components/fields/RelationshipBlockField.tsx +7 -5
- package/src/components/fields/RelationshipField.tsx +3 -1
- package/src/components/fields/RichTextField.tsx +19 -16
- package/src/components/fields/SecretField.tsx +9 -69
- package/src/components/fields/SelectField.tsx +11 -6
- package/src/components/fields/TabsLayout.tsx +2 -48
- package/src/components/fields/TextField.tsx +9 -7
- package/src/components/fields/UploadField.tsx +3 -1
- package/src/components/fields/VideoField.tsx +6 -4
- package/src/components/ui/BlockDrawer.tsx +3 -1
- package/src/components/ui/CommandPalette.tsx +9 -7
- package/src/components/ui/CommandPaletteWrapper.tsx +3 -1
- package/src/components/ui/IconPickerModal.tsx +4 -2
- package/src/components/ui/PageHeader.tsx +48 -20
- package/src/components/users/UserDetail.tsx +3 -1
- package/src/components/users/UserForm.tsx +5 -3
- package/src/fields/examples/sample-field-2.tsx +3 -1
- package/src/fields/examples/sample-field.tsx +3 -1
- package/src/hooks/useAutoFormState.ts +19 -11
- package/src/integration.ts +21 -0
- package/src/layouts/AdminLayout.astro +252 -189
- package/src/layouts/AuthLayout.astro +52 -31
- package/src/lib/api.ts +7 -7
- package/src/lib/autoform-store.ts +4 -0
- package/src/lib/deep-equal.ts +3 -3
- package/src/lib/i18n.ts +44 -0
- package/src/lib/vite-shim-plugin.ts +3 -0
- package/src/locales/de.json +163 -0
- package/src/locales/en.json +163 -0
- package/src/locales/es.json +163 -0
- package/src/locales/fr.json +163 -0
- package/src/locales/pt.json +163 -0
- package/src/pages/403.astro +2 -1
- package/src/pages/[collection]/[id].astro +23 -10
- package/src/pages/[collection]/index.astro +48 -34
- package/src/pages/audit/index.astro +2 -1
- package/src/pages/graphql-explorer.astro +2 -1
- package/src/pages/graphql.astro +2 -1
- package/src/pages/health.astro +9 -0
- package/src/pages/index.astro +6 -5
- package/src/pages/keys.astro +2 -1
- package/src/pages/marketplace.astro +2 -1
- package/src/pages/media.astro +2 -1
- package/src/pages/plugins.astro +2 -1
- package/src/pages/rest-playground.astro +2 -1
- package/src/pages/roles/index.astro +16 -52
- package/src/pages/sessions.astro +2 -1
- package/src/pages/settings/[slug].astro +45 -30
- package/src/pages/users/[id].astro +1 -0
- package/src/pages/users/index.astro +2 -1
- package/src/pages/users/new.astro +2 -1
- package/src/pages/webhooks.astro +2 -1
- 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
|
|
18
|
-
const
|
|
19
|
-
const
|
|
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=
|
|
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
|
-
<
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
|
100
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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,
|
package/src/lib/deep-equal.ts
CHANGED
|
@@ -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 (!
|
|
43
|
+
if (!keys2.includes(key)) {
|
|
44
44
|
return false;
|
|
45
45
|
}
|
|
46
46
|
if (!deepEqual(obj1[key], obj2[key])) {
|
package/src/lib/i18n.ts
ADDED
|
@@ -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
|
+
}
|