@saasicat/ui-vue 0.5.0 → 0.7.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.
- package/README.md +17 -0
- package/dist/{chunk-EH7TOD4H.js → chunk-A3W2N26K.js} +73 -77
- package/dist/{chunk-3YP2ZAOD.js → chunk-QZOSDCNP.js} +36 -1
- package/dist/chunk-X5SQ5HMB.js +3231 -0
- package/dist/client/index.cjs +3279 -76
- package/dist/client/index.d.cts +31 -5
- package/dist/client/index.d.ts +31 -5
- package/dist/client/index.js +23 -5
- package/dist/index.cjs +3709 -465
- package/dist/index.d.cts +37 -54
- package/dist/index.d.ts +37 -54
- package/dist/index.js +347 -311
- package/dist/messages-7b0P8W75.d.cts +1652 -0
- package/dist/messages-7b0P8W75.d.ts +1652 -0
- package/dist/quasar/index.cjs +3185 -4
- package/dist/quasar/index.d.cts +11 -2
- package/dist/quasar/index.d.ts +11 -2
- package/dist/quasar/index.js +8 -3
- package/dist/testing-e2e/admin-pages-suite.cjs +14 -11
- package/dist/testing-e2e/admin-pages-suite.js +14 -11
- package/dist/{ui-notify-COUzXEQ4.d.ts → use-super-admin-i18n-B3v3-SWZ.d.ts} +35 -3
- package/dist/{ui-notify-D_eAAwRh.d.cts → use-super-admin-i18n-DMktRVEt.d.cts} +35 -3
- package/package.json +2 -2
- package/src/client/action-registry.ts +4 -4
- package/src/client/batch-column-fetcher.ts +4 -4
- package/src/client/boot-loader.ts +3 -3
- package/src/client/i18n/currency.ts +42 -0
- package/src/client/i18n/define.ts +59 -0
- package/src/client/i18n/format.ts +12 -0
- package/src/client/i18n/index.ts +14 -0
- package/src/client/i18n/locale.ts +15 -0
- package/src/client/i18n/messages/audit.ts +42 -0
- package/src/client/i18n/messages/bundles.ts +459 -0
- package/src/client/i18n/messages/common.ts +147 -0
- package/src/client/i18n/messages/dashboard.ts +16 -0
- package/src/client/i18n/messages/discovery.ts +229 -0
- package/src/client/i18n/messages/email.ts +125 -0
- package/src/client/i18n/messages/marketing.ts +270 -0
- package/src/client/i18n/messages/nav.ts +72 -0
- package/src/client/i18n/messages/pilots.ts +192 -0
- package/src/client/i18n/messages/plan-detail.ts +266 -0
- package/src/client/i18n/messages/plan-editor.ts +177 -0
- package/src/client/i18n/messages/plan-versions.ts +251 -0
- package/src/client/i18n/messages/plans.ts +503 -0
- package/src/client/i18n/messages/promos.ts +202 -0
- package/src/client/i18n/messages/shell.ts +145 -0
- package/src/client/i18n/messages/tenants.ts +104 -0
- package/src/client/i18n/messages/users.ts +78 -0
- package/src/client/i18n/messages.ts +84 -0
- package/src/client/index.ts +2 -0
- package/src/client/manifest-loader.ts +4 -4
- package/src/client/nav-builder.ts +44 -51
- package/src/client/plan-versions-catalog.ts +42 -30
- package/src/components/BundleVersionPublishDialog.vue +35 -24
- package/src/components/MarketingPromotionsTab.vue +112 -59
- package/src/components/MfaPromptDialog.vue +11 -11
- package/src/components/TenantActionConfirmDialog.vue +19 -17
- package/src/components/VersionDiffPreview.vue +72 -43
- package/src/components/bundle-editor/BundleCreatePanel.vue +76 -63
- package/src/components/bundle-editor/BundleFeaturesEditor.vue +13 -6
- package/src/components/bundle-editor/BundlePlanCompatPicker.vue +19 -14
- package/src/components/bundle-editor/BundleQuotasEditor.vue +7 -4
- package/src/components/bundle-editor/BundleStatusBanner.vue +36 -19
- package/src/components/bundle-editor/BundleVersionInlineEditor.vue +51 -35
- package/src/components/bundle-editor/BundleVersionStrip.vue +24 -12
- package/src/components/bundle-editor/bundle-version-status.ts +29 -29
- package/src/components/dialogs/PilotCreateDialog.vue +58 -63
- package/src/components/dialogs/PilotEditDialog.vue +40 -34
- package/src/components/dialogs/PromoCodeCreateDialog.vue +89 -63
- package/src/components/dialogs/PromoCodeEditDialog.vue +98 -66
- package/src/components/dialogs/types.ts +3 -13
- package/src/components/plan/PlanCycleToggle.vue +20 -9
- package/src/components/plan-cockpit/PlanCockpit.vue +34 -15
- package/src/components/plan-cockpit/PlanCockpitAuditLog.vue +13 -6
- package/src/components/plan-cockpit/PlanCockpitDiffPanel.vue +18 -9
- package/src/components/plan-cockpit/PlanCockpitHeader.vue +9 -6
- package/src/components/plan-cockpit/PlanCockpitImpactPanel.vue +24 -11
- package/src/components/plan-cockpit/PlanCockpitKpis.vue +28 -17
- package/src/components/plan-cockpit/PlanCockpitVersions.vue +50 -25
- package/src/components/plan-create-dialog/PlanCreateDialog.vue +45 -35
- package/src/components/plan-detail/PlanAuditLog.vue +11 -6
- package/src/components/plan-detail/PlanDetail.vue +21 -23
- package/src/components/plan-detail/PlanDetailHeader.vue +20 -11
- package/src/components/plan-detail/PlanDetailKpis.vue +30 -17
- package/src/components/plan-detail/PlanTerminateDialog.vue +22 -9
- package/src/components/plan-detail/PlanVersionDiffPanel.vue +61 -27
- package/src/components/plan-detail/PlanVersionsPanel.vue +71 -36
- package/src/components/plan-list/PlanList.vue +99 -57
- package/src/components/plan-matrix/PlanMatrix.vue +85 -38
- package/src/components/plan-review/PlanReview.vue +105 -80
- package/src/components/plan-version-editor/PlanCatalogPreview.vue +43 -20
- package/src/components/plan-version-editor/PlanComponentPool.vue +15 -7
- package/src/components/plan-version-editor/PlanVersionBasket.vue +45 -24
- package/src/components/plan-version-editor/PlanVersionDiffDialog.vue +8 -7
- package/src/components/plan-version-editor/PlanVersionEditor.vue +74 -40
- package/src/components/plan-version-editor/PlanVersionEditorHeader.vue +24 -12
- package/src/index.ts +1 -1
- package/src/pages-standard/AdminLayout.vue +42 -17
- package/src/pages-standard/AdminManifestErrorPage.vue +10 -10
- package/src/pages-standard/AuditPage.vue +58 -19
- package/src/pages-standard/BundlesPage.vue +29 -18
- package/src/pages-standard/DashboardPage.vue +29 -15
- package/src/pages-standard/DiscoveryPage.vue +40 -28
- package/src/pages-standard/EmailHistoryPage.vue +92 -59
- package/src/pages-standard/MarketingCatalogPage.vue +35 -16
- package/src/pages-standard/PilotsPage.vue +57 -41
- package/src/pages-standard/PlanVersionsPage.vue +7 -3
- package/src/pages-standard/PlansPage.vue +89 -57
- package/src/pages-standard/PlatformEmailPage.vue +115 -50
- package/src/pages-standard/PromoCodeDetailPage.vue +66 -63
- package/src/pages-standard/PromoCodesPage.vue +46 -35
- package/src/pages-standard/SubscriptionsPage.vue +14 -9
- package/src/pages-standard/SuperAdminLoginPage.vue +16 -13
- package/src/pages-standard/SuperAdminSetupWizard.vue +51 -47
- package/src/pages-standard/TenantDetailPage.vue +50 -36
- package/src/pages-standard/TenantsPage.vue +54 -41
- package/src/pages-standard/UsersPage.vue +66 -42
- package/src/pages-standard/bundles-page/BundleAccordionList.vue +20 -8
- package/src/pages-standard/bundles-page/BundleDetailPanel.vue +28 -18
- package/src/pages-standard/bundles-page/BundlesFilterBar.vue +4 -1
- package/src/pages-standard/bundles-page/BundlesHeader.vue +9 -8
- package/src/pages-standard/bundles-page/BundlesKpis.vue +29 -11
- package/src/pages-standard/discovery-page/CatalogEntryTransPanel.vue +20 -8
- package/src/pages-standard/discovery-page/DiscoveryCapList.vue +5 -3
- package/src/pages-standard/discovery-page/DiscoveryFeatureCard.vue +43 -24
- package/src/pages-standard/discovery-page/DiscoveryHeader.vue +7 -4
- package/src/pages-standard/discovery-page/DiscoveryKpis.vue +28 -15
- package/src/pages-standard/discovery-page/DiscoveryQuotaCard.vue +20 -10
- package/src/pages-standard/discovery-page/DiscoveryStatusControl.vue +9 -6
- package/src/pages-standard/discovery-page/discovery-ui.ts +40 -52
- package/src/pages-standard/marketing-catalog/MarketingCatalogAdmin.vue +81 -49
- package/src/pages-standard/marketing-catalog/MarketingCatalogHeader.vue +13 -10
- package/src/pages-standard/marketing-catalog/MarketingCatalogPreview.vue +24 -20
- package/src/pages-standard/marketing-catalog/MarketingCatalogToolbar.vue +6 -3
- package/src/pages-standard/plan-versions/PlanDiffCard.vue +16 -6
- package/src/pages-standard/plan-versions/PlanVersionHeader.vue +41 -25
- package/src/pages-standard/plan-versions/PlanVersionsAudit.vue +45 -26
- package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +7 -5
- package/src/pages-standard/plan-versions/PlanVersionsList.vue +39 -16
- package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +24 -12
- package/src/pages-standard/plan-versions/format.ts +33 -17
- package/src/pages-standard/plans-page/PlanArchiveDialog.vue +12 -8
- package/src/pages-standard/plans-page/PlanBundleOverview.vue +15 -6
- package/src/pages-standard/plans-page/PlanDiscardDraftDialog.vue +18 -7
- package/src/pages-standard/plans-page/PlanPublishDialog.vue +23 -12
- package/src/pages-standard/tenants/format.ts +3 -2
- package/src/pages-tenant/MySubscriptionBundlesPage.vue +72 -37
- package/src/pages-tenant/PlanChangeWizard.vue +8 -4
- package/src/pages-tenant/TenantPlanSection.vue +17 -13
- package/src/pages-tenant/default-i18n.ts +217 -1
- package/src/pages-tenant/tenant-plan-section/BundlePreviewDialog.vue +8 -6
- package/src/pages-tenant/tenant-plan-section/TenantBundleStore.vue +9 -10
- package/src/pages-tenant/tenant-plan-section/TenantFeatureMatrix.vue +4 -1
- package/src/quasar/create-super-admin-app.ts +19 -0
- package/src/testing-e2e/admin-pages-suite.ts +14 -11
- package/src/vue/project-page-host.ts +5 -3
- package/src/vue/use-audit-entries.ts +3 -3
- package/src/vue/use-bulk-publish.ts +6 -4
- package/src/vue/use-bundle-versions-map.ts +6 -4
- package/src/vue/use-bundles.ts +13 -13
- package/src/vue/use-catalog-entries.ts +13 -10
- package/src/vue/use-discovery.ts +8 -5
- package/src/vue/use-entitlement.ts +3 -3
- package/src/vue/use-live-plan-versions.ts +4 -4
- package/src/vue/use-marketing-projections.ts +9 -6
- package/src/vue/use-nav.ts +8 -2
- package/src/vue/use-plan-editor.ts +2 -2
- package/src/vue/use-plan-versions.ts +3 -3
- package/src/vue/use-plans.ts +12 -12
- package/src/vue/use-platform-tenant-actions.ts +9 -6
- package/src/vue/use-promotions.ts +9 -10
- package/src/vue/use-subscription-draft.ts +2 -3
- package/src/vue/use-super-admin-context.ts +3 -3
- package/src/vue/use-super-admin-i18n.ts +82 -0
- package/src/vue/use-tenant-action-flow.ts +11 -6
- package/src/vue/use-tenant-manifest.ts +1 -3
- package/src/vue/use-tenant-subscription-bundles.ts +4 -4
- package/src/vue/use-tenants.ts +3 -3
- package/dist/action-registry-CQ2wL3R-.d.cts +0 -85
- package/dist/action-registry-CQ2wL3R-.d.ts +0 -85
- package/dist/chunk-LVGUSD3T.js +0 -26
- package/src/components/BusinessTypeVersionEditorDialog.vue +0 -417
- package/src/components/BusinessTypeVersionPublishDialog.vue +0 -258
- package/src/pages-standard/BusinessTypesPage.vue +0 -662
- package/src/pages-standard/plan-versions/VersionDiffPreview.vue +0 -167
- package/src/vue/use-business-types.ts +0 -269
|
@@ -0,0 +1,3231 @@
|
|
|
1
|
+
// src/client/types.ts
|
|
2
|
+
function defaultKvStore() {
|
|
3
|
+
if (typeof globalThis.localStorage === "undefined") {
|
|
4
|
+
return {
|
|
5
|
+
get: () => null,
|
|
6
|
+
set: () => {
|
|
7
|
+
},
|
|
8
|
+
remove: () => {
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
const ls = globalThis.localStorage;
|
|
13
|
+
return {
|
|
14
|
+
get: (k) => ls.getItem(k),
|
|
15
|
+
set: (k, v) => ls.setItem(k, v),
|
|
16
|
+
remove: (k) => ls.removeItem(k)
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function defaultHttpClient() {
|
|
20
|
+
return (url, init) => fetch(url, init);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// src/client/i18n/locale.ts
|
|
24
|
+
var SA_LOCALES = ["de", "en"];
|
|
25
|
+
var DEFAULT_SA_LOCALE = "de";
|
|
26
|
+
var SA_INTL_LOCALES = {
|
|
27
|
+
de: "de-DE",
|
|
28
|
+
en: "en-US"
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// src/client/i18n/define.ts
|
|
32
|
+
function defineMessages(de, en) {
|
|
33
|
+
return { de, en };
|
|
34
|
+
}
|
|
35
|
+
function mergeMessages(base, overrides) {
|
|
36
|
+
if (!overrides) return base;
|
|
37
|
+
const result = {};
|
|
38
|
+
for (const [key, baseValue] of Object.entries(base)) {
|
|
39
|
+
const override = overrides[key];
|
|
40
|
+
if (typeof baseValue === "string") {
|
|
41
|
+
result[key] = typeof override === "string" ? override : baseValue;
|
|
42
|
+
} else {
|
|
43
|
+
result[key] = mergeMessages(
|
|
44
|
+
baseValue,
|
|
45
|
+
override
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// src/client/i18n/format.ts
|
|
53
|
+
function formatMessage(template, params) {
|
|
54
|
+
return template.replace(/\{(\w+)\}/g, (match, name) => {
|
|
55
|
+
const value = params[name];
|
|
56
|
+
return value === void 0 ? match : String(value);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// src/client/i18n/currency.ts
|
|
61
|
+
var DEFAULT_CURRENCY = "EUR";
|
|
62
|
+
var formatters = /* @__PURE__ */ new Map();
|
|
63
|
+
function formatterFor(locale, currency, decimals) {
|
|
64
|
+
const key = `${locale}:${currency}:${decimals}`;
|
|
65
|
+
let formatter = formatters.get(key);
|
|
66
|
+
if (!formatter) {
|
|
67
|
+
formatter = new Intl.NumberFormat(SA_INTL_LOCALES[locale], {
|
|
68
|
+
style: "currency",
|
|
69
|
+
currency,
|
|
70
|
+
minimumFractionDigits: decimals,
|
|
71
|
+
maximumFractionDigits: decimals
|
|
72
|
+
});
|
|
73
|
+
formatters.set(key, formatter);
|
|
74
|
+
}
|
|
75
|
+
return formatter;
|
|
76
|
+
}
|
|
77
|
+
function formatCurrency(amount, locale = DEFAULT_SA_LOCALE, currency = DEFAULT_CURRENCY) {
|
|
78
|
+
const value = typeof amount === "string" ? Number(amount) : amount;
|
|
79
|
+
if (value === null || value === void 0 || !Number.isFinite(value)) return "\u2014";
|
|
80
|
+
return formatterFor(locale, currency, Number.isInteger(value) ? 0 : 2).format(value);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// src/client/i18n/messages/audit.ts
|
|
84
|
+
var auditMessages = defineMessages(
|
|
85
|
+
{
|
|
86
|
+
title: "Audit-Trail",
|
|
87
|
+
subtitle: "{count} Eintr\xE4ge \xB7 plattformweit.",
|
|
88
|
+
filterButton: "Filtern",
|
|
89
|
+
detailActorPrefix: "Actor:",
|
|
90
|
+
filters: {
|
|
91
|
+
actor: "Actor (E-Mail)",
|
|
92
|
+
action: "Action",
|
|
93
|
+
entity: "Entity",
|
|
94
|
+
since: "Seit"
|
|
95
|
+
},
|
|
96
|
+
columns: {
|
|
97
|
+
time: "Zeit",
|
|
98
|
+
actor: "Actor",
|
|
99
|
+
action: "Action",
|
|
100
|
+
entity: "Entity",
|
|
101
|
+
id: "ID"
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
title: "Audit trail",
|
|
106
|
+
subtitle: "{count} entries \xB7 platform-wide.",
|
|
107
|
+
filterButton: "Filter",
|
|
108
|
+
detailActorPrefix: "Actor:",
|
|
109
|
+
filters: {
|
|
110
|
+
actor: "Actor (email)",
|
|
111
|
+
action: "Action",
|
|
112
|
+
entity: "Entity",
|
|
113
|
+
since: "Since"
|
|
114
|
+
},
|
|
115
|
+
columns: {
|
|
116
|
+
time: "Time",
|
|
117
|
+
actor: "Actor",
|
|
118
|
+
action: "Action",
|
|
119
|
+
entity: "Entity",
|
|
120
|
+
id: "ID"
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
// src/client/i18n/messages/bundles.ts
|
|
126
|
+
var bundlesMessages = defineMessages(
|
|
127
|
+
{
|
|
128
|
+
// Field labels and units shared by the create panel, the inline editor
|
|
129
|
+
// and the publish dialog.
|
|
130
|
+
fields: {
|
|
131
|
+
masterData: "Stammdaten",
|
|
132
|
+
label: "Label",
|
|
133
|
+
quotas: "Quotas",
|
|
134
|
+
monthlyPrice: "Monatspreis",
|
|
135
|
+
yearlyPrice: "Jahrespreis",
|
|
136
|
+
perMonthUnit: "\u20AC/Mo",
|
|
137
|
+
perYearUnit: "\u20AC/Jahr",
|
|
138
|
+
validFrom: "G\xFCltig ab",
|
|
139
|
+
validUntil: "G\xFCltig bis",
|
|
140
|
+
validUntilOpen: "offen",
|
|
141
|
+
planCompat: "Kompatibel mit Pl\xE4nen"
|
|
142
|
+
},
|
|
143
|
+
validation: {
|
|
144
|
+
validFromRequired: "G\xFCltig ab ist Pflicht.",
|
|
145
|
+
validUntilAfterValidFrom: "G\xFCltig bis muss nach G\xFCltig ab liegen.",
|
|
146
|
+
monthlyPriceFormat: "Monatspreis: Dezimal mit max. 2 Nachkommastellen.",
|
|
147
|
+
yearlyPriceFormat: "Jahrespreis: Dezimal mit max. 2 Nachkommastellen."
|
|
148
|
+
},
|
|
149
|
+
// BundlesPage — banners, confirms and toasts of the page shell.
|
|
150
|
+
page: {
|
|
151
|
+
loadError: "Fehler beim Laden: {message}",
|
|
152
|
+
emptyBefore: "Noch keine Bundles angelegt. \xDCber",
|
|
153
|
+
emptyAfter: "einen Bundle-Stamm anlegen, dann Features & Quotas in einer Draft-Version kuratieren.",
|
|
154
|
+
strictWarnings: "{count} Strict-Mode-Warnung(en) bei letzter Operation",
|
|
155
|
+
confirmSoftDelete: "Bundle '{bundleKey}' wirklich soft-deleten? Bestand bleibt durch published BundleVersions gesch\xFCtzt.",
|
|
156
|
+
confirmDiscardVersion: "Diese Draft-Version verwerfen? Der Inhalt geht verloren."
|
|
157
|
+
},
|
|
158
|
+
header: {
|
|
159
|
+
title: "Bundles",
|
|
160
|
+
subtitle: "Produktgruppen aus Features & Quotas \u2014 verwendet in Pl\xE4nen. Bundles werden im SuperAdmin kuratiert.",
|
|
161
|
+
displayLocale: "Anzeige-Sprache",
|
|
162
|
+
newBundle: "Neues Bundle",
|
|
163
|
+
reload: "Liste neu laden"
|
|
164
|
+
},
|
|
165
|
+
filter: {
|
|
166
|
+
all: "Alle Status",
|
|
167
|
+
live: "Nur Live",
|
|
168
|
+
scheduled: "Mit geplanter Version",
|
|
169
|
+
draft: "Drafts",
|
|
170
|
+
superseded: "Abgel\xF6ste",
|
|
171
|
+
retired: "Retired"
|
|
172
|
+
},
|
|
173
|
+
kpis: {
|
|
174
|
+
total: "Bundles gesamt",
|
|
175
|
+
totalSub: "{live} live \xB7 {scheduled} mit geplanter Version",
|
|
176
|
+
scheduled: "Geplante Versionen",
|
|
177
|
+
scheduledSub: "zuk\xFCnftig aktiv \xB7 noch nicht verkaufbar",
|
|
178
|
+
drafts: "Offene Drafts",
|
|
179
|
+
draftsSub: "{count} Bundle(s) ohne Publish",
|
|
180
|
+
translated: "Mit \xDCbersetzung",
|
|
181
|
+
translatedSub: "{count} aktive Sprache(n) im Projekt"
|
|
182
|
+
},
|
|
183
|
+
list: {
|
|
184
|
+
translationCount: "{count} \xDCbersetzung(en)",
|
|
185
|
+
emptyNoMatch: "Keine Bundles entsprechen der Suche."
|
|
186
|
+
},
|
|
187
|
+
// Lifecycle status of a BundleVersion / of a bundle stem.
|
|
188
|
+
status: {
|
|
189
|
+
draft: {
|
|
190
|
+
label: "Draft",
|
|
191
|
+
tooltip: "Noch nicht ver\xF6ffentlicht \u2014 frei editierbar"
|
|
192
|
+
},
|
|
193
|
+
live: {
|
|
194
|
+
label: "Live",
|
|
195
|
+
tooltip: "Aktive Version \xB7 verkaufbar \xB7 read-only (laufende Vertr\xE4ge)"
|
|
196
|
+
},
|
|
197
|
+
scheduled: {
|
|
198
|
+
label: "Geplant",
|
|
199
|
+
tooltip: "Zuk\xFCnftig aktiv \xB7 noch nicht verkaufbar \xB7 frei editierbar"
|
|
200
|
+
},
|
|
201
|
+
superseded: {
|
|
202
|
+
label: "Abgel\xF6st",
|
|
203
|
+
tooltip: "Durch neue Version ersetzt \xB7 Bestand bleibt"
|
|
204
|
+
},
|
|
205
|
+
retired: {
|
|
206
|
+
label: "Retired",
|
|
207
|
+
tooltip: "Bundle-Stamm wurde soft-deleted"
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
// BundleDetailPanel — master data + translations of the open bundle.
|
|
211
|
+
detail: {
|
|
212
|
+
translations: "\xDCbersetzungen",
|
|
213
|
+
languageCount: "{count} Sprache(n)",
|
|
214
|
+
noTranslatableLocales: "Keine weiteren Sprachen aktiv \u2014 werden im Marketing-Catalog aktiviert.",
|
|
215
|
+
fallbackFromDe: "Fallback aus DE",
|
|
216
|
+
labelPlaceholder: "Label (Fallback: \u201E{label}\u201C)",
|
|
217
|
+
descriptionPlaceholder: "Beschreibung (Fallback aus DE)",
|
|
218
|
+
save: "Stammdaten & \xDCbersetzungen speichern",
|
|
219
|
+
noVersion: "Noch keine Version. Lege eine neue Version an, um Features, Quotas & Pricing zu kuratieren.",
|
|
220
|
+
publishVersion: "Diese Version publishen",
|
|
221
|
+
softDelete: "Bundle soft-deleten"
|
|
222
|
+
},
|
|
223
|
+
// BundleCreatePanel — inline wizard for a new bundle (root + v1 draft).
|
|
224
|
+
create: {
|
|
225
|
+
title: "Neues Bundle anlegen",
|
|
226
|
+
subtitle: "Features & Quotas zu einem Add-On b\xFCndeln \u2014 bepreist und kompatibel mit ausgew\xE4hlten Pl\xE4nen.",
|
|
227
|
+
masterDataHint: "Sichtbarer Name + technischer Key.",
|
|
228
|
+
labelPlaceholder: "z. B. Communication Pro",
|
|
229
|
+
bundleKey: "Bundle-Key",
|
|
230
|
+
bundleKeyHint: "API-stabil \xB7 wird aus dem Label erzeugt",
|
|
231
|
+
errorKeyFormat: "Nur A-Z, 0-9, Underscore; muss mit Buchstabe beginnen.",
|
|
232
|
+
errorKeyExists: "Dieser Bundle-Key existiert bereits.",
|
|
233
|
+
descriptionPlaceholder: "z. B. Kampagnen, WhatsApp und Korrespondenz f\xFCr aktive Vereine.",
|
|
234
|
+
sectionPricing: "v1 \xB7 Pricing & G\xFCltigkeit",
|
|
235
|
+
pricingHint: "Monats- & Jahrespreis sowie Datum, ab dem das Bundle verkaufbar wird.",
|
|
236
|
+
validFromImmediate: "\u2713 Bundle ist nach Anlage sofort live und verkaufbar.",
|
|
237
|
+
validFromScheduled: "\u23F3 Geplant \u2014 wird ab {date} verkaufbar.",
|
|
238
|
+
validFromHint: "Pflicht beim Publish \u2014 kann auch nach Anlage gesetzt werden.",
|
|
239
|
+
planCompatHint: "Mit welchen Pl\xE4nen darf dieses Bundle als Add-On gebucht werden? \xDCberschneidungen werden direkt markiert.",
|
|
240
|
+
sectionFeatures: "Features im Bundle",
|
|
241
|
+
selectedOfTotal: "{selected} von {total} ausgew\xE4hlt",
|
|
242
|
+
quotasOptional: "optional",
|
|
243
|
+
quotasHint: "Quotas, die das Bundle on top des Plans setzt.",
|
|
244
|
+
overlapWarningOne: "\u26A0 \xDCberschneidung mit {count} Plan \u2014 bitte pr\xFCfen",
|
|
245
|
+
overlapWarningMany: "\u26A0 \xDCberschneidung mit {count} Pl\xE4nen \u2014 bitte pr\xFCfen",
|
|
246
|
+
summaryFeatureOne: "Feature",
|
|
247
|
+
summaryFeatureMany: "Features",
|
|
248
|
+
summaryQuotaOne: "Quota",
|
|
249
|
+
summaryQuotaMany: "Quotas",
|
|
250
|
+
summaryPlanCompat: "Plan-Kompat.",
|
|
251
|
+
submitting: "Lege an \u2026",
|
|
252
|
+
submit: "Bundle anlegen"
|
|
253
|
+
},
|
|
254
|
+
// BundleVersionStrip — tab bar across all versions of a bundle.
|
|
255
|
+
versionStrip: {
|
|
256
|
+
label: "Versionen",
|
|
257
|
+
perMonth: "/ Mo",
|
|
258
|
+
addVersion: "Neue Version",
|
|
259
|
+
addTooltip: "Neue, zuk\xFCnftige Version anlegen",
|
|
260
|
+
addDisabledTooltip: "Bundle hat bereits eine Draft-Version \u2014 erst publishen oder verwerfen"
|
|
261
|
+
},
|
|
262
|
+
// BundleStatusBanner — one sentence per lifecycle status; the version
|
|
263
|
+
// number and the status word stay bold in the markup, so the sentence
|
|
264
|
+
// is split around them.
|
|
265
|
+
statusBanner: {
|
|
266
|
+
is: "ist",
|
|
267
|
+
live: "live",
|
|
268
|
+
liveTail: "seit {date} \u2014 wird aktuell als Add-On angeboten.",
|
|
269
|
+
liveWarning: "Inhalt & Preis sind read-only (laufende Vertr\xE4ge). F\xFCr \xC4nderungen eine neue Version anlegen.",
|
|
270
|
+
scheduled: "geplant",
|
|
271
|
+
scheduledTail: "f\xFCr {date} \u2014 wird ab dann verkaufbar.",
|
|
272
|
+
scheduledOk: "Frei editierbar bis dahin.",
|
|
273
|
+
superseded: "abgel\xF6st",
|
|
274
|
+
supersededTail: "({from} \u2013 {until}) \u2014 wird nicht mehr angeboten, Bestand bleibt f\xFCr Abrechnung erhalten.",
|
|
275
|
+
draft: "Draft",
|
|
276
|
+
draftTail: "\u2014 noch nicht published, frei editierbar.",
|
|
277
|
+
discardTooltip: "Geplante Version verwerfen"
|
|
278
|
+
},
|
|
279
|
+
// BundleVersionInlineEditor — features/quotas/pricing of one version.
|
|
280
|
+
editor: {
|
|
281
|
+
overlapOne: "Plan mit \xDCberschneidung \u2014 Features/Quotas dieses Bundles sind im Plan bereits enthalten. Bitte vor Publish bereinigen.",
|
|
282
|
+
overlapMany: "Pl\xE4ne mit \xDCberschneidung \u2014 Features/Quotas dieses Bundles sind im Plan bereits enthalten. Bitte vor Publish bereinigen.",
|
|
283
|
+
sectionFeatures: "Features",
|
|
284
|
+
sectionPricing: "Pricing",
|
|
285
|
+
pricingHint: "Bundle-Preis \xB7 zus\xE4tzlich zum Plan",
|
|
286
|
+
yearlyEquivalent: "\u2248 {amount} \u20AC/Mo bei Jahresbuchung",
|
|
287
|
+
savings: "{percent} % sparen",
|
|
288
|
+
validityHint: "validUntil automatisch (Auto-Sukzession)",
|
|
289
|
+
validUntilHint: "wird beim Publish einer Nachfolge-Version automatisch gesetzt",
|
|
290
|
+
sectionMarketing: "Marketing",
|
|
291
|
+
marketed: "Im Public-Catalog vermarkten",
|
|
292
|
+
sectionChangeNote: "Change-Note",
|
|
293
|
+
changeNoteRequired: "Pflicht beim Publish",
|
|
294
|
+
changeNotePlaceholder: "z. B. Add WhatsApp + Preisanpassung +4 \u20AC",
|
|
295
|
+
selectedCount: "{count} ausgew\xE4hlt",
|
|
296
|
+
saveTooltip: "\xC4nderungen speichern",
|
|
297
|
+
saveDisabledTooltip: "Form ist invalide oder unver\xE4ndert"
|
|
298
|
+
},
|
|
299
|
+
// BundlePlanCompatPicker — plans this bundle may be booked with.
|
|
300
|
+
featuresEditor: {
|
|
301
|
+
empty: "Keine Features im Discovery-Snapshot.",
|
|
302
|
+
overlapTooltip: "Feature ist im kompatiblen Plan bereits enthalten \u2014 Doppel-Berechnung",
|
|
303
|
+
removeTooltip: "Aus Bundle entfernen",
|
|
304
|
+
addTooltip: "In Bundle aufnehmen"
|
|
305
|
+
},
|
|
306
|
+
quotasEditor: {
|
|
307
|
+
empty: "Keine Quotas im Discovery-Snapshot.",
|
|
308
|
+
removeTooltip: "Quota entfernen",
|
|
309
|
+
addTooltip: "Quota aufnehmen"
|
|
310
|
+
},
|
|
311
|
+
filterBar: {
|
|
312
|
+
searchPlaceholder: "Bundle-Key oder Label suchen \u2026"
|
|
313
|
+
},
|
|
314
|
+
compatPicker: {
|
|
315
|
+
hint: "Pl\xE4ne, mit denen dieses Bundle als Add-On gebucht werden kann. Features/Quotas, die der Plan bereits enth\xE4lt, werden als \xDCberschneidung markiert (Doppel-Berechnung).",
|
|
316
|
+
lockedTooltip: "Live-Version ist read-only",
|
|
317
|
+
removeTooltip: "Plan-Kompatibilit\xE4t entfernen",
|
|
318
|
+
addTooltip: "Plan-Kompatibilit\xE4t setzen",
|
|
319
|
+
overlapHead: "\u26A0 \xDCberschneidung",
|
|
320
|
+
overlapFeatures: "Features:",
|
|
321
|
+
overlapQuotas: "Quotas:",
|
|
322
|
+
empty: "Keine Pl\xE4ne vorhanden \u2014 der Plan-Stamm muss zuerst angelegt werden.",
|
|
323
|
+
summaryOne: "Plan mit \xDCberschneidung \u2014 Features/Quotas dieses Bundles sind im Plan bereits enthalten. Vor Publish entweder das Bundle oder den Plan bereinigen.",
|
|
324
|
+
summaryMany: "Pl\xE4ne mit \xDCberschneidung \u2014 Features/Quotas dieses Bundles sind im Plan bereits enthalten. Vor Publish entweder das Bundle oder den Plan bereinigen."
|
|
325
|
+
},
|
|
326
|
+
// BundleVersionPublishDialog — publish confirmation incl. diff review.
|
|
327
|
+
publishDialog: {
|
|
328
|
+
title: "BundleVersion publishen",
|
|
329
|
+
bundleLabel: "Bundle",
|
|
330
|
+
loadingDiff: "Diff zur Vorg\xE4nger-Version wird geladen \u2026",
|
|
331
|
+
strictWarnings: "{count} Strict-Mode-Warnung(en)",
|
|
332
|
+
allowZeroPrice: "Preis 0,00 bewusst zulassen (kostenloses Bundle)",
|
|
333
|
+
allowZeroPriceHint: "Standard: Publish mit explizitem Preis 0,00 wird blockiert (Seed-Schutz).",
|
|
334
|
+
changesVs: "\xC4nderungen gegen\xFCber",
|
|
335
|
+
noPrevious: "\u2014 keine Vorg\xE4nger-Version (Erst-Ver\xF6ffentlichung)",
|
|
336
|
+
noChanges: "Keine \xC4nderungen \u2014 die Versionen sind inhaltlich gleich.",
|
|
337
|
+
regressionTitle: "Regressive \xC4nderung erkannt.",
|
|
338
|
+
regressionBody: "Diese Version entfernt Features, senkt Quotas oder erh\xF6ht Preise. Vertragsschutz P3 (SPEC.md \xA76) verlangt Bestand-Opt-in. Publish erfordert deinen ausdr\xFCcklichen",
|
|
339
|
+
regressionBodySuffix: "-Confirm.",
|
|
340
|
+
forceRegressive: "Trotzdem publishen",
|
|
341
|
+
confirm: "Publishen",
|
|
342
|
+
confirmRegressive: "Regressiv publishen"
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
fields: {
|
|
347
|
+
masterData: "Master data",
|
|
348
|
+
label: "Label",
|
|
349
|
+
quotas: "Quotas",
|
|
350
|
+
monthlyPrice: "Monthly price",
|
|
351
|
+
yearlyPrice: "Yearly price",
|
|
352
|
+
perMonthUnit: "\u20AC/mo",
|
|
353
|
+
perYearUnit: "\u20AC/yr",
|
|
354
|
+
validFrom: "Valid from",
|
|
355
|
+
validUntil: "Valid until",
|
|
356
|
+
validUntilOpen: "open",
|
|
357
|
+
planCompat: "Compatible with plans"
|
|
358
|
+
},
|
|
359
|
+
validation: {
|
|
360
|
+
validFromRequired: '"Valid from" is required.',
|
|
361
|
+
validUntilAfterValidFrom: '"Valid until" must be after "valid from".',
|
|
362
|
+
monthlyPriceFormat: "Monthly price: decimal with at most 2 decimal places.",
|
|
363
|
+
yearlyPriceFormat: "Yearly price: decimal with at most 2 decimal places."
|
|
364
|
+
},
|
|
365
|
+
page: {
|
|
366
|
+
loadError: "Failed to load: {message}",
|
|
367
|
+
emptyBefore: "No bundles created yet. Use",
|
|
368
|
+
emptyAfter: "to create a bundle master record, then curate features & quotas in a draft version.",
|
|
369
|
+
strictWarnings: "{count} strict mode warning(s) in the last operation",
|
|
370
|
+
confirmSoftDelete: "Really soft-delete bundle '{bundleKey}'? Existing contracts stay protected by published bundle versions.",
|
|
371
|
+
confirmDiscardVersion: "Discard this draft version? Its content will be lost."
|
|
372
|
+
},
|
|
373
|
+
header: {
|
|
374
|
+
title: "Bundles",
|
|
375
|
+
subtitle: "Product groups made of features & quotas \u2014 used in plans. Bundles are curated in the SuperAdmin.",
|
|
376
|
+
displayLocale: "Display language",
|
|
377
|
+
newBundle: "New bundle",
|
|
378
|
+
reload: "Reload list"
|
|
379
|
+
},
|
|
380
|
+
filter: {
|
|
381
|
+
all: "All statuses",
|
|
382
|
+
live: "Live only",
|
|
383
|
+
scheduled: "With scheduled version",
|
|
384
|
+
draft: "Drafts",
|
|
385
|
+
superseded: "Superseded",
|
|
386
|
+
retired: "Retired"
|
|
387
|
+
},
|
|
388
|
+
kpis: {
|
|
389
|
+
total: "Bundles total",
|
|
390
|
+
totalSub: "{live} live \xB7 {scheduled} with a scheduled version",
|
|
391
|
+
scheduled: "Scheduled versions",
|
|
392
|
+
scheduledSub: "active in the future \xB7 not sellable yet",
|
|
393
|
+
drafts: "Open drafts",
|
|
394
|
+
draftsSub: "{count} bundle(s) without a publish",
|
|
395
|
+
translated: "With translation",
|
|
396
|
+
translatedSub: "{count} active language(s) in the project"
|
|
397
|
+
},
|
|
398
|
+
list: {
|
|
399
|
+
translationCount: "{count} translation(s)",
|
|
400
|
+
emptyNoMatch: "No bundles match the search."
|
|
401
|
+
},
|
|
402
|
+
status: {
|
|
403
|
+
draft: {
|
|
404
|
+
label: "Draft",
|
|
405
|
+
tooltip: "Not published yet \u2014 freely editable"
|
|
406
|
+
},
|
|
407
|
+
live: {
|
|
408
|
+
label: "Live",
|
|
409
|
+
tooltip: "Active version \xB7 sellable \xB7 read-only (running contracts)"
|
|
410
|
+
},
|
|
411
|
+
scheduled: {
|
|
412
|
+
label: "Scheduled",
|
|
413
|
+
tooltip: "Active in the future \xB7 not sellable yet \xB7 freely editable"
|
|
414
|
+
},
|
|
415
|
+
superseded: {
|
|
416
|
+
label: "Superseded",
|
|
417
|
+
tooltip: "Replaced by a newer version \xB7 existing contracts remain"
|
|
418
|
+
},
|
|
419
|
+
retired: {
|
|
420
|
+
label: "Retired",
|
|
421
|
+
tooltip: "Bundle master record was soft-deleted"
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
detail: {
|
|
425
|
+
translations: "Translations",
|
|
426
|
+
languageCount: "{count} language(s)",
|
|
427
|
+
noTranslatableLocales: "No further languages active \u2014 they are enabled in the marketing catalog.",
|
|
428
|
+
fallbackFromDe: "Fallback from DE",
|
|
429
|
+
labelPlaceholder: 'Label (fallback: "{label}")',
|
|
430
|
+
descriptionPlaceholder: "Description (fallback from DE)",
|
|
431
|
+
save: "Save master data & translations",
|
|
432
|
+
noVersion: "No version yet. Create a new version to curate features, quotas & pricing.",
|
|
433
|
+
publishVersion: "Publish this version",
|
|
434
|
+
softDelete: "Soft-delete bundle"
|
|
435
|
+
},
|
|
436
|
+
create: {
|
|
437
|
+
title: "Create new bundle",
|
|
438
|
+
subtitle: "Bundle features & quotas into an add-on \u2014 priced and compatible with selected plans.",
|
|
439
|
+
masterDataHint: "Visible name + technical key.",
|
|
440
|
+
labelPlaceholder: "e.g. Communication Pro",
|
|
441
|
+
bundleKey: "Bundle key",
|
|
442
|
+
bundleKeyHint: "API-stable \xB7 derived from the label",
|
|
443
|
+
errorKeyFormat: "Only A-Z, 0-9, underscore; must start with a letter.",
|
|
444
|
+
errorKeyExists: "This bundle key already exists.",
|
|
445
|
+
descriptionPlaceholder: "e.g. Campaigns, WhatsApp and correspondence for active clubs.",
|
|
446
|
+
sectionPricing: "v1 \xB7 pricing & validity",
|
|
447
|
+
pricingHint: "Monthly & yearly price plus the date from which the bundle becomes sellable.",
|
|
448
|
+
validFromImmediate: "\u2713 The bundle is live and sellable right after creation.",
|
|
449
|
+
validFromScheduled: "\u23F3 Scheduled \u2014 becomes sellable on {date}.",
|
|
450
|
+
validFromHint: "Required when publishing \u2014 can also be set after creation.",
|
|
451
|
+
planCompatHint: "Which plans may this bundle be booked with as an add-on? Overlaps are flagged right away.",
|
|
452
|
+
sectionFeatures: "Features in the bundle",
|
|
453
|
+
selectedOfTotal: "{selected} of {total} selected",
|
|
454
|
+
quotasOptional: "optional",
|
|
455
|
+
quotasHint: "Quotas the bundle adds on top of the plan.",
|
|
456
|
+
overlapWarningOne: "\u26A0 Overlap with {count} plan \u2014 please review",
|
|
457
|
+
overlapWarningMany: "\u26A0 Overlap with {count} plans \u2014 please review",
|
|
458
|
+
summaryFeatureOne: "feature",
|
|
459
|
+
summaryFeatureMany: "features",
|
|
460
|
+
summaryQuotaOne: "quota",
|
|
461
|
+
summaryQuotaMany: "quotas",
|
|
462
|
+
summaryPlanCompat: "plan compat.",
|
|
463
|
+
submitting: "Creating \u2026",
|
|
464
|
+
submit: "Create bundle"
|
|
465
|
+
},
|
|
466
|
+
versionStrip: {
|
|
467
|
+
label: "Versions",
|
|
468
|
+
perMonth: "/ mo",
|
|
469
|
+
addVersion: "New version",
|
|
470
|
+
addTooltip: "Create a new, future version",
|
|
471
|
+
addDisabledTooltip: "Bundle already has a draft version \u2014 publish or discard it first"
|
|
472
|
+
},
|
|
473
|
+
statusBanner: {
|
|
474
|
+
is: "is",
|
|
475
|
+
live: "live",
|
|
476
|
+
liveTail: "since {date} \u2014 currently offered as an add-on.",
|
|
477
|
+
liveWarning: "Content & price are read-only (running contracts). Create a new version to make changes.",
|
|
478
|
+
scheduled: "scheduled",
|
|
479
|
+
scheduledTail: "for {date} \u2014 becomes sellable from then on.",
|
|
480
|
+
scheduledOk: "Freely editable until then.",
|
|
481
|
+
superseded: "superseded",
|
|
482
|
+
supersededTail: "({from} \u2013 {until}) \u2014 no longer offered, existing contracts remain for billing.",
|
|
483
|
+
draft: "Draft",
|
|
484
|
+
draftTail: "\u2014 not published yet, freely editable.",
|
|
485
|
+
discardTooltip: "Discard scheduled version"
|
|
486
|
+
},
|
|
487
|
+
editor: {
|
|
488
|
+
overlapOne: "plan with an overlap \u2014 features/quotas of this bundle are already contained in the plan. Please clean up before publishing.",
|
|
489
|
+
overlapMany: "plans with an overlap \u2014 features/quotas of this bundle are already contained in the plan. Please clean up before publishing.",
|
|
490
|
+
sectionFeatures: "Features",
|
|
491
|
+
sectionPricing: "Pricing",
|
|
492
|
+
pricingHint: "Bundle price \xB7 on top of the plan",
|
|
493
|
+
yearlyEquivalent: "\u2248 {amount} \u20AC/mo when booked yearly",
|
|
494
|
+
savings: "save {percent} %",
|
|
495
|
+
validityHint: "validUntil automatic (auto succession)",
|
|
496
|
+
validUntilHint: "set automatically when a successor version is published",
|
|
497
|
+
sectionMarketing: "Marketing",
|
|
498
|
+
marketed: "Market in the public catalog",
|
|
499
|
+
sectionChangeNote: "Change note",
|
|
500
|
+
changeNoteRequired: "Required when publishing",
|
|
501
|
+
changeNotePlaceholder: "e.g. Add WhatsApp + price adjustment +4 \u20AC",
|
|
502
|
+
selectedCount: "{count} selected",
|
|
503
|
+
saveTooltip: "Save changes",
|
|
504
|
+
saveDisabledTooltip: "Form is invalid or unchanged"
|
|
505
|
+
},
|
|
506
|
+
featuresEditor: {
|
|
507
|
+
empty: "No features in the discovery snapshot.",
|
|
508
|
+
overlapTooltip: "Feature is already included in the compatible plan \u2014 double counting",
|
|
509
|
+
removeTooltip: "Remove from bundle",
|
|
510
|
+
addTooltip: "Add to bundle"
|
|
511
|
+
},
|
|
512
|
+
quotasEditor: {
|
|
513
|
+
empty: "No quotas in the discovery snapshot.",
|
|
514
|
+
removeTooltip: "Remove quota",
|
|
515
|
+
addTooltip: "Add quota"
|
|
516
|
+
},
|
|
517
|
+
filterBar: {
|
|
518
|
+
searchPlaceholder: "Search bundle key or label \u2026"
|
|
519
|
+
},
|
|
520
|
+
compatPicker: {
|
|
521
|
+
hint: "Plans this bundle can be booked with as an add-on. Features/quotas the plan already contains are flagged as an overlap (double counting).",
|
|
522
|
+
lockedTooltip: "Live version is read-only",
|
|
523
|
+
removeTooltip: "Remove plan compatibility",
|
|
524
|
+
addTooltip: "Set plan compatibility",
|
|
525
|
+
overlapHead: "\u26A0 Overlap",
|
|
526
|
+
overlapFeatures: "Features:",
|
|
527
|
+
overlapQuotas: "Quotas:",
|
|
528
|
+
empty: "No plans available \u2014 the plan master record has to be created first.",
|
|
529
|
+
summaryOne: "plan with an overlap \u2014 features/quotas of this bundle are already contained in the plan. Clean up either the bundle or the plan before publishing.",
|
|
530
|
+
summaryMany: "plans with an overlap \u2014 features/quotas of this bundle are already contained in the plan. Clean up either the bundle or the plan before publishing."
|
|
531
|
+
},
|
|
532
|
+
publishDialog: {
|
|
533
|
+
title: "Publish bundle version",
|
|
534
|
+
bundleLabel: "Bundle",
|
|
535
|
+
loadingDiff: "Loading the diff against the previous version \u2026",
|
|
536
|
+
strictWarnings: "{count} strict mode warning(s)",
|
|
537
|
+
allowZeroPrice: "Deliberately allow price 0.00 (free bundle)",
|
|
538
|
+
allowZeroPriceHint: "Default: publishing with an explicit price of 0.00 is blocked (seed protection).",
|
|
539
|
+
changesVs: "Changes compared to",
|
|
540
|
+
noPrevious: "\u2014 no previous version (first publication)",
|
|
541
|
+
noChanges: "No changes \u2014 the versions are identical in content.",
|
|
542
|
+
regressionTitle: "Regressive change detected.",
|
|
543
|
+
regressionBody: "This version removes features, lowers quotas or increases prices. Contract protection P3 (SPEC.md \xA76) requires an opt-in from existing contracts. Publishing requires your explicit",
|
|
544
|
+
regressionBodySuffix: " confirmation.",
|
|
545
|
+
forceRegressive: "Publish anyway",
|
|
546
|
+
confirm: "Publish",
|
|
547
|
+
confirmRegressive: "Publish regressively"
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
);
|
|
551
|
+
|
|
552
|
+
// src/client/i18n/messages/common.ts
|
|
553
|
+
var commonMessages = defineMessages(
|
|
554
|
+
{
|
|
555
|
+
save: "Speichern",
|
|
556
|
+
cancel: "Abbrechen",
|
|
557
|
+
close: "Schlie\xDFen",
|
|
558
|
+
delete: "L\xF6schen",
|
|
559
|
+
edit: "Bearbeiten",
|
|
560
|
+
create: "Anlegen",
|
|
561
|
+
back: "Zur\xFCck",
|
|
562
|
+
next: "Weiter",
|
|
563
|
+
confirm: "Best\xE4tigen",
|
|
564
|
+
apply: "\xDCbernehmen",
|
|
565
|
+
retry: "Erneut versuchen",
|
|
566
|
+
reload: "Neu laden",
|
|
567
|
+
search: "Suchen",
|
|
568
|
+
reset: "Zur\xFCcksetzen",
|
|
569
|
+
copy: "Kopieren",
|
|
570
|
+
copied: "Kopiert",
|
|
571
|
+
show: "Anzeigen",
|
|
572
|
+
hide: "Ausblenden",
|
|
573
|
+
open: "\xD6ffnen",
|
|
574
|
+
loading: "Lade \u2026",
|
|
575
|
+
saving: "Speichere \u2026",
|
|
576
|
+
loadingData: "Daten werden geladen\u2026",
|
|
577
|
+
error: "Fehler",
|
|
578
|
+
errorLoadFailed: "Laden fehlgeschlagen",
|
|
579
|
+
errorSaveFailed: "Speichern fehlgeschlagen",
|
|
580
|
+
yes: "Ja",
|
|
581
|
+
no: "Nein",
|
|
582
|
+
none: "Keine",
|
|
583
|
+
all: "Alle",
|
|
584
|
+
total: "Gesamt",
|
|
585
|
+
unknown: "Unbekannt",
|
|
586
|
+
active: "Aktiv",
|
|
587
|
+
inactive: "Inaktiv",
|
|
588
|
+
archived: "Archiviert",
|
|
589
|
+
draft: "Entwurf",
|
|
590
|
+
published: "Ver\xF6ffentlicht",
|
|
591
|
+
name: "Name",
|
|
592
|
+
description: "Beschreibung",
|
|
593
|
+
status: "Status",
|
|
594
|
+
actions: "Aktionen",
|
|
595
|
+
details: "Details",
|
|
596
|
+
date: "Datum",
|
|
597
|
+
from: "Von",
|
|
598
|
+
to: "Bis",
|
|
599
|
+
createdAt: "Angelegt am",
|
|
600
|
+
updatedAt: "Ge\xE4ndert am",
|
|
601
|
+
required: "Erforderlich",
|
|
602
|
+
optional: "Optional",
|
|
603
|
+
note: "Hinweis",
|
|
604
|
+
notes: "Hinweise",
|
|
605
|
+
warning: "Warnung",
|
|
606
|
+
warnings: "Warnungen",
|
|
607
|
+
perMonth: "pro Monat",
|
|
608
|
+
perYear: "pro Jahr",
|
|
609
|
+
monthly: "Monatlich",
|
|
610
|
+
yearly: "J\xE4hrlich",
|
|
611
|
+
discard: "Verwerfen",
|
|
612
|
+
remove: "Entfernen",
|
|
613
|
+
type: "Typ",
|
|
614
|
+
icon: "Icon",
|
|
615
|
+
validity: "G\xFCltigkeit",
|
|
616
|
+
general: "Allgemein",
|
|
617
|
+
sortOrder: "Sortier-Reihenfolge",
|
|
618
|
+
expired: "Abgelaufen",
|
|
619
|
+
unlimited: "unbegrenzt",
|
|
620
|
+
both: "Beide",
|
|
621
|
+
createFailed: "Anlegen fehlgeschlagen",
|
|
622
|
+
noChanges: "Keine \xC4nderungen"
|
|
623
|
+
},
|
|
624
|
+
{
|
|
625
|
+
save: "Save",
|
|
626
|
+
cancel: "Cancel",
|
|
627
|
+
close: "Close",
|
|
628
|
+
delete: "Delete",
|
|
629
|
+
edit: "Edit",
|
|
630
|
+
create: "Create",
|
|
631
|
+
back: "Back",
|
|
632
|
+
next: "Next",
|
|
633
|
+
confirm: "Confirm",
|
|
634
|
+
apply: "Apply",
|
|
635
|
+
retry: "Retry",
|
|
636
|
+
reload: "Reload",
|
|
637
|
+
search: "Search",
|
|
638
|
+
reset: "Reset",
|
|
639
|
+
copy: "Copy",
|
|
640
|
+
copied: "Copied",
|
|
641
|
+
show: "Show",
|
|
642
|
+
hide: "Hide",
|
|
643
|
+
open: "Open",
|
|
644
|
+
loading: "Loading \u2026",
|
|
645
|
+
saving: "Saving \u2026",
|
|
646
|
+
loadingData: "Loading data\u2026",
|
|
647
|
+
error: "Error",
|
|
648
|
+
errorLoadFailed: "Failed to load",
|
|
649
|
+
errorSaveFailed: "Failed to save",
|
|
650
|
+
yes: "Yes",
|
|
651
|
+
no: "No",
|
|
652
|
+
none: "None",
|
|
653
|
+
all: "All",
|
|
654
|
+
total: "Total",
|
|
655
|
+
unknown: "Unknown",
|
|
656
|
+
active: "Active",
|
|
657
|
+
inactive: "Inactive",
|
|
658
|
+
archived: "Archived",
|
|
659
|
+
draft: "Draft",
|
|
660
|
+
published: "Published",
|
|
661
|
+
name: "Name",
|
|
662
|
+
description: "Description",
|
|
663
|
+
status: "Status",
|
|
664
|
+
actions: "Actions",
|
|
665
|
+
details: "Details",
|
|
666
|
+
date: "Date",
|
|
667
|
+
from: "From",
|
|
668
|
+
to: "To",
|
|
669
|
+
createdAt: "Created at",
|
|
670
|
+
updatedAt: "Updated at",
|
|
671
|
+
required: "Required",
|
|
672
|
+
optional: "Optional",
|
|
673
|
+
note: "Note",
|
|
674
|
+
notes: "Notes",
|
|
675
|
+
warning: "Warning",
|
|
676
|
+
warnings: "Warnings",
|
|
677
|
+
perMonth: "per month",
|
|
678
|
+
perYear: "per year",
|
|
679
|
+
monthly: "Monthly",
|
|
680
|
+
yearly: "Yearly",
|
|
681
|
+
discard: "Discard",
|
|
682
|
+
remove: "Remove",
|
|
683
|
+
type: "Type",
|
|
684
|
+
icon: "Icon",
|
|
685
|
+
validity: "Validity",
|
|
686
|
+
general: "General",
|
|
687
|
+
sortOrder: "Sort order",
|
|
688
|
+
expired: "Expired",
|
|
689
|
+
unlimited: "unlimited",
|
|
690
|
+
both: "Both",
|
|
691
|
+
createFailed: "Creation failed",
|
|
692
|
+
noChanges: "No changes"
|
|
693
|
+
}
|
|
694
|
+
);
|
|
695
|
+
|
|
696
|
+
// src/client/i18n/messages/dashboard.ts
|
|
697
|
+
var dashboardMessages = defineMessages(
|
|
698
|
+
{
|
|
699
|
+
title: "Dashboard",
|
|
700
|
+
emptyKpiCards: "Keine KPI-Cards im Manifest deklariert.",
|
|
701
|
+
shortcutsTitle: "Shortcuts",
|
|
702
|
+
deltaVsPreviousPeriod: "{delta} gg\xFC. Vorperiode"
|
|
703
|
+
},
|
|
704
|
+
{
|
|
705
|
+
title: "Dashboard",
|
|
706
|
+
emptyKpiCards: "No KPI cards declared in the manifest.",
|
|
707
|
+
shortcutsTitle: "Shortcuts",
|
|
708
|
+
deltaVsPreviousPeriod: "{delta} vs. previous period"
|
|
709
|
+
}
|
|
710
|
+
);
|
|
711
|
+
|
|
712
|
+
// src/client/i18n/messages/discovery.ts
|
|
713
|
+
var discoveryMessages = defineMessages(
|
|
714
|
+
{
|
|
715
|
+
title: "Discovery",
|
|
716
|
+
subtitleLead: "Capabilities, die der Code",
|
|
717
|
+
subtitleEmphasis: "aktuell",
|
|
718
|
+
subtitleTail: "implementiert. Discovery ist Ist-Zustand \u2014 die Freigabe f\xFCr Produkt & Marketing erfolgt im Review.",
|
|
719
|
+
runDiscovery: "Discovery neu ausf\xFChren",
|
|
720
|
+
lastScan: "Letzter Scan",
|
|
721
|
+
notScannedYet: "noch nicht gescannt",
|
|
722
|
+
tabFeatures: "Features ({count})",
|
|
723
|
+
tabQuotas: "Quotas ({count})",
|
|
724
|
+
searchPlaceholder: "Feature-Key, Label oder Capability suchen \u2026",
|
|
725
|
+
statusFilterAll: "Alle Status",
|
|
726
|
+
noFeaturesMatchFilters: "Keine Features entsprechen den Filtern.",
|
|
727
|
+
noQuotasDeclared: "Keine Quotas im Code deklariert.",
|
|
728
|
+
orphansTitle: "Capabilities ohne Feature",
|
|
729
|
+
noOwner: "Ohne Owner",
|
|
730
|
+
owner: "Owner",
|
|
731
|
+
unit: "Einheit",
|
|
732
|
+
replacedBy: "ersetzt durch {key}",
|
|
733
|
+
replaces: "ersetzt: {keys}",
|
|
734
|
+
reapproveEmphasis: "erneut freigeben",
|
|
735
|
+
errorDiscoveryHttp: "Discovery-Endpoint antwortete mit HTTP {status}",
|
|
736
|
+
errorRescanHttp: "Discovery-Rescan antwortete mit HTTP {status}",
|
|
737
|
+
errorCatalogHttp: "Catalog-Entries-API antwortete mit HTTP {status}",
|
|
738
|
+
capList: {
|
|
739
|
+
orphanFeature: "Feature im Katalog ohne implementierende Capability \u2014 blockiert im blocking-Strict-Mode das Plan-Publish.",
|
|
740
|
+
removedFromCode: "aus Code entfernt"
|
|
741
|
+
},
|
|
742
|
+
kpi: {
|
|
743
|
+
featuresTotal: "Features gesamt",
|
|
744
|
+
featuresTotalSub: "aggregiert aus {count} Capabilities",
|
|
745
|
+
approved: "Freigegeben",
|
|
746
|
+
approvedSub: "planungsbereit",
|
|
747
|
+
pending: "Ausstehend",
|
|
748
|
+
pendingSub: "noch nicht freigegeben",
|
|
749
|
+
outdated: "Veraltet / Obsolet",
|
|
750
|
+
outdatedSub: "{outdated} outdated \xB7 {obsolete} obsolete",
|
|
751
|
+
orphans: "Orphans"
|
|
752
|
+
},
|
|
753
|
+
orphanHint: {
|
|
754
|
+
before: "Diesen Capabilities fehlt der",
|
|
755
|
+
middle: "-Tag im",
|
|
756
|
+
after: "-Decorator \u2014 Feature-Zuordnung im Code nachziehen, sonst sind sie nicht verkaufbar."
|
|
757
|
+
},
|
|
758
|
+
statusLabels: {
|
|
759
|
+
pending: "Pending",
|
|
760
|
+
approved: "Approved",
|
|
761
|
+
outdated: "Outdated",
|
|
762
|
+
obsolete: "Obsolete"
|
|
763
|
+
},
|
|
764
|
+
statusHints: {
|
|
765
|
+
pending: "Im Code gefunden, noch nicht freigegeben \u2014 steht der Planung nicht zur Verf\xFCgung.",
|
|
766
|
+
approved: "F\xFCr Pl\xE4ne, Bundles & Marketing freigegeben.",
|
|
767
|
+
outdated: "Code hat sich seit der Freigabe ge\xE4ndert \u2014 bitte erneut pr\xFCfen und freigeben.",
|
|
768
|
+
obsolete: "Abgek\xFCndigt \u2014 nicht mehr verwenden, in neuen Pl\xE4nen ausblenden."
|
|
769
|
+
},
|
|
770
|
+
reviewActions: {
|
|
771
|
+
approve: "Freigeben",
|
|
772
|
+
revoke: "Freigabe entziehen",
|
|
773
|
+
reapprove: "Erneut freigeben",
|
|
774
|
+
reactivate: "Reaktivieren",
|
|
775
|
+
markOutdated: "Als veraltet markieren",
|
|
776
|
+
markObsolete: "Als obsolet markieren"
|
|
777
|
+
},
|
|
778
|
+
feature: {
|
|
779
|
+
newCaps: "{count} neu",
|
|
780
|
+
deprecatedCaps: "{count} deprecated",
|
|
781
|
+
capabilityOne: "Capability",
|
|
782
|
+
capabilityMany: "Capabilities",
|
|
783
|
+
outdatedBanner: "Die Implementierung hat sich seit der letzten Freigabe ge\xE4ndert. Bitte Stammdaten & Capabilities pr\xFCfen und",
|
|
784
|
+
obsoleteBanner: "Dieses Feature ist abgek\xFCndigt. Es sollte in neuen Pl\xE4nen nicht mehr verwendet werden.",
|
|
785
|
+
tabBaseData: "Stammdaten",
|
|
786
|
+
tabTranslations: "\xDCbersetzungen",
|
|
787
|
+
settings: "Einstellungen",
|
|
788
|
+
iconLabel: "Icon (Quasar-Icon-Name)",
|
|
789
|
+
iconPlaceholder: "z. B. directions_car",
|
|
790
|
+
tierLabel: "Tier",
|
|
791
|
+
codeCapabilities: "Code Capabilities",
|
|
792
|
+
codeCapabilitiesCount: "{count} \xB7 read-only"
|
|
793
|
+
},
|
|
794
|
+
quota: {
|
|
795
|
+
usageProvider: "UsageProvider",
|
|
796
|
+
usageProviderMissing: "fehlt",
|
|
797
|
+
noUsageProviderWarning: "Eine harte Quota ohne UsageProvider ist nicht deploy-f\xE4hig (Preflight, SPEC_V2 \xA76.3).",
|
|
798
|
+
outdatedBanner: "Die code-abgeleiteten Quota-Fakten (Einheit/Enforcement/Provider) haben sich seit der letzten Freigabe ge\xE4ndert \u2014 bitte pr\xFCfen und"
|
|
799
|
+
},
|
|
800
|
+
caps: {
|
|
801
|
+
emptyHint: "Feature im Katalog ohne implementierende Capability \u2014 blockiert im blocking-Strict-Mode das Plan-Publish.",
|
|
802
|
+
flagNew: "neu",
|
|
803
|
+
flagExperimental: "experimental",
|
|
804
|
+
flagDeprecated: "deprecated",
|
|
805
|
+
flagRemoved: "aus Code entfernt",
|
|
806
|
+
implementedAt: "impl"
|
|
807
|
+
},
|
|
808
|
+
trans: {
|
|
809
|
+
sourceBadge: "Source",
|
|
810
|
+
fieldLabel: "Label",
|
|
811
|
+
unitFromCode: "aus Code",
|
|
812
|
+
copyFromDefault: "Aus DE",
|
|
813
|
+
copyFromDefaultHint: "Leere Felder aus der Default-Locale \xFCbernehmen",
|
|
814
|
+
fallbackPlaceholder: "Fallback: \u201E{value}\u201C",
|
|
815
|
+
noOtherLocales: "Keine weiteren Sprachen aktiv \u2014 Sprachen werden im Marketing-Catalog aktiviert."
|
|
816
|
+
}
|
|
817
|
+
},
|
|
818
|
+
{
|
|
819
|
+
title: "Discovery",
|
|
820
|
+
subtitleLead: "Capabilities the code",
|
|
821
|
+
subtitleEmphasis: "currently",
|
|
822
|
+
subtitleTail: "implements. Discovery is the actual state \u2014 approval for product & marketing happens in the review.",
|
|
823
|
+
runDiscovery: "Run discovery again",
|
|
824
|
+
lastScan: "Last scan",
|
|
825
|
+
notScannedYet: "not scanned yet",
|
|
826
|
+
tabFeatures: "Features ({count})",
|
|
827
|
+
tabQuotas: "Quotas ({count})",
|
|
828
|
+
searchPlaceholder: "Search feature key, label or capability \u2026",
|
|
829
|
+
statusFilterAll: "All statuses",
|
|
830
|
+
noFeaturesMatchFilters: "No features match the filters.",
|
|
831
|
+
noQuotasDeclared: "No quotas declared in the code.",
|
|
832
|
+
orphansTitle: "Capabilities without a feature",
|
|
833
|
+
noOwner: "Without owner",
|
|
834
|
+
owner: "Owner",
|
|
835
|
+
unit: "Unit",
|
|
836
|
+
replacedBy: "replaced by {key}",
|
|
837
|
+
replaces: "replaces: {keys}",
|
|
838
|
+
reapproveEmphasis: "approve again",
|
|
839
|
+
errorDiscoveryHttp: "Discovery endpoint responded with HTTP {status}",
|
|
840
|
+
errorRescanHttp: "Discovery rescan responded with HTTP {status}",
|
|
841
|
+
errorCatalogHttp: "Catalog entries API responded with HTTP {status}",
|
|
842
|
+
capList: {
|
|
843
|
+
orphanFeature: "Feature in the catalog without an implementing capability \u2014 blocks plan publishing in blocking strict mode.",
|
|
844
|
+
removedFromCode: "removed from code"
|
|
845
|
+
},
|
|
846
|
+
kpi: {
|
|
847
|
+
featuresTotal: "Features total",
|
|
848
|
+
featuresTotalSub: "aggregated from {count} capabilities",
|
|
849
|
+
approved: "Approved",
|
|
850
|
+
approvedSub: "ready for planning",
|
|
851
|
+
pending: "Pending",
|
|
852
|
+
pendingSub: "not approved yet",
|
|
853
|
+
outdated: "Outdated / obsolete",
|
|
854
|
+
outdatedSub: "{outdated} outdated \xB7 {obsolete} obsolete",
|
|
855
|
+
orphans: "Orphans"
|
|
856
|
+
},
|
|
857
|
+
orphanHint: {
|
|
858
|
+
before: "These capabilities are missing the",
|
|
859
|
+
middle: " tag in the",
|
|
860
|
+
after: " decorator \u2014 add the feature assignment in the code, otherwise they cannot be sold."
|
|
861
|
+
},
|
|
862
|
+
statusLabels: {
|
|
863
|
+
pending: "Pending",
|
|
864
|
+
approved: "Approved",
|
|
865
|
+
outdated: "Outdated",
|
|
866
|
+
obsolete: "Obsolete"
|
|
867
|
+
},
|
|
868
|
+
statusHints: {
|
|
869
|
+
pending: "Found in the code, not approved yet \u2014 not available for planning.",
|
|
870
|
+
approved: "Approved for plans, bundles & marketing.",
|
|
871
|
+
outdated: "The code has changed since the approval \u2014 please review and approve again.",
|
|
872
|
+
obsolete: "Deprecated \u2014 do not use any more, hide in new plans."
|
|
873
|
+
},
|
|
874
|
+
reviewActions: {
|
|
875
|
+
approve: "Approve",
|
|
876
|
+
revoke: "Revoke approval",
|
|
877
|
+
reapprove: "Approve again",
|
|
878
|
+
reactivate: "Reactivate",
|
|
879
|
+
markOutdated: "Mark as outdated",
|
|
880
|
+
markObsolete: "Mark as obsolete"
|
|
881
|
+
},
|
|
882
|
+
feature: {
|
|
883
|
+
newCaps: "{count} new",
|
|
884
|
+
deprecatedCaps: "{count} deprecated",
|
|
885
|
+
capabilityOne: "Capability",
|
|
886
|
+
capabilityMany: "Capabilities",
|
|
887
|
+
outdatedBanner: "The implementation has changed since the last approval. Please review the master data & capabilities and",
|
|
888
|
+
obsoleteBanner: "This feature is deprecated. It should no longer be used in new plans.",
|
|
889
|
+
tabBaseData: "Master data",
|
|
890
|
+
tabTranslations: "Translations",
|
|
891
|
+
settings: "Settings",
|
|
892
|
+
iconLabel: "Icon (Quasar icon name)",
|
|
893
|
+
iconPlaceholder: "e.g. directions_car",
|
|
894
|
+
tierLabel: "Tier",
|
|
895
|
+
codeCapabilities: "Code capabilities",
|
|
896
|
+
codeCapabilitiesCount: "{count} \xB7 read-only"
|
|
897
|
+
},
|
|
898
|
+
quota: {
|
|
899
|
+
usageProvider: "UsageProvider",
|
|
900
|
+
usageProviderMissing: "missing",
|
|
901
|
+
noUsageProviderWarning: "A hard quota without a UsageProvider is not deployable (preflight, SPEC_V2 \xA76.3).",
|
|
902
|
+
outdatedBanner: "The code-derived quota facts (unit/enforcement/provider) have changed since the last approval \u2014 please review and"
|
|
903
|
+
},
|
|
904
|
+
caps: {
|
|
905
|
+
emptyHint: "Feature in the catalog without an implementing capability \u2014 blocks the plan publish in blocking strict mode.",
|
|
906
|
+
flagNew: "new",
|
|
907
|
+
flagExperimental: "experimental",
|
|
908
|
+
flagDeprecated: "deprecated",
|
|
909
|
+
flagRemoved: "removed from code",
|
|
910
|
+
implementedAt: "impl"
|
|
911
|
+
},
|
|
912
|
+
trans: {
|
|
913
|
+
sourceBadge: "Source",
|
|
914
|
+
fieldLabel: "Label",
|
|
915
|
+
unitFromCode: "from code",
|
|
916
|
+
copyFromDefault: "From DE",
|
|
917
|
+
copyFromDefaultHint: "Fill empty fields from the default locale",
|
|
918
|
+
fallbackPlaceholder: "Fallback: \u201C{value}\u201D",
|
|
919
|
+
noOtherLocales: "No other languages active \u2014 languages are activated in the marketing catalog."
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
);
|
|
923
|
+
|
|
924
|
+
// src/client/i18n/messages/email.ts
|
|
925
|
+
var emailMessages = defineMessages(
|
|
926
|
+
{
|
|
927
|
+
sender: "Absender",
|
|
928
|
+
recipient: "Empf\xE4nger",
|
|
929
|
+
errorAction: "Aktion fehlgeschlagen",
|
|
930
|
+
provider: {
|
|
931
|
+
title: "Plattform-E-Mail",
|
|
932
|
+
subtitle: "Zentraler Absender f\xFCr Registrierungs- und System-Mails dieser Plattform.",
|
|
933
|
+
sendTestMail: "Test-Mail senden",
|
|
934
|
+
dialogCreateTitle: "Absender anlegen",
|
|
935
|
+
dialogEditTitle: "Absender bearbeiten",
|
|
936
|
+
fieldSmtpHost: "SMTP-Host",
|
|
937
|
+
fieldSmtpPort: "SMTP-Port",
|
|
938
|
+
fieldSmtpUser: "SMTP-Benutzer",
|
|
939
|
+
fieldSmtpPassword: "SMTP-Passwort",
|
|
940
|
+
fieldSmtpPasswordEdit: "SMTP-Passwort (leer = unver\xE4ndert)",
|
|
941
|
+
fieldEncryption: "Verschl\xFCsselung",
|
|
942
|
+
fieldFromEmail: "Absender-Adresse",
|
|
943
|
+
fieldFromName: "Absender-Name",
|
|
944
|
+
fieldSubject: "Betreff (optional)",
|
|
945
|
+
send: "Senden",
|
|
946
|
+
statusActive: "aktiv",
|
|
947
|
+
statusInactive: "inaktiv",
|
|
948
|
+
columnHost: "Host",
|
|
949
|
+
columnEncryption: "Krypto",
|
|
950
|
+
deleteDialogTitle: "Absender l\xF6schen",
|
|
951
|
+
deleteDialogMessage: '"{name}" wirklich l\xF6schen?',
|
|
952
|
+
mfaCreate: 'Absender "{name}" anlegen.',
|
|
953
|
+
mfaSave: 'Absender "{name}" speichern.',
|
|
954
|
+
mfaDelete: 'Absender "{name}" l\xF6schen.',
|
|
955
|
+
saved: "Gespeichert.",
|
|
956
|
+
deleted: "Gel\xF6scht."
|
|
957
|
+
},
|
|
958
|
+
history: {
|
|
959
|
+
title: "Plattform-E-Mail-Verlauf",
|
|
960
|
+
subtitle: "\xDCber den Plattform-Absender versendete System-Mails \u2014 Empf\xE4nger, Status und Fehler.",
|
|
961
|
+
searchLabel: "Suche (Empf\xE4nger, Betreff, Inhalt \u2026)",
|
|
962
|
+
statusSent: "Gesendet",
|
|
963
|
+
statusFailed: "Fehlgeschlagen",
|
|
964
|
+
statusPending: "Ausstehend",
|
|
965
|
+
statusBounced: "Bounced",
|
|
966
|
+
resend: "Erneut senden",
|
|
967
|
+
removeFromHistory: "Aus Verlauf entfernen",
|
|
968
|
+
empty: "Keine E-Mails im Verlauf.",
|
|
969
|
+
columnSubject: "Betreff",
|
|
970
|
+
columnCreatedAt: "Erstellt",
|
|
971
|
+
columnSentAt: "Gesendet",
|
|
972
|
+
detailFromTo: "Von {from} \xB7 An {to}",
|
|
973
|
+
detailTimestamps: "Erstellt {created} \xB7 Gesendet {sent}",
|
|
974
|
+
noContent: "Kein Inhalt gespeichert.",
|
|
975
|
+
smtpResponse: "SMTP-Antwort",
|
|
976
|
+
confirmRemoveTitle: "E-Mail entfernen",
|
|
977
|
+
confirmRemoveMessage: "Diese E-Mail aus dem Verlauf entfernen? Der Eintrag wird ausgeblendet, bleibt aber f\xFCr das Audit erhalten.",
|
|
978
|
+
mfaResend: "Plattform-Mail erneut senden",
|
|
979
|
+
mfaRemove: "Plattform-Mail aus Verlauf entfernen",
|
|
980
|
+
sendFailed: "Versand fehlgeschlagen",
|
|
981
|
+
resendSuccess: "E-Mail erneut versendet",
|
|
982
|
+
removeSuccess: "Aus Verlauf entfernt"
|
|
983
|
+
}
|
|
984
|
+
},
|
|
985
|
+
{
|
|
986
|
+
sender: "Sender",
|
|
987
|
+
recipient: "Recipient",
|
|
988
|
+
errorAction: "Action failed",
|
|
989
|
+
provider: {
|
|
990
|
+
title: "Platform email",
|
|
991
|
+
subtitle: "Central sender for registration and system emails of this platform.",
|
|
992
|
+
sendTestMail: "Send test email",
|
|
993
|
+
dialogCreateTitle: "Create sender",
|
|
994
|
+
dialogEditTitle: "Edit sender",
|
|
995
|
+
fieldSmtpHost: "SMTP host",
|
|
996
|
+
fieldSmtpPort: "SMTP port",
|
|
997
|
+
fieldSmtpUser: "SMTP user",
|
|
998
|
+
fieldSmtpPassword: "SMTP password",
|
|
999
|
+
fieldSmtpPasswordEdit: "SMTP password (empty = unchanged)",
|
|
1000
|
+
fieldEncryption: "Encryption",
|
|
1001
|
+
fieldFromEmail: "Sender address",
|
|
1002
|
+
fieldFromName: "Sender name",
|
|
1003
|
+
fieldSubject: "Subject (optional)",
|
|
1004
|
+
send: "Send",
|
|
1005
|
+
statusActive: "active",
|
|
1006
|
+
statusInactive: "inactive",
|
|
1007
|
+
columnHost: "Host",
|
|
1008
|
+
columnEncryption: "Crypto",
|
|
1009
|
+
deleteDialogTitle: "Delete sender",
|
|
1010
|
+
deleteDialogMessage: 'Really delete "{name}"?',
|
|
1011
|
+
mfaCreate: 'Create sender "{name}".',
|
|
1012
|
+
mfaSave: 'Save sender "{name}".',
|
|
1013
|
+
mfaDelete: 'Delete sender "{name}".',
|
|
1014
|
+
saved: "Saved.",
|
|
1015
|
+
deleted: "Deleted."
|
|
1016
|
+
},
|
|
1017
|
+
history: {
|
|
1018
|
+
title: "Platform email history",
|
|
1019
|
+
subtitle: "System emails sent via the platform sender \u2014 recipients, status and errors.",
|
|
1020
|
+
searchLabel: "Search (recipient, subject, content \u2026)",
|
|
1021
|
+
statusSent: "Sent",
|
|
1022
|
+
statusFailed: "Failed",
|
|
1023
|
+
statusPending: "Pending",
|
|
1024
|
+
statusBounced: "Bounced",
|
|
1025
|
+
resend: "Resend",
|
|
1026
|
+
removeFromHistory: "Remove from history",
|
|
1027
|
+
empty: "No emails in the history.",
|
|
1028
|
+
columnSubject: "Subject",
|
|
1029
|
+
columnCreatedAt: "Created",
|
|
1030
|
+
columnSentAt: "Sent",
|
|
1031
|
+
detailFromTo: "From {from} \xB7 To {to}",
|
|
1032
|
+
detailTimestamps: "Created {created} \xB7 Sent {sent}",
|
|
1033
|
+
noContent: "No content stored.",
|
|
1034
|
+
smtpResponse: "SMTP response",
|
|
1035
|
+
confirmRemoveTitle: "Remove email",
|
|
1036
|
+
confirmRemoveMessage: "Remove this email from the history? The entry is hidden but kept for the audit trail.",
|
|
1037
|
+
mfaResend: "Resend platform email",
|
|
1038
|
+
mfaRemove: "Remove platform email from history",
|
|
1039
|
+
sendFailed: "Sending failed",
|
|
1040
|
+
resendSuccess: "Email resent",
|
|
1041
|
+
removeSuccess: "Removed from history"
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
);
|
|
1045
|
+
|
|
1046
|
+
// src/client/i18n/messages/marketing.ts
|
|
1047
|
+
var marketingMessages = defineMessages(
|
|
1048
|
+
{
|
|
1049
|
+
topFeatures: "Top-Features",
|
|
1050
|
+
tabs: {
|
|
1051
|
+
preview: "Public-Catalog Vorschau",
|
|
1052
|
+
admin: "Marketing-Verwaltung",
|
|
1053
|
+
promos: "Aktionen"
|
|
1054
|
+
},
|
|
1055
|
+
header: {
|
|
1056
|
+
title: "Marketing-Catalog",
|
|
1057
|
+
subtitle: "\xD6ffentliche Marketing-Projektion \xB7 gefilterte Sicht f\xFCr Website, Pricing-Page und Checkout",
|
|
1058
|
+
localesLabel: "Sprachen:",
|
|
1059
|
+
defaultLocale: "Default-Sprache",
|
|
1060
|
+
deactivateLocale: "Sprache deaktivieren",
|
|
1061
|
+
addLocale: "+ Sprache",
|
|
1062
|
+
refresh: "Aktualisieren"
|
|
1063
|
+
},
|
|
1064
|
+
page: {
|
|
1065
|
+
loading: "Lade Marketing-Catalog \u2026",
|
|
1066
|
+
emptyPlansBefore: "Noch keine Pl\xE4ne angelegt \u2014 der Marketing-Catalog projiziert ver\xF6ffentlichte Pl\xE4ne. Lege zuerst unter",
|
|
1067
|
+
emptyPlansLink: "Pl\xE4ne",
|
|
1068
|
+
emptyPlansAfter: "einen Plan mit Live-Version an."
|
|
1069
|
+
},
|
|
1070
|
+
cta: {
|
|
1071
|
+
contact: "Kontakt aufnehmen",
|
|
1072
|
+
trial: "Jetzt {days} Tage testen",
|
|
1073
|
+
choosePlan: "Plan w\xE4hlen"
|
|
1074
|
+
},
|
|
1075
|
+
preview: {
|
|
1076
|
+
eyebrow: "Preise & Pakete",
|
|
1077
|
+
hero: "Der passende Plan",
|
|
1078
|
+
sub: "Flexibel skalieren, jederzeit upgraden. Kein Setup-Fee, monatlich k\xFCndbar.",
|
|
1079
|
+
emptyBefore: "Kein Plan ist aktuell f\xFCr den Public-Catalog sichtbar. Aktiviere die Sichtbarkeit im Tab",
|
|
1080
|
+
emptyAfter: ".",
|
|
1081
|
+
priceOnRequest: "Auf Anfrage",
|
|
1082
|
+
perMonth: "/ Monat",
|
|
1083
|
+
regularPrice: "regul\xE4r",
|
|
1084
|
+
orYearly: "oder {price} j\xE4hrlich",
|
|
1085
|
+
trialNote: "{days} Tage kostenlos \xB7 keine Kreditkarte n\xF6tig",
|
|
1086
|
+
promoBadgeFallback: "Aktion",
|
|
1087
|
+
noTopFeatures: "Keine Top-Features gepflegt."
|
|
1088
|
+
},
|
|
1089
|
+
admin: {
|
|
1090
|
+
subtitle: "Sichtbarkeit, Reihenfolge & Highlight-Badges pro Plan \xB7 Edits gehen direkt live",
|
|
1091
|
+
colPlan: "Plan",
|
|
1092
|
+
colVisible: "Sichtbar",
|
|
1093
|
+
colBadge: "Badge",
|
|
1094
|
+
colPriority: "Priorit\xE4t",
|
|
1095
|
+
colHighlight: "Highlight",
|
|
1096
|
+
versionTabsLabel: "Plan-Versionen f\xFCr {plan}",
|
|
1097
|
+
versionTitle: "Version {version}: g\xFCltig {from} bis {until}{changeNote}",
|
|
1098
|
+
versionValidFromUnknown: "unbekannt",
|
|
1099
|
+
noLiveVersion: "keine Live-Version",
|
|
1100
|
+
hidden: "versteckt",
|
|
1101
|
+
featured: "Featured",
|
|
1102
|
+
live: "live",
|
|
1103
|
+
expandTitle: "Teaser, Trial & Top-Features bearbeiten",
|
|
1104
|
+
planNameLabel: "Plan-Name",
|
|
1105
|
+
planNameLocked: "wird in den Plan-Stammdaten gepflegt",
|
|
1106
|
+
planNameSourceValue: '\u201E{label}"',
|
|
1107
|
+
planNameFallbackHint: 'leer \xB7 Fallback auf \u201E{label}" wird verwendet',
|
|
1108
|
+
teaserLabel: "Teaser-Text",
|
|
1109
|
+
teaserPlaceholder: "Kurzbeschreibung f\xFCr die Pricing-Page \u2026",
|
|
1110
|
+
teaserHint: "erscheint unter dem Plannamen in der Vorschau",
|
|
1111
|
+
trialLabel: "Kostenlose Testphase",
|
|
1112
|
+
trialOn: "Trial aktiv",
|
|
1113
|
+
trialOff: "Kein Trial",
|
|
1114
|
+
trialDaysUnit: "Tage",
|
|
1115
|
+
ctaAutoHint: "CTA-Text generiert sich automatisch (\u201E{cta}\u201C).",
|
|
1116
|
+
ctaOverrideLabel: "CTA-Text \xFCberschreiben (optional)",
|
|
1117
|
+
ctaOverrideHint: "leer lassen f\xFCr Auto-Text",
|
|
1118
|
+
topFeatureCount: "{count} Eintr\xE4ge",
|
|
1119
|
+
featureLabelPlaceholder: "z. B. Beitragsverwaltung",
|
|
1120
|
+
featureStrongPlaceholder: "Highlight, z. B. bis 100",
|
|
1121
|
+
moveUp: "Nach oben",
|
|
1122
|
+
moveDown: "Nach unten",
|
|
1123
|
+
topFeaturesEmpty: "Noch keine Top-Features \u2014 f\xFCge Plan-Komponenten oder freien Text hinzu.",
|
|
1124
|
+
addCustomFeature: "Eigener Eintrag",
|
|
1125
|
+
suggestionsLabel: "aus Plan-Komponenten:",
|
|
1126
|
+
addSuggestionTitle: "\u201E{label}\u201C als Top-Feature \xFCbernehmen"
|
|
1127
|
+
},
|
|
1128
|
+
promotionsTab: {
|
|
1129
|
+
title: "Aktionen & Rabatte",
|
|
1130
|
+
subtitle: "Zeitlich begrenzte Preis-Aktionen \u2014 \xFCberschreiben den regul\xE4ren Preis auf der Pricing-Page (SPEC_V2 \xA79a).",
|
|
1131
|
+
add: "+ Aktion anlegen",
|
|
1132
|
+
timelineHead: "Aktions-Timeline \xB7 gestrichelt = heute",
|
|
1133
|
+
today: "heute",
|
|
1134
|
+
emptyBefore: "Noch keine Aktionen. \xDCber",
|
|
1135
|
+
emptyAfter: "eine zeitgesteuerte Preis-Aktion erstellen.",
|
|
1136
|
+
statusActive: "aktiv",
|
|
1137
|
+
statusScheduled: "geplant",
|
|
1138
|
+
statusExpired: "abgelaufen",
|
|
1139
|
+
noPlans: "\u2014 keine Pl\xE4ne \u2014",
|
|
1140
|
+
cycleMonthlyShort: "mtl.",
|
|
1141
|
+
cycleYearlyShort: "j\xE4hrl.",
|
|
1142
|
+
cycleBothShort: "mtl. & j\xE4hrl.",
|
|
1143
|
+
onlyPrefix: "nur",
|
|
1144
|
+
chipIntro: "{price} \u20AC \xB7 {months} Mo.",
|
|
1145
|
+
chipFreeMonths: "{months} Mo. gratis",
|
|
1146
|
+
newPromotionLabel: "Neue Aktion",
|
|
1147
|
+
internalLabelLabel: "Interne Bezeichnung",
|
|
1148
|
+
typePercent: "Prozent-Rabatt",
|
|
1149
|
+
typeAmount: "Festbetrag",
|
|
1150
|
+
typeIntro: "Einf\xFChrungspreis",
|
|
1151
|
+
typeFreeMonths: "Gratis-Monate",
|
|
1152
|
+
valueLabel: "Wert",
|
|
1153
|
+
percentUnit: "% Rabatt",
|
|
1154
|
+
amountUnit: "\u20AC Festbetrag",
|
|
1155
|
+
introForPrefix: "f\xFCr",
|
|
1156
|
+
introMonthsUnit: "Monate \xE0",
|
|
1157
|
+
introPriceUnit: "\u20AC/Mo",
|
|
1158
|
+
freeMonthsPrefix: "erste",
|
|
1159
|
+
freeMonthsUnit: "Monate gratis",
|
|
1160
|
+
billingCycleLabel: "Abrechnungs-Zyklus",
|
|
1161
|
+
priorityLabel: "Priorit\xE4t",
|
|
1162
|
+
appliesToLabel: "Betroffene Pl\xE4ne",
|
|
1163
|
+
localeRestrictionLabel: "Sprach-Beschr\xE4nkung",
|
|
1164
|
+
allLocales: "alle Sprachen",
|
|
1165
|
+
translationsLabel: "\xDCbersetzungen",
|
|
1166
|
+
badgePlaceholder: "Badge-Text",
|
|
1167
|
+
fineprintPlaceholder: "Fineprint (unter dem CTA)",
|
|
1168
|
+
colorLabel: "Farbe",
|
|
1169
|
+
delete: "Aktion l\xF6schen",
|
|
1170
|
+
deleteConfirm: "Aktion \u201E{label}\u201C wirklich l\xF6schen?"
|
|
1171
|
+
},
|
|
1172
|
+
errors: {
|
|
1173
|
+
projectionsApi: "MarketingProjections-API antwortete mit HTTP {status}"
|
|
1174
|
+
}
|
|
1175
|
+
},
|
|
1176
|
+
{
|
|
1177
|
+
topFeatures: "Top features",
|
|
1178
|
+
tabs: {
|
|
1179
|
+
preview: "Public catalog preview",
|
|
1180
|
+
admin: "Marketing administration",
|
|
1181
|
+
promos: "Promotions"
|
|
1182
|
+
},
|
|
1183
|
+
header: {
|
|
1184
|
+
title: "Marketing catalog",
|
|
1185
|
+
subtitle: "Public marketing projection \xB7 filtered view for website, pricing page and checkout",
|
|
1186
|
+
localesLabel: "Languages:",
|
|
1187
|
+
defaultLocale: "Default language",
|
|
1188
|
+
deactivateLocale: "Deactivate language",
|
|
1189
|
+
addLocale: "+ Language",
|
|
1190
|
+
refresh: "Refresh"
|
|
1191
|
+
},
|
|
1192
|
+
page: {
|
|
1193
|
+
loading: "Loading marketing catalog \u2026",
|
|
1194
|
+
emptyPlansBefore: "No plans created yet \u2014 the marketing catalog projects published plans. Go to",
|
|
1195
|
+
emptyPlansLink: "Plans",
|
|
1196
|
+
emptyPlansAfter: "first and create a plan with a live version."
|
|
1197
|
+
},
|
|
1198
|
+
cta: {
|
|
1199
|
+
contact: "Get in touch",
|
|
1200
|
+
trial: "Start your {days}-day trial",
|
|
1201
|
+
choosePlan: "Choose plan"
|
|
1202
|
+
},
|
|
1203
|
+
preview: {
|
|
1204
|
+
eyebrow: "Pricing & plans",
|
|
1205
|
+
hero: "The right plan for you",
|
|
1206
|
+
sub: "Scale flexibly, upgrade anytime. No setup fee, cancel monthly.",
|
|
1207
|
+
emptyBefore: "No plan is currently visible in the public catalog. Enable visibility in the",
|
|
1208
|
+
emptyAfter: " tab.",
|
|
1209
|
+
priceOnRequest: "On request",
|
|
1210
|
+
perMonth: "/ month",
|
|
1211
|
+
regularPrice: "regular",
|
|
1212
|
+
orYearly: "or {price} yearly",
|
|
1213
|
+
trialNote: "{days} days free \xB7 no credit card required",
|
|
1214
|
+
promoBadgeFallback: "Promotion",
|
|
1215
|
+
noTopFeatures: "No top features maintained."
|
|
1216
|
+
},
|
|
1217
|
+
admin: {
|
|
1218
|
+
subtitle: "Visibility, order & highlight badges per plan \xB7 edits go live immediately",
|
|
1219
|
+
colPlan: "Plan",
|
|
1220
|
+
colVisible: "Visible",
|
|
1221
|
+
colBadge: "Badge",
|
|
1222
|
+
colPriority: "Priority",
|
|
1223
|
+
colHighlight: "Highlight",
|
|
1224
|
+
versionTabsLabel: "Plan versions for {plan}",
|
|
1225
|
+
versionTitle: "Version {version}: valid {from} to {until}{changeNote}",
|
|
1226
|
+
versionValidFromUnknown: "unknown",
|
|
1227
|
+
noLiveVersion: "no live version",
|
|
1228
|
+
hidden: "hidden",
|
|
1229
|
+
featured: "Featured",
|
|
1230
|
+
live: "live",
|
|
1231
|
+
expandTitle: "Edit teaser, trial & top features",
|
|
1232
|
+
planNameLabel: "Plan name",
|
|
1233
|
+
planNameLocked: "maintained in the plan master data",
|
|
1234
|
+
planNameSourceValue: '"{label}"',
|
|
1235
|
+
planNameFallbackHint: 'empty \xB7 fallback to "{label}" is used',
|
|
1236
|
+
teaserLabel: "Teaser text",
|
|
1237
|
+
teaserPlaceholder: "Short description for the pricing page \u2026",
|
|
1238
|
+
teaserHint: "appears below the plan name in the preview",
|
|
1239
|
+
trialLabel: "Free trial",
|
|
1240
|
+
trialOn: "Trial active",
|
|
1241
|
+
trialOff: "No trial",
|
|
1242
|
+
trialDaysUnit: "days",
|
|
1243
|
+
ctaAutoHint: 'The CTA text is generated automatically ("{cta}").',
|
|
1244
|
+
ctaOverrideLabel: "Override CTA text (optional)",
|
|
1245
|
+
ctaOverrideHint: "leave empty for the auto text",
|
|
1246
|
+
topFeatureCount: "{count} entries",
|
|
1247
|
+
featureLabelPlaceholder: "e.g. Membership management",
|
|
1248
|
+
featureStrongPlaceholder: "Highlight, e.g. up to 100",
|
|
1249
|
+
moveUp: "Move up",
|
|
1250
|
+
moveDown: "Move down",
|
|
1251
|
+
topFeaturesEmpty: "No top features yet \u2014 add plan components or free text.",
|
|
1252
|
+
addCustomFeature: "Custom entry",
|
|
1253
|
+
suggestionsLabel: "from plan components:",
|
|
1254
|
+
addSuggestionTitle: 'Add "{label}" as a top feature'
|
|
1255
|
+
},
|
|
1256
|
+
promotionsTab: {
|
|
1257
|
+
title: "Promotions & discounts",
|
|
1258
|
+
subtitle: "Time-limited price promotions \u2014 they override the regular price on the pricing page (SPEC_V2 \xA79a).",
|
|
1259
|
+
add: "+ Create promotion",
|
|
1260
|
+
timelineHead: "Promotion timeline \xB7 dashed = today",
|
|
1261
|
+
today: "today",
|
|
1262
|
+
emptyBefore: "No promotions yet. Use",
|
|
1263
|
+
emptyAfter: "to create a time-controlled price promotion.",
|
|
1264
|
+
statusActive: "active",
|
|
1265
|
+
statusScheduled: "scheduled",
|
|
1266
|
+
statusExpired: "expired",
|
|
1267
|
+
noPlans: "\u2014 no plans \u2014",
|
|
1268
|
+
cycleMonthlyShort: "mth.",
|
|
1269
|
+
cycleYearlyShort: "yr.",
|
|
1270
|
+
cycleBothShort: "mth. & yr.",
|
|
1271
|
+
onlyPrefix: "only",
|
|
1272
|
+
chipIntro: "{price} \u20AC \xB7 {months} mo.",
|
|
1273
|
+
chipFreeMonths: "{months} mo. free",
|
|
1274
|
+
newPromotionLabel: "New promotion",
|
|
1275
|
+
internalLabelLabel: "Internal label",
|
|
1276
|
+
typePercent: "Percentage discount",
|
|
1277
|
+
typeAmount: "Fixed amount",
|
|
1278
|
+
typeIntro: "Introductory price",
|
|
1279
|
+
typeFreeMonths: "Free months",
|
|
1280
|
+
valueLabel: "Value",
|
|
1281
|
+
percentUnit: "% discount",
|
|
1282
|
+
amountUnit: "\u20AC fixed amount",
|
|
1283
|
+
introForPrefix: "for",
|
|
1284
|
+
introMonthsUnit: "months at",
|
|
1285
|
+
introPriceUnit: "\u20AC/mo",
|
|
1286
|
+
freeMonthsPrefix: "first",
|
|
1287
|
+
freeMonthsUnit: "months free",
|
|
1288
|
+
billingCycleLabel: "Billing cycle",
|
|
1289
|
+
priorityLabel: "Priority",
|
|
1290
|
+
appliesToLabel: "Affected plans",
|
|
1291
|
+
localeRestrictionLabel: "Language restriction",
|
|
1292
|
+
allLocales: "all languages",
|
|
1293
|
+
translationsLabel: "Translations",
|
|
1294
|
+
badgePlaceholder: "Badge text",
|
|
1295
|
+
fineprintPlaceholder: "Fine print (below the CTA)",
|
|
1296
|
+
colorLabel: "Color",
|
|
1297
|
+
delete: "Delete promotion",
|
|
1298
|
+
deleteConfirm: 'Really delete promotion "{label}"?'
|
|
1299
|
+
},
|
|
1300
|
+
errors: {
|
|
1301
|
+
projectionsApi: "MarketingProjections API responded with HTTP {status}"
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1304
|
+
);
|
|
1305
|
+
|
|
1306
|
+
// src/client/i18n/messages/nav.ts
|
|
1307
|
+
var navMessages = defineMessages(
|
|
1308
|
+
{
|
|
1309
|
+
pages: {
|
|
1310
|
+
dashboard: "Dashboard",
|
|
1311
|
+
tenants: "Mandanten",
|
|
1312
|
+
subscriptions: "Abonnements",
|
|
1313
|
+
promoCodes: "Promo-Codes",
|
|
1314
|
+
plans: "Pl\xE4ne & Versionen",
|
|
1315
|
+
planVersions: "Plan-Versionen",
|
|
1316
|
+
audit: "Audit-Log",
|
|
1317
|
+
users: "Benutzer",
|
|
1318
|
+
pilots: "Piloten",
|
|
1319
|
+
discovery: "Discovery",
|
|
1320
|
+
bundles: "Bundles",
|
|
1321
|
+
marketingCatalog: "Marketing-Catalog",
|
|
1322
|
+
platformEmail: "Plattform-E-Mail",
|
|
1323
|
+
platformEmailHistory: "E-Mail-Verlauf"
|
|
1324
|
+
},
|
|
1325
|
+
sections: {
|
|
1326
|
+
overview: "\xDCbersicht",
|
|
1327
|
+
catalog: "Produktkatalog",
|
|
1328
|
+
customers: "Kunden",
|
|
1329
|
+
system: "System"
|
|
1330
|
+
}
|
|
1331
|
+
},
|
|
1332
|
+
{
|
|
1333
|
+
pages: {
|
|
1334
|
+
dashboard: "Dashboard",
|
|
1335
|
+
tenants: "Tenants",
|
|
1336
|
+
subscriptions: "Subscriptions",
|
|
1337
|
+
promoCodes: "Promo codes",
|
|
1338
|
+
plans: "Plans & versions",
|
|
1339
|
+
planVersions: "Plan versions",
|
|
1340
|
+
audit: "Audit log",
|
|
1341
|
+
users: "Users",
|
|
1342
|
+
pilots: "Pilots",
|
|
1343
|
+
discovery: "Discovery",
|
|
1344
|
+
bundles: "Bundles",
|
|
1345
|
+
marketingCatalog: "Marketing catalog",
|
|
1346
|
+
platformEmail: "Platform email",
|
|
1347
|
+
platformEmailHistory: "Email history"
|
|
1348
|
+
},
|
|
1349
|
+
sections: {
|
|
1350
|
+
overview: "Overview",
|
|
1351
|
+
catalog: "Product catalog",
|
|
1352
|
+
customers: "Customers",
|
|
1353
|
+
system: "System"
|
|
1354
|
+
}
|
|
1355
|
+
}
|
|
1356
|
+
);
|
|
1357
|
+
|
|
1358
|
+
// src/client/i18n/messages/pilots.ts
|
|
1359
|
+
var pilotsMessages = defineMessages(
|
|
1360
|
+
{
|
|
1361
|
+
title: "Pilot-Mandanten",
|
|
1362
|
+
subtitleCount: "{count} Pilot-Tenants insgesamt.",
|
|
1363
|
+
createAction: "Pilot anlegen",
|
|
1364
|
+
list: {
|
|
1365
|
+
tileExpiring: "L\xE4uft bald aus",
|
|
1366
|
+
tileExpiringHint: "\u2264 14 Tage",
|
|
1367
|
+
reviewSoonBanner: "{count} Pilot-Mandanten enden in den n\xE4chsten 30 Tagen \u2014 bitte pr\xFCfen.",
|
|
1368
|
+
columnSlug: "Slug",
|
|
1369
|
+
columnPlan: "Plan",
|
|
1370
|
+
columnNote: "Note",
|
|
1371
|
+
columnGrantedBy: "Granted by",
|
|
1372
|
+
columnEndsAt: "Endet",
|
|
1373
|
+
actionExtend: "Verl\xE4ngern",
|
|
1374
|
+
actionRevoke: "Widerrufen",
|
|
1375
|
+
actionFailed: "Aktion fehlgeschlagen",
|
|
1376
|
+
createdNotice: "Pilot {slug} angelegt.",
|
|
1377
|
+
createdPasswordCaption: "Initial-Passwort: {password}",
|
|
1378
|
+
updatedNotice: "Pilot {slug} aktualisiert.",
|
|
1379
|
+
updatedChangedCaption: "Ge\xE4ndert: {fields}",
|
|
1380
|
+
extendTitle: "Pilot {slug} verl\xE4ngern",
|
|
1381
|
+
extendMessage: "Neues Enddatum:",
|
|
1382
|
+
extendMfaDescription: 'Pilot "{slug}" bis {until} verl\xE4ngern.',
|
|
1383
|
+
extendSuccess: "Pilot bis {until} verl\xE4ngert.",
|
|
1384
|
+
revokeTitle: "Pilot {slug} widerrufen",
|
|
1385
|
+
revokeMessage: "Pilot-Status entfernen. Subscription bleibt bestehen.",
|
|
1386
|
+
revokeMfaDescription: 'Pilot-Status f\xFCr "{slug}" widerrufen.',
|
|
1387
|
+
revokeSuccess: "Pilot widerrufen."
|
|
1388
|
+
},
|
|
1389
|
+
copyDefaults: {
|
|
1390
|
+
tenantSubtitle: "Stammdaten des Mandanten",
|
|
1391
|
+
tenantNameLabel: "Name des Mandanten",
|
|
1392
|
+
tenantNamePlaceholder: "z. B. Muster GmbH",
|
|
1393
|
+
slugPlaceholder: "muster-mandant",
|
|
1394
|
+
adminEmailPlaceholder: "admin@example.com",
|
|
1395
|
+
notePlaceholder: "z. B. Sales-Pilot \xB7 Demo-Zugang"
|
|
1396
|
+
},
|
|
1397
|
+
form: {
|
|
1398
|
+
slugLabel: "Slug",
|
|
1399
|
+
slugHint: "wird automatisch aus dem Namen erzeugt",
|
|
1400
|
+
slugConflict: "Dieser Slug ist bereits vergeben.",
|
|
1401
|
+
planLabel: "Plan",
|
|
1402
|
+
endsAtLabel: "Endet am",
|
|
1403
|
+
endsAtClearTitle: "Auf unbegrenzt setzen",
|
|
1404
|
+
preset30Days: "30 Tage",
|
|
1405
|
+
preset90Days: "90 Tage",
|
|
1406
|
+
preset6Months: "6 Monate",
|
|
1407
|
+
preset1Year: "1 Jahr",
|
|
1408
|
+
noteLabel: "Note",
|
|
1409
|
+
noteHint: "intern \xB7 nicht f\xFCr Kunden sichtbar"
|
|
1410
|
+
},
|
|
1411
|
+
createDialog: {
|
|
1412
|
+
title: "Pilot-Mandant anlegen",
|
|
1413
|
+
subtitle: "Neuer Mandant + Initial-Admin werden in einem Schritt angelegt.",
|
|
1414
|
+
sectionTenant: "Mandant",
|
|
1415
|
+
legalFormLabel: "Rechtsform",
|
|
1416
|
+
legalFormPlaceholder: "e.V., GmbH, \u2026",
|
|
1417
|
+
vatIdLabel: "USt-IdNr.",
|
|
1418
|
+
vatIdHint: "optional",
|
|
1419
|
+
vatIdPlaceholder: "DE123456789",
|
|
1420
|
+
sectionAdmin: "Initial-Admin",
|
|
1421
|
+
sectionAdminSub: "Erh\xE4lt eine Einladungs-E-Mail mit Initial-Passwort.",
|
|
1422
|
+
emailLabel: "E-Mail",
|
|
1423
|
+
emailInvalid: "Bitte eine g\xFCltige E-Mail-Adresse eingeben.",
|
|
1424
|
+
firstNameLabel: "Vorname",
|
|
1425
|
+
firstNamePlaceholder: "Erika",
|
|
1426
|
+
lastNameLabel: "Nachname",
|
|
1427
|
+
lastNamePlaceholder: "Mustermann",
|
|
1428
|
+
initialPasswordLabel: "Initial-Passwort",
|
|
1429
|
+
initialPasswordHint: "leer lassen \u2192 automatisch generieren",
|
|
1430
|
+
initialPasswordPlaceholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022 (automatisch generieren)",
|
|
1431
|
+
sectionPilot: "Pilot-Konfiguration",
|
|
1432
|
+
sectionPilotSub: "Plan-Zuweisung, Laufzeit und interne Notiz",
|
|
1433
|
+
invitationHint: "Einladung geht an",
|
|
1434
|
+
mfaDescription: 'Pilot-Mandant "{name}" anlegen \u2014 Plan {plan}.'
|
|
1435
|
+
},
|
|
1436
|
+
editDialog: {
|
|
1437
|
+
title: "Pilot bearbeiten",
|
|
1438
|
+
sectionPlanSub: 'Aktive Plan-Zuweisung. Legacy-Plans tauchen als \u201Enicht im Katalog" auf.',
|
|
1439
|
+
planNotInCatalog: "{plan} (nicht im Katalog)",
|
|
1440
|
+
sectionEndDate: "Enddatum",
|
|
1441
|
+
sectionEndDateSub: "Leeres Datum = offene Pilotphase ohne Ablauf.",
|
|
1442
|
+
clearDateTitle: "Datum l\xF6schen \u2014 offene Pilotphase",
|
|
1443
|
+
sectionNote: "Notiz",
|
|
1444
|
+
sectionNoteSub: "Intern \xB7 nicht f\xFCr Kunden sichtbar.",
|
|
1445
|
+
mfaDescription: 'Pilot "{name}" bearbeiten.'
|
|
1446
|
+
},
|
|
1447
|
+
mfa: {
|
|
1448
|
+
invalidCode: "TOTP-Code ung\xFCltig.",
|
|
1449
|
+
invalidOrNotSetUp: "TOTP-Code ung\xFCltig oder MFA nicht eingerichtet.",
|
|
1450
|
+
notSetUp: "MFA ist f\xFCr diesen Account nicht eingerichtet."
|
|
1451
|
+
}
|
|
1452
|
+
},
|
|
1453
|
+
{
|
|
1454
|
+
title: "Pilot tenants",
|
|
1455
|
+
subtitleCount: "{count} pilot tenants in total.",
|
|
1456
|
+
createAction: "Create pilot",
|
|
1457
|
+
list: {
|
|
1458
|
+
tileExpiring: "Expiring soon",
|
|
1459
|
+
tileExpiringHint: "\u2264 14 days",
|
|
1460
|
+
reviewSoonBanner: "{count} pilot tenants end within the next 30 days \u2014 please review.",
|
|
1461
|
+
columnSlug: "Slug",
|
|
1462
|
+
columnPlan: "Plan",
|
|
1463
|
+
columnNote: "Note",
|
|
1464
|
+
columnGrantedBy: "Granted by",
|
|
1465
|
+
columnEndsAt: "Ends",
|
|
1466
|
+
actionExtend: "Extend",
|
|
1467
|
+
actionRevoke: "Revoke",
|
|
1468
|
+
actionFailed: "Action failed",
|
|
1469
|
+
createdNotice: "Pilot {slug} created.",
|
|
1470
|
+
createdPasswordCaption: "Initial password: {password}",
|
|
1471
|
+
updatedNotice: "Pilot {slug} updated.",
|
|
1472
|
+
updatedChangedCaption: "Changed: {fields}",
|
|
1473
|
+
extendTitle: "Extend pilot {slug}",
|
|
1474
|
+
extendMessage: "New end date:",
|
|
1475
|
+
extendMfaDescription: 'Extend pilot "{slug}" until {until}.',
|
|
1476
|
+
extendSuccess: "Pilot extended until {until}.",
|
|
1477
|
+
revokeTitle: "Revoke pilot {slug}",
|
|
1478
|
+
revokeMessage: "Remove pilot status. The subscription remains.",
|
|
1479
|
+
revokeMfaDescription: 'Revoke pilot status for "{slug}".',
|
|
1480
|
+
revokeSuccess: "Pilot revoked."
|
|
1481
|
+
},
|
|
1482
|
+
copyDefaults: {
|
|
1483
|
+
tenantSubtitle: "Master data of the tenant",
|
|
1484
|
+
tenantNameLabel: "Name of the tenant",
|
|
1485
|
+
tenantNamePlaceholder: "e.g. Example Ltd.",
|
|
1486
|
+
slugPlaceholder: "example-tenant",
|
|
1487
|
+
adminEmailPlaceholder: "admin@example.com",
|
|
1488
|
+
notePlaceholder: "e.g. sales pilot \xB7 demo access"
|
|
1489
|
+
},
|
|
1490
|
+
form: {
|
|
1491
|
+
slugLabel: "Slug",
|
|
1492
|
+
slugHint: "generated automatically from the name",
|
|
1493
|
+
slugConflict: "This slug is already taken.",
|
|
1494
|
+
planLabel: "Plan",
|
|
1495
|
+
endsAtLabel: "Ends on",
|
|
1496
|
+
endsAtClearTitle: "Set to unlimited",
|
|
1497
|
+
preset30Days: "30 days",
|
|
1498
|
+
preset90Days: "90 days",
|
|
1499
|
+
preset6Months: "6 months",
|
|
1500
|
+
preset1Year: "1 year",
|
|
1501
|
+
noteLabel: "Note",
|
|
1502
|
+
noteHint: "internal \xB7 not visible to customers"
|
|
1503
|
+
},
|
|
1504
|
+
createDialog: {
|
|
1505
|
+
title: "Create pilot tenant",
|
|
1506
|
+
subtitle: "A new tenant and its initial admin are created in one step.",
|
|
1507
|
+
sectionTenant: "Tenant",
|
|
1508
|
+
legalFormLabel: "Legal form",
|
|
1509
|
+
legalFormPlaceholder: "Ltd., Inc., \u2026",
|
|
1510
|
+
vatIdLabel: "VAT ID",
|
|
1511
|
+
vatIdHint: "optional",
|
|
1512
|
+
vatIdPlaceholder: "DE123456789",
|
|
1513
|
+
sectionAdmin: "Initial admin",
|
|
1514
|
+
sectionAdminSub: "Receives an invitation email containing the initial password.",
|
|
1515
|
+
emailLabel: "Email",
|
|
1516
|
+
emailInvalid: "Please enter a valid email address.",
|
|
1517
|
+
firstNameLabel: "First name",
|
|
1518
|
+
firstNamePlaceholder: "Jane",
|
|
1519
|
+
lastNameLabel: "Last name",
|
|
1520
|
+
lastNamePlaceholder: "Doe",
|
|
1521
|
+
initialPasswordLabel: "Initial password",
|
|
1522
|
+
initialPasswordHint: "leave empty \u2192 generate automatically",
|
|
1523
|
+
initialPasswordPlaceholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022 (generate automatically)",
|
|
1524
|
+
sectionPilot: "Pilot configuration",
|
|
1525
|
+
sectionPilotSub: "Plan assignment, duration and internal note",
|
|
1526
|
+
invitationHint: "Invitation will be sent to",
|
|
1527
|
+
mfaDescription: 'Create pilot tenant "{name}" \u2014 plan {plan}.'
|
|
1528
|
+
},
|
|
1529
|
+
editDialog: {
|
|
1530
|
+
title: "Edit pilot",
|
|
1531
|
+
sectionPlanSub: 'Active plan assignment. Legacy plans appear as "not in the catalog".',
|
|
1532
|
+
planNotInCatalog: "{plan} (not in the catalog)",
|
|
1533
|
+
sectionEndDate: "End date",
|
|
1534
|
+
sectionEndDateSub: "Empty date = open-ended pilot phase.",
|
|
1535
|
+
clearDateTitle: "Clear date \u2014 open-ended pilot phase",
|
|
1536
|
+
sectionNote: "Note",
|
|
1537
|
+
sectionNoteSub: "Internal \xB7 not visible to customers.",
|
|
1538
|
+
mfaDescription: 'Edit pilot "{name}".'
|
|
1539
|
+
},
|
|
1540
|
+
mfa: {
|
|
1541
|
+
invalidCode: "TOTP code invalid.",
|
|
1542
|
+
invalidOrNotSetUp: "TOTP code invalid or MFA not set up.",
|
|
1543
|
+
notSetUp: "MFA is not set up for this account."
|
|
1544
|
+
}
|
|
1545
|
+
}
|
|
1546
|
+
);
|
|
1547
|
+
|
|
1548
|
+
// src/client/i18n/messages/plan-detail.ts
|
|
1549
|
+
var planDetailMessages = defineMessages(
|
|
1550
|
+
{
|
|
1551
|
+
header: {
|
|
1552
|
+
noDescription: "Keine Beschreibung.",
|
|
1553
|
+
nameEditHint: "Draft \xB7 Enter speichert \xB7 Esc bricht ab",
|
|
1554
|
+
editNameTitle: "Plan-Name im Draft bearbeiten",
|
|
1555
|
+
editNameAria: "Plan-Name bearbeiten",
|
|
1556
|
+
deletePlan: "Plan l\xF6schen",
|
|
1557
|
+
deletePlanTitle: "Plan l\xF6schen (nur ohne Mandanten und ohne published Versionen)",
|
|
1558
|
+
clonePlan: "Plan klonen",
|
|
1559
|
+
newDraftVersion: "Neue Draft-Version",
|
|
1560
|
+
publishDraft: "Draft v{version} ver\xF6ffentlichen",
|
|
1561
|
+
backToList: "Zur\xFCck zur Liste",
|
|
1562
|
+
viewInCatalog: "Im Katalog ansehen",
|
|
1563
|
+
draftAlreadyOpen: "Es gibt bereits eine offene Draft"
|
|
1564
|
+
},
|
|
1565
|
+
kpis: {
|
|
1566
|
+
activeVersion: "Aktive Version",
|
|
1567
|
+
activeSince: "seit {date}",
|
|
1568
|
+
noPublishedVersion: "keine ver\xF6ffentlichte Version",
|
|
1569
|
+
tenantImpact: "Tenant-Impact",
|
|
1570
|
+
tenantsOnPlan: "Mandanten auf diesem Plan",
|
|
1571
|
+
versions: "Versionen",
|
|
1572
|
+
versionsSummary: "{published} live/superseded",
|
|
1573
|
+
versionsSummaryWithDrafts: "{published} live/superseded \xB7 {drafts} Draft",
|
|
1574
|
+
openDraft: "Offener Draft",
|
|
1575
|
+
noDraft: "Kein Draft",
|
|
1576
|
+
readyToEdit: "Bereit zum Bearbeiten",
|
|
1577
|
+
noOpenDraft: "Keine Draft-Version offen",
|
|
1578
|
+
createNewDraft: "Neue Draft anlegen"
|
|
1579
|
+
},
|
|
1580
|
+
versions: {
|
|
1581
|
+
title: "Versionen",
|
|
1582
|
+
subtitle: "Pro Plan max. 1 offene Draft-Version \xB7 Publish setzt Vorg\xE4nger auf",
|
|
1583
|
+
newDraftButton: "Draft v{version}",
|
|
1584
|
+
timelineHint: "Klicke eine Version, um sie zu w\xE4hlen",
|
|
1585
|
+
timelineSelectTitle: "v{version} w\xE4hlen ({status})",
|
|
1586
|
+
timelineDraftSuffix: " \xB7 draft",
|
|
1587
|
+
timelineNow: "jetzt",
|
|
1588
|
+
colVersion: "Version",
|
|
1589
|
+
colValidity: "G\xFCltig",
|
|
1590
|
+
colPrice: "Preis",
|
|
1591
|
+
colPricing: "Pricing",
|
|
1592
|
+
colEffect: "Auswirkung",
|
|
1593
|
+
colImpact: "Impact",
|
|
1594
|
+
colChangeNote: "\xC4nderungsnotiz",
|
|
1595
|
+
colChangeNoteShort: "Change-Note",
|
|
1596
|
+
validityPlanned: "geplant",
|
|
1597
|
+
validityActive: "aktiv",
|
|
1598
|
+
validityHistoric: "historisch",
|
|
1599
|
+
perMonthUnit: "/ Mo",
|
|
1600
|
+
perYearUnit: "/ Jahr",
|
|
1601
|
+
tenants: "Mandanten",
|
|
1602
|
+
preActiveChip: "editierbar \xB7 noch nicht aktiv",
|
|
1603
|
+
preActiveTitle: "Published, aber noch nicht aktiv \u2014 Features, Quotas und Preis k\xF6nnen bis zum Aktivierungsdatum noch korrigiert werden",
|
|
1604
|
+
publishDraftTitle: "Draft ver\xF6ffentlichen",
|
|
1605
|
+
editFutureVersionTitle: "Future-Version bearbeiten",
|
|
1606
|
+
editDraftTitle: "Draft bearbeiten",
|
|
1607
|
+
endsAtTitle: "Endet am {date}",
|
|
1608
|
+
endsAtBadge: "Endet {date}",
|
|
1609
|
+
changeEndDateAction: "Enddatum\u2026",
|
|
1610
|
+
terminateAction: "Terminieren\u2026",
|
|
1611
|
+
empty: 'Noch keine Versionen \u2014 \u201ENeue Draft-Version" oben rechts.',
|
|
1612
|
+
publish: "Publish",
|
|
1613
|
+
viewDiff: "Diff",
|
|
1614
|
+
updatedToday: "heute",
|
|
1615
|
+
updatedDaysAgo: "vor {days} Tagen",
|
|
1616
|
+
updatedMonthsAgo: "vor {months} Monaten",
|
|
1617
|
+
updatedYearsAgo: "vor {years} Jahren"
|
|
1618
|
+
},
|
|
1619
|
+
diff: {
|
|
1620
|
+
title: "Diff",
|
|
1621
|
+
titleCompare: "Diff v{from} \u2192 v{to}",
|
|
1622
|
+
titleComponents: "Komponenten \xB7 v{version}",
|
|
1623
|
+
subOnPublish: "Was sich beim Publish \xE4ndert",
|
|
1624
|
+
subChanges: "\xC4nderungen v{from} \u2192 v{to}",
|
|
1625
|
+
subInitialVersion: "Initialversion \xB7 kein Vorg\xE4nger zum Vergleich",
|
|
1626
|
+
noComparison: "Kein Vergleich verf\xFCgbar",
|
|
1627
|
+
kindAdded: "Hinzugef\xFCgt",
|
|
1628
|
+
kindRemoved: "Entfernt",
|
|
1629
|
+
kindChanged: "Ge\xE4ndert",
|
|
1630
|
+
tagNew: "neu",
|
|
1631
|
+
tagRemoved: "entfernt",
|
|
1632
|
+
tagChanged: "ge\xE4ndert",
|
|
1633
|
+
emptyText: "v{selected} ist identisch zu v{predecessor}.",
|
|
1634
|
+
noChangesDetected: "Keine \xC4nderungen erkannt.",
|
|
1635
|
+
noComponentsTitle: "Keine Komponenten",
|
|
1636
|
+
noComponentsText: "Diese Version enth\xE4lt weder Features noch Quotas.",
|
|
1637
|
+
sectionFeatures: "Features \xB7 {count}",
|
|
1638
|
+
sectionQuotas: "Quotas \xB7 {count}",
|
|
1639
|
+
sectionBundles: "Bundles \xB7 {count}",
|
|
1640
|
+
sectionLabelFeatures: "Features",
|
|
1641
|
+
sectionLabelQuotas: "Quotas",
|
|
1642
|
+
sectionLabelPrice: "Preis",
|
|
1643
|
+
priceLabel: "Preis (Monat / Jahr)",
|
|
1644
|
+
priceYearMonthLabel: "Jahres- + Monatspreis",
|
|
1645
|
+
pricePair: "{monthly} / Mo \xB7 {yearly} / J"
|
|
1646
|
+
},
|
|
1647
|
+
impact: {
|
|
1648
|
+
subtitle: "Wer ist betroffen, wenn die n\xE4chste Version published wird",
|
|
1649
|
+
autoMigrate: "{count} auto-migrieren",
|
|
1650
|
+
needReview: "{count} brauchen Review",
|
|
1651
|
+
conflict: "{count} Konflikt",
|
|
1652
|
+
stateAuto: "auto",
|
|
1653
|
+
stateReview: "review",
|
|
1654
|
+
stateConflict: "Konflikt"
|
|
1655
|
+
},
|
|
1656
|
+
auditLog: {
|
|
1657
|
+
title: "Audit-Log",
|
|
1658
|
+
subtitle: "Letzte \xC4nderungen an diesem Plan",
|
|
1659
|
+
loading: "Lade Audit-Log\u2026",
|
|
1660
|
+
today: "heute \xB7 {time}"
|
|
1661
|
+
},
|
|
1662
|
+
terminateDialog: {
|
|
1663
|
+
titleChangeEndDate: "Enddatum \xE4ndern",
|
|
1664
|
+
titleTerminate: "Version terminieren",
|
|
1665
|
+
bodyPlanPrefix: "Plan",
|
|
1666
|
+
bodyExpiry: "\u2014 v{version} wird am gew\xE4hlten Datum auslaufen,",
|
|
1667
|
+
bodyWithout: "ohne",
|
|
1668
|
+
bodySuffix: "durch eine Nachfolge-Version ersetzt zu werden. Bestand-Subscriptions bleiben gebunden (Vertragsschutz P1); neue Buchungen sind ab diesem Datum nicht mehr m\xF6glich.",
|
|
1669
|
+
dateLabel: "Enddatum (YYYY-MM-DD)",
|
|
1670
|
+
submit: "Terminieren",
|
|
1671
|
+
errorDateNotFuture: "Das Datum muss in der Zukunft liegen.",
|
|
1672
|
+
errorVersionNotLive: "Diese Version ist nicht live (draft oder superseded) und kann nicht terminiert werden.",
|
|
1673
|
+
errorNotImplemented: "Backend unterst\xFCtzt Terminate noch nicht \u2014 bitte API-Server neu bauen.",
|
|
1674
|
+
errorFailed: "Terminate fehlgeschlagen."
|
|
1675
|
+
}
|
|
1676
|
+
},
|
|
1677
|
+
{
|
|
1678
|
+
header: {
|
|
1679
|
+
noDescription: "No description.",
|
|
1680
|
+
nameEditHint: "Draft \xB7 Enter saves \xB7 Esc cancels",
|
|
1681
|
+
editNameTitle: "Edit the plan name in the draft",
|
|
1682
|
+
editNameAria: "Edit plan name",
|
|
1683
|
+
deletePlan: "Delete plan",
|
|
1684
|
+
deletePlanTitle: "Delete plan (only without tenants and without published versions)",
|
|
1685
|
+
clonePlan: "Clone plan",
|
|
1686
|
+
newDraftVersion: "New draft version",
|
|
1687
|
+
publishDraft: "Publish draft v{version}",
|
|
1688
|
+
backToList: "Back to list",
|
|
1689
|
+
viewInCatalog: "View in catalog",
|
|
1690
|
+
draftAlreadyOpen: "There already is an open draft"
|
|
1691
|
+
},
|
|
1692
|
+
kpis: {
|
|
1693
|
+
activeVersion: "Active version",
|
|
1694
|
+
activeSince: "since {date}",
|
|
1695
|
+
noPublishedVersion: "no published version",
|
|
1696
|
+
tenantImpact: "Tenant impact",
|
|
1697
|
+
tenantsOnPlan: "Tenants on this plan",
|
|
1698
|
+
versions: "Versions",
|
|
1699
|
+
versionsSummary: "{published} live/superseded",
|
|
1700
|
+
versionsSummaryWithDrafts: "{published} live/superseded \xB7 {drafts} draft",
|
|
1701
|
+
openDraft: "Open draft",
|
|
1702
|
+
noDraft: "No draft",
|
|
1703
|
+
readyToEdit: "Ready to edit",
|
|
1704
|
+
noOpenDraft: "No draft version open",
|
|
1705
|
+
createNewDraft: "Create a new draft"
|
|
1706
|
+
},
|
|
1707
|
+
versions: {
|
|
1708
|
+
title: "Versions",
|
|
1709
|
+
subtitle: "Max. 1 open draft version per plan \xB7 Publishing sets the predecessor to",
|
|
1710
|
+
newDraftButton: "Draft v{version}",
|
|
1711
|
+
timelineHint: "Click a version to select it",
|
|
1712
|
+
timelineSelectTitle: "Select v{version} ({status})",
|
|
1713
|
+
timelineDraftSuffix: " \xB7 draft",
|
|
1714
|
+
timelineNow: "now",
|
|
1715
|
+
colVersion: "Version",
|
|
1716
|
+
colValidity: "Validity",
|
|
1717
|
+
colPrice: "Price",
|
|
1718
|
+
colPricing: "Pricing",
|
|
1719
|
+
colEffect: "Impact",
|
|
1720
|
+
colImpact: "Impact",
|
|
1721
|
+
colChangeNote: "Change note",
|
|
1722
|
+
colChangeNoteShort: "Change note",
|
|
1723
|
+
validityPlanned: "planned",
|
|
1724
|
+
validityActive: "active",
|
|
1725
|
+
validityHistoric: "historic",
|
|
1726
|
+
perMonthUnit: "/ mo",
|
|
1727
|
+
perYearUnit: "/ year",
|
|
1728
|
+
tenants: "Tenants",
|
|
1729
|
+
preActiveChip: "editable \xB7 not active yet",
|
|
1730
|
+
preActiveTitle: "Published but not active yet \u2014 features, quotas and price can still be corrected until the activation date",
|
|
1731
|
+
publishDraftTitle: "Publish draft",
|
|
1732
|
+
editFutureVersionTitle: "Edit future version",
|
|
1733
|
+
editDraftTitle: "Edit draft",
|
|
1734
|
+
endsAtTitle: "Ends on {date}",
|
|
1735
|
+
endsAtBadge: "Ends {date}",
|
|
1736
|
+
changeEndDateAction: "End date\u2026",
|
|
1737
|
+
terminateAction: "Terminate\u2026",
|
|
1738
|
+
empty: "No versions yet \u2014 use \u201CNew draft version\u201D at the top right.",
|
|
1739
|
+
publish: "Publish",
|
|
1740
|
+
viewDiff: "Diff",
|
|
1741
|
+
updatedToday: "today",
|
|
1742
|
+
updatedDaysAgo: "{days} days ago",
|
|
1743
|
+
updatedMonthsAgo: "{months} months ago",
|
|
1744
|
+
updatedYearsAgo: "{years} years ago"
|
|
1745
|
+
},
|
|
1746
|
+
diff: {
|
|
1747
|
+
title: "Diff",
|
|
1748
|
+
titleCompare: "Diff v{from} \u2192 v{to}",
|
|
1749
|
+
titleComponents: "Components \xB7 v{version}",
|
|
1750
|
+
subOnPublish: "What changes when publishing",
|
|
1751
|
+
subChanges: "Changes v{from} \u2192 v{to}",
|
|
1752
|
+
subInitialVersion: "Initial version \xB7 no predecessor to compare",
|
|
1753
|
+
noComparison: "No comparison available",
|
|
1754
|
+
kindAdded: "Added",
|
|
1755
|
+
kindRemoved: "Removed",
|
|
1756
|
+
kindChanged: "Changed",
|
|
1757
|
+
tagNew: "new",
|
|
1758
|
+
tagRemoved: "removed",
|
|
1759
|
+
tagChanged: "changed",
|
|
1760
|
+
emptyText: "v{selected} is identical to v{predecessor}.",
|
|
1761
|
+
noChangesDetected: "No changes detected.",
|
|
1762
|
+
noComponentsTitle: "No components",
|
|
1763
|
+
noComponentsText: "This version contains neither features nor quotas.",
|
|
1764
|
+
sectionFeatures: "Features \xB7 {count}",
|
|
1765
|
+
sectionQuotas: "Quotas \xB7 {count}",
|
|
1766
|
+
sectionBundles: "Bundles \xB7 {count}",
|
|
1767
|
+
sectionLabelFeatures: "Features",
|
|
1768
|
+
sectionLabelQuotas: "Quotas",
|
|
1769
|
+
sectionLabelPrice: "Price",
|
|
1770
|
+
priceLabel: "Price (month / year)",
|
|
1771
|
+
priceYearMonthLabel: "Yearly + monthly price",
|
|
1772
|
+
pricePair: "{monthly} / mo \xB7 {yearly} / yr"
|
|
1773
|
+
},
|
|
1774
|
+
impact: {
|
|
1775
|
+
subtitle: "Who is affected once the next version is published",
|
|
1776
|
+
autoMigrate: "{count} migrate automatically",
|
|
1777
|
+
needReview: "{count} need review",
|
|
1778
|
+
conflict: "{count} conflict",
|
|
1779
|
+
stateAuto: "auto",
|
|
1780
|
+
stateReview: "review",
|
|
1781
|
+
stateConflict: "Conflict"
|
|
1782
|
+
},
|
|
1783
|
+
auditLog: {
|
|
1784
|
+
title: "Audit log",
|
|
1785
|
+
subtitle: "Recent changes to this plan",
|
|
1786
|
+
loading: "Loading audit log\u2026",
|
|
1787
|
+
today: "today \xB7 {time}"
|
|
1788
|
+
},
|
|
1789
|
+
terminateDialog: {
|
|
1790
|
+
titleChangeEndDate: "Change end date",
|
|
1791
|
+
titleTerminate: "Terminate version",
|
|
1792
|
+
bodyPlanPrefix: "Plan",
|
|
1793
|
+
bodyExpiry: "\u2014 v{version} will expire on the selected date,",
|
|
1794
|
+
bodyWithout: "without",
|
|
1795
|
+
bodySuffix: "being replaced by a successor version. Existing subscriptions stay bound (contract protection P1); new bookings are no longer possible from that date on.",
|
|
1796
|
+
dateLabel: "End date (YYYY-MM-DD)",
|
|
1797
|
+
submit: "Terminate",
|
|
1798
|
+
errorDateNotFuture: "The date must be in the future.",
|
|
1799
|
+
errorVersionNotLive: "This version is not live (draft or superseded) and cannot be terminated.",
|
|
1800
|
+
errorNotImplemented: "The backend does not support terminate yet \u2014 please rebuild the API server.",
|
|
1801
|
+
errorFailed: "Terminate failed."
|
|
1802
|
+
}
|
|
1803
|
+
}
|
|
1804
|
+
);
|
|
1805
|
+
|
|
1806
|
+
// src/client/i18n/messages/plan-editor.ts
|
|
1807
|
+
var planEditorMessages = defineMessages(
|
|
1808
|
+
{
|
|
1809
|
+
perMonthShort: "/ Mo",
|
|
1810
|
+
perYearShort: "/ J",
|
|
1811
|
+
sections: {
|
|
1812
|
+
features: "Features",
|
|
1813
|
+
quotas: "Quotas",
|
|
1814
|
+
bundles: "Bundles",
|
|
1815
|
+
price: "Preis"
|
|
1816
|
+
},
|
|
1817
|
+
editor: {
|
|
1818
|
+
yearlySavings: "{percent} % g\xFCnstiger",
|
|
1819
|
+
validFromError: '\u201EG\xFCltig ab" ({draftDay}) muss nach dem \u201EG\xFCltig ab" der Vorg\xE4nger-Version v{version} ({prevDay}) liegen.',
|
|
1820
|
+
validUntilHintFallback: "ab-Datum \u2212 1 Tag",
|
|
1821
|
+
checklistPrices: "Preise gesetzt (Mo + J)",
|
|
1822
|
+
checklistChangeNote: "Change-Note vorhanden",
|
|
1823
|
+
checklistValidity: "G\xFCltigkeit gesetzt",
|
|
1824
|
+
checklistValidFromOrder: "G\xFCltig-ab liegt nach der Vorg\xE4nger-Version",
|
|
1825
|
+
checklistMinFeature: "Mindestens 1 Feature zugewiesen",
|
|
1826
|
+
checklistTenantImpact: "Tenant-Impact: <b>{count} Mandanten</b> erhalten v{version} automatisch",
|
|
1827
|
+
diffPriceLabel: "Monats- + Jahrespreis",
|
|
1828
|
+
diffTagAdded: "neu",
|
|
1829
|
+
diffTagRemoved: "entfernt",
|
|
1830
|
+
diffTagChanged: "ge\xE4ndert"
|
|
1831
|
+
},
|
|
1832
|
+
header: {
|
|
1833
|
+
planKicker: "PLAN",
|
|
1834
|
+
editDraft: "Draft v{version} bearbeiten",
|
|
1835
|
+
newVersion: "Neue Version v{version}",
|
|
1836
|
+
draftChip: "Draft",
|
|
1837
|
+
supersedeNoteBefore: "Vorg\xE4nger wird beim Publish auf",
|
|
1838
|
+
supersedeNoteAfter: "superseded",
|
|
1839
|
+
noPredecessorHint: "Keine Vorg\xE4nger-Version (v1)",
|
|
1840
|
+
diffButton: "Diff vs. Vorg\xE4nger",
|
|
1841
|
+
saveButton: "Weiter \xB7 Review"
|
|
1842
|
+
},
|
|
1843
|
+
componentPool: {
|
|
1844
|
+
title: "Komponenten",
|
|
1845
|
+
subtitle: "Aus der Library in den Plan-Korb ziehen",
|
|
1846
|
+
searchPlaceholder: "In allen Komponenten suchen\u2026",
|
|
1847
|
+
featureCount: "{count} Feature(s)",
|
|
1848
|
+
emptyFeatures: "Keine Features im Discovery-Snapshot.",
|
|
1849
|
+
emptyQuotas: "Keine Quotas im Discovery-Snapshot.",
|
|
1850
|
+
emptyBundles: "Keine published Bundles im Catalog."
|
|
1851
|
+
},
|
|
1852
|
+
basket: {
|
|
1853
|
+
title: "Plan-Korb \xB7 v{version}",
|
|
1854
|
+
subtitle: "Was dieser Plan enth\xE4lt \xB7 live editierbar",
|
|
1855
|
+
changeCount: "{count} \xC4nderungen",
|
|
1856
|
+
validFrom: "G\xFCltig ab",
|
|
1857
|
+
until: "bis",
|
|
1858
|
+
inPublicCatalog: "Im Public-Catalog",
|
|
1859
|
+
changeNotePlaceholder: "Change-Note (Pflicht beim Publish)\u2026",
|
|
1860
|
+
assignedCount: "{count} zugewiesen",
|
|
1861
|
+
bundleFeatureCount: "{count} Features",
|
|
1862
|
+
removeQuota: "Quota entfernen",
|
|
1863
|
+
removeFeature: "Feature entfernen",
|
|
1864
|
+
removeBundle: "Bundle entfernen",
|
|
1865
|
+
emptyQuotas: "Quotas aus der Library ziehen oder anklicken",
|
|
1866
|
+
emptyFeatures: "Features aus der Library ziehen oder anklicken",
|
|
1867
|
+
emptyBundles: "Keine Bundles zugewiesen \u2014 aus der Library ziehen"
|
|
1868
|
+
},
|
|
1869
|
+
catalogPreview: {
|
|
1870
|
+
title: "Live-Vorschau \xB7 Public-Catalog",
|
|
1871
|
+
subtitle: "So sehen Interessenten den Plan",
|
|
1872
|
+
desktop: "Desktop",
|
|
1873
|
+
mobile: "Mobil",
|
|
1874
|
+
eyebrow: "Unsere Pl\xE4ne \xB7 Vorschau Draft v{version}",
|
|
1875
|
+
descriptionFallback: "Plan-Beschreibung wird aus der Change-Note generiert.",
|
|
1876
|
+
perMonth: "/ Monat",
|
|
1877
|
+
yearlyAlternative: "oder {price} / Jahr \xB7 {savings}",
|
|
1878
|
+
cta: "Jetzt 30 Tage testen",
|
|
1879
|
+
included: "Enthalten",
|
|
1880
|
+
emptyContents: "Noch keine Inhalte zugewiesen.",
|
|
1881
|
+
footerLabel: "Marketing-Catalog",
|
|
1882
|
+
footerChangeNote: 'Change-Note \u201E{note}" wird bei Publish ver\xF6ffentlicht.',
|
|
1883
|
+
checklistTitle: "Publish-Checkliste",
|
|
1884
|
+
checklistCount: "{ok} / {total} ok"
|
|
1885
|
+
},
|
|
1886
|
+
diffDialog: {
|
|
1887
|
+
title: "Diff",
|
|
1888
|
+
subtitle: "Was sich gegen\xFCber der Vorg\xE4nger-Version \xE4ndert (aktueller, ungespeicherter Stand).",
|
|
1889
|
+
empty: "Keine \xC4nderungen gegen\xFCber der Vorg\xE4nger-Version."
|
|
1890
|
+
}
|
|
1891
|
+
},
|
|
1892
|
+
{
|
|
1893
|
+
perMonthShort: "/ mo",
|
|
1894
|
+
perYearShort: "/ yr",
|
|
1895
|
+
sections: {
|
|
1896
|
+
features: "Features",
|
|
1897
|
+
quotas: "Quotas",
|
|
1898
|
+
bundles: "Bundles",
|
|
1899
|
+
price: "Price"
|
|
1900
|
+
},
|
|
1901
|
+
editor: {
|
|
1902
|
+
yearlySavings: "{percent} % cheaper",
|
|
1903
|
+
validFromError: '"Valid from" ({draftDay}) must be later than the "Valid from" of predecessor version v{version} ({prevDay}).',
|
|
1904
|
+
validUntilHintFallback: "from-date \u2212 1 day",
|
|
1905
|
+
checklistPrices: "Prices set (mo + yr)",
|
|
1906
|
+
checklistChangeNote: "Change note present",
|
|
1907
|
+
checklistValidity: "Validity set",
|
|
1908
|
+
checklistValidFromOrder: "Valid-from is after the predecessor version",
|
|
1909
|
+
checklistMinFeature: "At least 1 feature assigned",
|
|
1910
|
+
checklistTenantImpact: "Tenant impact: <b>{count} tenants</b> automatically receive v{version}",
|
|
1911
|
+
diffPriceLabel: "Monthly + yearly price",
|
|
1912
|
+
diffTagAdded: "new",
|
|
1913
|
+
diffTagRemoved: "removed",
|
|
1914
|
+
diffTagChanged: "changed"
|
|
1915
|
+
},
|
|
1916
|
+
header: {
|
|
1917
|
+
planKicker: "PLAN",
|
|
1918
|
+
editDraft: "Edit draft v{version}",
|
|
1919
|
+
newVersion: "New version v{version}",
|
|
1920
|
+
draftChip: "Draft",
|
|
1921
|
+
supersedeNoteBefore: "Predecessor is superseded as of",
|
|
1922
|
+
supersedeNoteAfter: "on publish",
|
|
1923
|
+
noPredecessorHint: "No predecessor version (v1)",
|
|
1924
|
+
diffButton: "Diff vs. predecessor",
|
|
1925
|
+
saveButton: "Next \xB7 Review"
|
|
1926
|
+
},
|
|
1927
|
+
componentPool: {
|
|
1928
|
+
title: "Components",
|
|
1929
|
+
subtitle: "Drag from the library into the plan basket",
|
|
1930
|
+
searchPlaceholder: "Search all components\u2026",
|
|
1931
|
+
featureCount: "{count} feature(s)",
|
|
1932
|
+
emptyFeatures: "No features in the discovery snapshot.",
|
|
1933
|
+
emptyQuotas: "No quotas in the discovery snapshot.",
|
|
1934
|
+
emptyBundles: "No published bundles in the catalog."
|
|
1935
|
+
},
|
|
1936
|
+
basket: {
|
|
1937
|
+
title: "Plan basket \xB7 v{version}",
|
|
1938
|
+
subtitle: "What this plan contains \xB7 editable live",
|
|
1939
|
+
changeCount: "{count} changes",
|
|
1940
|
+
validFrom: "Valid from",
|
|
1941
|
+
until: "to",
|
|
1942
|
+
inPublicCatalog: "In public catalog",
|
|
1943
|
+
changeNotePlaceholder: "Change note (required on publish)\u2026",
|
|
1944
|
+
assignedCount: "{count} assigned",
|
|
1945
|
+
bundleFeatureCount: "{count} features",
|
|
1946
|
+
removeQuota: "Remove quota",
|
|
1947
|
+
removeFeature: "Remove feature",
|
|
1948
|
+
removeBundle: "Remove bundle",
|
|
1949
|
+
emptyQuotas: "Drag or click quotas from the library",
|
|
1950
|
+
emptyFeatures: "Drag or click features from the library",
|
|
1951
|
+
emptyBundles: "No bundles assigned \u2014 drag from the library"
|
|
1952
|
+
},
|
|
1953
|
+
catalogPreview: {
|
|
1954
|
+
title: "Live preview \xB7 public catalog",
|
|
1955
|
+
subtitle: "This is how prospects see the plan",
|
|
1956
|
+
desktop: "Desktop",
|
|
1957
|
+
mobile: "Mobile",
|
|
1958
|
+
eyebrow: "Our plans \xB7 preview draft v{version}",
|
|
1959
|
+
descriptionFallback: "The plan description is generated from the change note.",
|
|
1960
|
+
perMonth: "/ month",
|
|
1961
|
+
yearlyAlternative: "or {price} / year \xB7 {savings}",
|
|
1962
|
+
cta: "Start your 30-day trial",
|
|
1963
|
+
included: "Included",
|
|
1964
|
+
emptyContents: "No contents assigned yet.",
|
|
1965
|
+
footerLabel: "Marketing catalog",
|
|
1966
|
+
footerChangeNote: 'Change note "{note}" is published on publish.',
|
|
1967
|
+
checklistTitle: "Publish checklist",
|
|
1968
|
+
checklistCount: "{ok} / {total} ok"
|
|
1969
|
+
},
|
|
1970
|
+
diffDialog: {
|
|
1971
|
+
title: "Diff",
|
|
1972
|
+
subtitle: "What changes compared to the predecessor version (current, unsaved state).",
|
|
1973
|
+
empty: "No changes compared to the predecessor version."
|
|
1974
|
+
}
|
|
1975
|
+
}
|
|
1976
|
+
);
|
|
1977
|
+
|
|
1978
|
+
// src/client/i18n/messages/plan-versions.ts
|
|
1979
|
+
var planVersionsMessages = defineMessages(
|
|
1980
|
+
{
|
|
1981
|
+
compareEnd: "Vergleich beenden",
|
|
1982
|
+
page: {
|
|
1983
|
+
loadingCatalog: "Catalog wird geladen\u2026",
|
|
1984
|
+
noAuditLoader: "Kein Audit-Loader konfiguriert."
|
|
1985
|
+
},
|
|
1986
|
+
header: {
|
|
1987
|
+
modeList: "Plan-Liste",
|
|
1988
|
+
modeMatrix: "Feature-Matrix",
|
|
1989
|
+
modeAudit: "Aktivit\xE4t",
|
|
1990
|
+
publishedOn: "Publiziert {date}",
|
|
1991
|
+
openDrafts: "offene Drafts",
|
|
1992
|
+
regressionOne: "Regression",
|
|
1993
|
+
regressionMany: "Regressionen",
|
|
1994
|
+
startPublishFlow: "Publish-Flow starten",
|
|
1995
|
+
compareModeHint: "Vergleichsmodus aktiv \u2014 andere Ansichten deaktiviert"
|
|
1996
|
+
},
|
|
1997
|
+
status: {
|
|
1998
|
+
draft: "DRAFT",
|
|
1999
|
+
active: "AKTIV",
|
|
2000
|
+
archived: "ARCHIV"
|
|
2001
|
+
},
|
|
2002
|
+
timeline: {
|
|
2003
|
+
title: "Plan-Catalog",
|
|
2004
|
+
snapshotCount: "{count} Snapshots",
|
|
2005
|
+
noOpenDrafts: "keine offenen Drafts",
|
|
2006
|
+
openCount: "{count} offen",
|
|
2007
|
+
unknown: "unbekannt",
|
|
2008
|
+
compareHint: "Rechtsklick auf Snapshot \u2192 vergleichen"
|
|
2009
|
+
},
|
|
2010
|
+
list: {
|
|
2011
|
+
kpiPlans: "Pakete",
|
|
2012
|
+
kpiSelfService: "Self-Service",
|
|
2013
|
+
kpiOfTotal: "von {count}",
|
|
2014
|
+
kpiFeaturesTotal: "Features gesamt",
|
|
2015
|
+
missingPlansLabel: "Fehlende Pakete:",
|
|
2016
|
+
missingPlansHint: "\u2014 keine Live-Version in diesem Snapshot.",
|
|
2017
|
+
createDraftFor: "Draft f\xFCr {planId}",
|
|
2018
|
+
colPlan: "Paket",
|
|
2019
|
+
colPriceNet: "Preis (netto)",
|
|
2020
|
+
colFeatures: "Features",
|
|
2021
|
+
draftHintLabel: "Arbeitsstand:",
|
|
2022
|
+
draftHintBefore: "Drafts oben in der Liste. Limits, Preise und Features per Klick auf",
|
|
2023
|
+
draftHintEditButton: '\u201EBearbeiten"',
|
|
2024
|
+
draftHintMiddle: "\xE4ndern (ohne MFA). Erst",
|
|
2025
|
+
draftHintPublishFlow: "Publish-Flow",
|
|
2026
|
+
draftHintAfter: "(Validate \u2192 Diff-Review \u2192 MFA \u2192 Apply) macht sie f\xFCr k\xFCnftige Renewals wirksam."
|
|
2027
|
+
},
|
|
2028
|
+
matrix: {
|
|
2029
|
+
colFeature: "Feature",
|
|
2030
|
+
perMonthShort: "/Mo",
|
|
2031
|
+
fallbackGroup: "Sonstige"
|
|
2032
|
+
},
|
|
2033
|
+
diff: {
|
|
2034
|
+
legend: "Vergleich",
|
|
2035
|
+
plansChanged: "Pakete ge\xE4ndert",
|
|
2036
|
+
regressions: "Regressionen",
|
|
2037
|
+
sectionPlans: "Pakete",
|
|
2038
|
+
changeCountOne: "{count} \xC4nderung",
|
|
2039
|
+
changeCountMany: "{count} \xC4nderungen"
|
|
2040
|
+
},
|
|
2041
|
+
diffPreview: {
|
|
2042
|
+
empty: "Keine \xC4nderungen gegen\xFCber der Vorg\xE4ngerversion.",
|
|
2043
|
+
improvement: "Verbesserung",
|
|
2044
|
+
regression: "Verschlechterung",
|
|
2045
|
+
neutral: "Neutral"
|
|
2046
|
+
},
|
|
2047
|
+
diffFields: {
|
|
2048
|
+
featuresAdded: "Hinzugef\xFCgte Features",
|
|
2049
|
+
featuresRemoved: "Entfernte Features",
|
|
2050
|
+
maxUsers: "Max. Benutzer",
|
|
2051
|
+
maxStorageGb: "Speicher (GB)",
|
|
2052
|
+
monthlyNet: "Preis monatlich (netto)",
|
|
2053
|
+
yearlyNet: "Preis j\xE4hrlich (netto)",
|
|
2054
|
+
unitSize: "Einheitsgr\xF6\xDFe"
|
|
2055
|
+
},
|
|
2056
|
+
audit: {
|
|
2057
|
+
title: "Aktivit\xE4t",
|
|
2058
|
+
eventCount: "{count} Events",
|
|
2059
|
+
loading: "Audit-Trail wird geladen\u2026",
|
|
2060
|
+
empty: "Keine Plan-/Add-on-Events im Audit-Log gefunden.",
|
|
2061
|
+
actionPlanPublished: "Plan publiziert",
|
|
2062
|
+
actionPlanDraftCreated: "Plan-Draft angelegt",
|
|
2063
|
+
actionPlanDraftUpdated: "Plan-Draft ge\xE4ndert",
|
|
2064
|
+
actionPlanDraftDeleted: "Plan-Draft gel\xF6scht",
|
|
2065
|
+
actionCatalogPublished: "Catalog publiziert",
|
|
2066
|
+
detailRegression: "Mit mindestens einer Verschlechterung publiziert.",
|
|
2067
|
+
detailFieldsChanged: "{count} Felder ge\xE4ndert."
|
|
2068
|
+
},
|
|
2069
|
+
bulkPublish: {
|
|
2070
|
+
changeNoteRequired: "changeNote ist Pflicht beim Publish."
|
|
2071
|
+
},
|
|
2072
|
+
format: {
|
|
2073
|
+
priceIndividual: "individuell",
|
|
2074
|
+
today: "heute",
|
|
2075
|
+
yesterday: "gestern",
|
|
2076
|
+
daysAgo: "vor {count} Tagen",
|
|
2077
|
+
weeksAgoOne: "vor {count} Woche",
|
|
2078
|
+
weeksAgoMany: "vor {count} Wochen",
|
|
2079
|
+
monthsAgo: "vor {count} Monaten",
|
|
2080
|
+
yearsAgoOne: "vor {count} Jahr",
|
|
2081
|
+
yearsAgoMany: "vor {count} Jahren"
|
|
2082
|
+
},
|
|
2083
|
+
catalog: {
|
|
2084
|
+
draftsLabel: "Arbeitsstand",
|
|
2085
|
+
draftsTitleEmpty: "Keine offenen Drafts",
|
|
2086
|
+
draftsTitleOne: "{count} offener Draft bereit f\xFCr Publish",
|
|
2087
|
+
draftsTitleMany: "{count} offene Drafts bereit f\xFCr Publish",
|
|
2088
|
+
draftsDescriptionEmpty: "Lege einen Draft an, um Limits, Preise oder Features zu \xE4ndern. Drafts sind ohne MFA editierbar und werden erst beim Publish wirksam.",
|
|
2089
|
+
draftsDescription: "Diese Tabelle zeigt, wie der Catalog nach Publish aller Drafts aussehen w\xFCrde. Bestehende Mandanten bleiben auf der vorherigen Version, bis sie aktiv migriert werden.",
|
|
2090
|
+
activeLabel: "Aktuell",
|
|
2091
|
+
activeTitle: "Live-Catalog",
|
|
2092
|
+
activeDescription: "Diese Plan-Versionen sind aktuell f\xFCr neue Onboardings und f\xFCr Renewals nach Stichtag aktiv.",
|
|
2093
|
+
publishEvent: "Publish-Event",
|
|
2094
|
+
publishEventSingle: "{planId} v{version} publiziert",
|
|
2095
|
+
publishEventMultiple: "{count} Versionen publiziert",
|
|
2096
|
+
reconstructedSnapshot: "Snapshot rekonstruiert aus per-Entity-Versionen."
|
|
2097
|
+
}
|
|
2098
|
+
},
|
|
2099
|
+
{
|
|
2100
|
+
compareEnd: "End comparison",
|
|
2101
|
+
page: {
|
|
2102
|
+
loadingCatalog: "Loading catalog\u2026",
|
|
2103
|
+
noAuditLoader: "No audit loader configured."
|
|
2104
|
+
},
|
|
2105
|
+
header: {
|
|
2106
|
+
modeList: "Plan list",
|
|
2107
|
+
modeMatrix: "Feature matrix",
|
|
2108
|
+
modeAudit: "Activity",
|
|
2109
|
+
publishedOn: "Published {date}",
|
|
2110
|
+
openDrafts: "open drafts",
|
|
2111
|
+
regressionOne: "regression",
|
|
2112
|
+
regressionMany: "regressions",
|
|
2113
|
+
startPublishFlow: "Start publish flow",
|
|
2114
|
+
compareModeHint: "Comparison mode active \u2014 other views disabled"
|
|
2115
|
+
},
|
|
2116
|
+
status: {
|
|
2117
|
+
draft: "DRAFT",
|
|
2118
|
+
active: "ACTIVE",
|
|
2119
|
+
archived: "ARCHIVED"
|
|
2120
|
+
},
|
|
2121
|
+
timeline: {
|
|
2122
|
+
title: "Plan catalog",
|
|
2123
|
+
snapshotCount: "{count} snapshots",
|
|
2124
|
+
noOpenDrafts: "no open drafts",
|
|
2125
|
+
openCount: "{count} open",
|
|
2126
|
+
unknown: "unknown",
|
|
2127
|
+
compareHint: "Right-click a snapshot \u2192 compare"
|
|
2128
|
+
},
|
|
2129
|
+
list: {
|
|
2130
|
+
kpiPlans: "Plans",
|
|
2131
|
+
kpiSelfService: "Self-service",
|
|
2132
|
+
kpiOfTotal: "of {count}",
|
|
2133
|
+
kpiFeaturesTotal: "Features total",
|
|
2134
|
+
missingPlansLabel: "Missing plans:",
|
|
2135
|
+
missingPlansHint: "\u2014 no live version in this snapshot.",
|
|
2136
|
+
createDraftFor: "Draft for {planId}",
|
|
2137
|
+
colPlan: "Plan",
|
|
2138
|
+
colPriceNet: "Price (net)",
|
|
2139
|
+
colFeatures: "Features",
|
|
2140
|
+
draftHintLabel: "Working state:",
|
|
2141
|
+
draftHintBefore: "Drafts at the top of the list. Change limits, prices and features by clicking",
|
|
2142
|
+
draftHintEditButton: '"Edit"',
|
|
2143
|
+
draftHintMiddle: "(without MFA). Only the",
|
|
2144
|
+
draftHintPublishFlow: "publish flow",
|
|
2145
|
+
draftHintAfter: "(validate \u2192 diff review \u2192 MFA \u2192 apply) makes them effective for future renewals."
|
|
2146
|
+
},
|
|
2147
|
+
matrix: {
|
|
2148
|
+
colFeature: "Feature",
|
|
2149
|
+
perMonthShort: "/mo",
|
|
2150
|
+
fallbackGroup: "Other"
|
|
2151
|
+
},
|
|
2152
|
+
diff: {
|
|
2153
|
+
legend: "Comparison",
|
|
2154
|
+
plansChanged: "Plans changed",
|
|
2155
|
+
regressions: "Regressions",
|
|
2156
|
+
sectionPlans: "Plans",
|
|
2157
|
+
changeCountOne: "{count} change",
|
|
2158
|
+
changeCountMany: "{count} changes"
|
|
2159
|
+
},
|
|
2160
|
+
diffPreview: {
|
|
2161
|
+
empty: "No changes compared to the previous version.",
|
|
2162
|
+
improvement: "Improvement",
|
|
2163
|
+
regression: "Regression",
|
|
2164
|
+
neutral: "Neutral"
|
|
2165
|
+
},
|
|
2166
|
+
diffFields: {
|
|
2167
|
+
featuresAdded: "Added features",
|
|
2168
|
+
featuresRemoved: "Removed features",
|
|
2169
|
+
maxUsers: "Max. users",
|
|
2170
|
+
maxStorageGb: "Storage (GB)",
|
|
2171
|
+
monthlyNet: "Price monthly (net)",
|
|
2172
|
+
yearlyNet: "Price yearly (net)",
|
|
2173
|
+
unitSize: "Unit size"
|
|
2174
|
+
},
|
|
2175
|
+
audit: {
|
|
2176
|
+
title: "Activity",
|
|
2177
|
+
eventCount: "{count} events",
|
|
2178
|
+
loading: "Loading audit trail\u2026",
|
|
2179
|
+
empty: "No plan/add-on events found in the audit log.",
|
|
2180
|
+
actionPlanPublished: "Plan published",
|
|
2181
|
+
actionPlanDraftCreated: "Plan draft created",
|
|
2182
|
+
actionPlanDraftUpdated: "Plan draft changed",
|
|
2183
|
+
actionPlanDraftDeleted: "Plan draft deleted",
|
|
2184
|
+
actionCatalogPublished: "Catalog published",
|
|
2185
|
+
detailRegression: "Published with at least one regression.",
|
|
2186
|
+
detailFieldsChanged: "{count} fields changed."
|
|
2187
|
+
},
|
|
2188
|
+
bulkPublish: {
|
|
2189
|
+
changeNoteRequired: "changeNote is required when publishing."
|
|
2190
|
+
},
|
|
2191
|
+
format: {
|
|
2192
|
+
priceIndividual: "custom",
|
|
2193
|
+
today: "today",
|
|
2194
|
+
yesterday: "yesterday",
|
|
2195
|
+
daysAgo: "{count} days ago",
|
|
2196
|
+
weeksAgoOne: "{count} week ago",
|
|
2197
|
+
weeksAgoMany: "{count} weeks ago",
|
|
2198
|
+
monthsAgo: "{count} months ago",
|
|
2199
|
+
yearsAgoOne: "{count} year ago",
|
|
2200
|
+
yearsAgoMany: "{count} years ago"
|
|
2201
|
+
},
|
|
2202
|
+
catalog: {
|
|
2203
|
+
draftsLabel: "Working state",
|
|
2204
|
+
draftsTitleEmpty: "No open drafts",
|
|
2205
|
+
draftsTitleOne: "{count} open draft ready to publish",
|
|
2206
|
+
draftsTitleMany: "{count} open drafts ready to publish",
|
|
2207
|
+
draftsDescriptionEmpty: "Create a draft to change limits, prices or features. Drafts are editable without MFA and only take effect when published.",
|
|
2208
|
+
draftsDescription: "This table shows what the catalog would look like after publishing all drafts. Existing tenants stay on the previous version until they are actively migrated.",
|
|
2209
|
+
activeLabel: "Current",
|
|
2210
|
+
activeTitle: "Live catalog",
|
|
2211
|
+
activeDescription: "These plan versions are currently active for new onboardings and for renewals after the effective date.",
|
|
2212
|
+
publishEvent: "Publish event",
|
|
2213
|
+
publishEventSingle: "{planId} v{version} published",
|
|
2214
|
+
publishEventMultiple: "{count} versions published",
|
|
2215
|
+
reconstructedSnapshot: "Snapshot reconstructed from per-entity versions."
|
|
2216
|
+
}
|
|
2217
|
+
}
|
|
2218
|
+
);
|
|
2219
|
+
|
|
2220
|
+
// src/client/i18n/messages/plans.ts
|
|
2221
|
+
var plansMessages = defineMessages(
|
|
2222
|
+
{
|
|
2223
|
+
// PlansPage — shell of the plan area: loading state, toasts and the
|
|
2224
|
+
// error texts of the draft/publish/archive/discard actions.
|
|
2225
|
+
page: {
|
|
2226
|
+
loading: "Pl\xE4ne werden geladen\u2026",
|
|
2227
|
+
toastPlanCreated: "Plan {planKey} angelegt \u2014 jetzt die erste Version zusammenstellen.",
|
|
2228
|
+
toastDraftSaved: "Draft v{version} von {planKey} gespeichert.",
|
|
2229
|
+
toastPlanPublished: "Plan {planKey} wurde als v{version} ver\xF6ffentlicht \u2014 sichtbar im Katalog.",
|
|
2230
|
+
toastPlanDeleted: "Plan {planKey} komplett aus der DB gel\xF6scht.",
|
|
2231
|
+
toastDraftDiscarded: "Draft v{version} von {planKey} verworfen \u2014 Live-Version unver\xE4ndert.",
|
|
2232
|
+
toastVersionTerminated: "v{version} terminiert.",
|
|
2233
|
+
errorSessionExpiredSave: "Sitzung abgelaufen \u2014 bitte neu anmelden und erneut speichern.",
|
|
2234
|
+
errorStrictMode: "Strict-Mode-Check: {details}",
|
|
2235
|
+
errorStrictModeFallback: "Drift gegen den Discovery-Snapshot.",
|
|
2236
|
+
errorDraftRegression: "Diese Version ist regressiv (Feature entfernt / Quota gesenkt / Preis erh\xF6ht). Publish erfordert Force-Regressive \u2014 beim Speichern als Draft sollte das nicht auftreten.",
|
|
2237
|
+
errorSaveFailedHttp: "Speichern fehlgeschlagen (HTTP {status}).",
|
|
2238
|
+
errorSaveFailedDetail: "Speichern fehlgeschlagen: {message}",
|
|
2239
|
+
errorSaveFailedConsole: "Speichern fehlgeschlagen \u2014 Details siehe Browser-Konsole.",
|
|
2240
|
+
errorPlanHasPublishedVersions: "Plan hat published Versionen \u2014 kann nicht gel\xF6scht werden (Vertragsschutz P1).",
|
|
2241
|
+
errorPlanHasDrafts: "Plan hat noch einen offenen Draft \u2014 bitte erst \xFCber das M\xFClleimer-Icon verwerfen.",
|
|
2242
|
+
errorHardDeleteNotImplemented: "Backend unterst\xFCtzt Hard-Delete noch nicht \u2014 API-Server neu bauen + starten.",
|
|
2243
|
+
errorPlanAlreadyRemoved: "Plan wurde bereits entfernt (404). Liste wird neu geladen.",
|
|
2244
|
+
errorOperationFailedHttp: "Vorgang fehlgeschlagen (HTTP {status}).",
|
|
2245
|
+
errorOperationFailedDetail: "Vorgang fehlgeschlagen: {message}. Details siehe Browser-Konsole.",
|
|
2246
|
+
errorVersionAlreadyPublished: "Diese Version ist bereits published und kann nicht verworfen werden.",
|
|
2247
|
+
errorDiscardNotImplemented: "Backend unterst\xFCtzt das Verwerfen noch nicht \u2014 bitte API-Server neu bauen + starten.",
|
|
2248
|
+
errorDraftAlreadyRemoved: "Draft wurde bereits entfernt (404) \u2014 Liste wird gleich neu geladen.",
|
|
2249
|
+
errorDiscardFailedHttp: "Verwerfen fehlgeschlagen (HTTP {status}).",
|
|
2250
|
+
errorDiscardFailedDetail: "Verwerfen fehlgeschlagen: {message}. Details siehe Browser-Konsole (oft: API-Server alt gebaut oder CORS blockiert DELETE).",
|
|
2251
|
+
errorSessionExpiredPublish: "Sitzung abgelaufen \u2014 bitte neu anmelden und erneut versuchen.",
|
|
2252
|
+
errorPublishRegression: 'Diese Version ist regressiv. Aktiviere "Force-Publish", wenn der Schritt absichtlich ist.',
|
|
2253
|
+
errorValidFromRequired: 'Beim Publish muss "G\xFCltig ab" gesetzt sein. Bitte den Draft \xF6ffnen und das Datum eintragen.',
|
|
2254
|
+
errorValidFromNotAfterPrevious: '"G\xFCltig ab" muss strikt nach dem "G\xFCltig ab" der Vorg\xE4nger-Version liegen. Bitte ein sp\xE4teres Datum w\xE4hlen.',
|
|
2255
|
+
errorZeroPrice: 'Diese Version hat Preis 0,00 (Schutz gegen Seed-Platzhalter). Aktiviere "Preis 0,00 bewusst zulassen", wenn das ein gewollter kostenloser Sondervertrag ist.',
|
|
2256
|
+
errorPublishFailedHttp: "Publish fehlgeschlagen (HTTP {status})"
|
|
2257
|
+
},
|
|
2258
|
+
// Field labels of the regression report the publish endpoint returns.
|
|
2259
|
+
regressionFields: {
|
|
2260
|
+
monthlyNet: "Preis (monatlich, netto)",
|
|
2261
|
+
yearlyNet: "Preis (j\xE4hrlich, netto)",
|
|
2262
|
+
featuresRemoved: "Entfernte Features",
|
|
2263
|
+
featuresAdded: "Hinzugef\xFCgte Features",
|
|
2264
|
+
quotasLowered: "Gesenkte Quotas",
|
|
2265
|
+
quotasRaised: "Erh\xF6hte Quotas",
|
|
2266
|
+
bundlesRemoved: "Entfernte Bundles",
|
|
2267
|
+
bundlesAdded: "Hinzugef\xFCgte Bundles"
|
|
2268
|
+
},
|
|
2269
|
+
// PlanList — default plan overview with one row per plan.
|
|
2270
|
+
list: {
|
|
2271
|
+
title: "Alle Pl\xE4ne",
|
|
2272
|
+
summary: "{plans} Pl\xE4ne \xB7 {live} live \xB7 {drafts} offene Drafts \xB7 {tenants} Mandanten zugeordnet",
|
|
2273
|
+
matrixView: "Matrix-Ansicht",
|
|
2274
|
+
newPlan: "Neuer Plan",
|
|
2275
|
+
searchPlaceholder: "Plan suchen\u2026",
|
|
2276
|
+
sortedBy: "Sortiert nach: Order",
|
|
2277
|
+
columnPlan: "Plan",
|
|
2278
|
+
columnVersion: "Version",
|
|
2279
|
+
columnPrice: "Preis",
|
|
2280
|
+
columnTenants: "Mandanten",
|
|
2281
|
+
emptyNoPlans: 'Noch keine Pl\xE4ne \u2014 \xFCber \u201ENeuer Plan" oben rechts den ersten anlegen.',
|
|
2282
|
+
emptyNoMatch: 'Keine Pl\xE4ne entsprechen der Suche \u201E{query}".',
|
|
2283
|
+
badgeNew: "NEU",
|
|
2284
|
+
chipLive: "live",
|
|
2285
|
+
chipPrivate: "privat",
|
|
2286
|
+
chipNoLive: "keine live",
|
|
2287
|
+
chipScheduled: "geplant",
|
|
2288
|
+
chipDraft: "Draft",
|
|
2289
|
+
validFrom: "ab {date}",
|
|
2290
|
+
since: "seit",
|
|
2291
|
+
from: "ab",
|
|
2292
|
+
until: "bis",
|
|
2293
|
+
priceFree: "Kostenlos",
|
|
2294
|
+
perMonthShort: "/ Mo",
|
|
2295
|
+
perYearShort: "/ Jahr",
|
|
2296
|
+
tenantCount: "{count} Mandanten",
|
|
2297
|
+
noChangeNote: "keine Change-Note",
|
|
2298
|
+
actionDeleteBlocked: "Plan hat published Versionen \u2014 kann nicht gel\xF6scht werden (Vertragsschutz P1)",
|
|
2299
|
+
actionDeletePlan: "Plan komplett l\xF6schen",
|
|
2300
|
+
actionClonePlan: "Plan klonen",
|
|
2301
|
+
actionNewVersion: "Neue Version anlegen",
|
|
2302
|
+
actionOpenPlan: "Plan \xF6ffnen",
|
|
2303
|
+
actionDiscardDraft: "Draft v{version} verwerfen",
|
|
2304
|
+
actionEditDraft: "Draft bearbeiten",
|
|
2305
|
+
actionOpenInCockpit: "Im Cockpit \xF6ffnen"
|
|
2306
|
+
},
|
|
2307
|
+
// PlanMatrix — all plans side by side, components as rows.
|
|
2308
|
+
matrix: {
|
|
2309
|
+
title: "Pl\xE4ne \xB7 Matrix-Vergleich",
|
|
2310
|
+
summary: "Alle Pl\xE4ne nebeneinander \xB7 {plans} Pl\xE4ne \xB7 {features} Features \xB7 {quotas} Quotas \xB7 {bundles} Bundles",
|
|
2311
|
+
catalogPreview: "Catalog-Vorschau",
|
|
2312
|
+
createPlan: "Plan anlegen",
|
|
2313
|
+
createPlanSub: "oder Klon erstellen",
|
|
2314
|
+
componentColumn: "Komponente",
|
|
2315
|
+
chipLiveVersion: "v{version} live",
|
|
2316
|
+
chipNoLive: "keine live",
|
|
2317
|
+
chipDraftVersion: "v{version} Entwurf",
|
|
2318
|
+
priceFree: "Kostenlos",
|
|
2319
|
+
perMonthShort: "/ Mo",
|
|
2320
|
+
perYearShort: "/J",
|
|
2321
|
+
priceDraftMarker: "(Entwurf)",
|
|
2322
|
+
noPrices: "noch keine Preise",
|
|
2323
|
+
tenantCount: "{count} Mandanten",
|
|
2324
|
+
validFrom: "ab {date}",
|
|
2325
|
+
inCatalog: "im Katalog",
|
|
2326
|
+
private: "privat",
|
|
2327
|
+
clonePlan: "Plan klonen",
|
|
2328
|
+
groupQuotas: "Quotas",
|
|
2329
|
+
groupFeatures: "Features",
|
|
2330
|
+
groupBundles: "Bundles",
|
|
2331
|
+
baseBadge: "Basis \xB7 immer enthalten",
|
|
2332
|
+
legendIncluded: "enthalten",
|
|
2333
|
+
legendNotIncluded: "nicht enthalten",
|
|
2334
|
+
legendLoading: "lade Versionen\u2026"
|
|
2335
|
+
},
|
|
2336
|
+
// PlanReview — wizard step 3: read-only check before publishing.
|
|
2337
|
+
review: {
|
|
2338
|
+
title: "Review & Publish",
|
|
2339
|
+
subtitleLead: "Letzte Pr\xFCfung, bevor",
|
|
2340
|
+
subtitleTail: "live geht.",
|
|
2341
|
+
saving: "Wird gespeichert\u2026",
|
|
2342
|
+
saveAsDraft: "Als Draft speichern",
|
|
2343
|
+
publishBlocked: "Publish-Checkliste noch nicht vollst\xE4ndig",
|
|
2344
|
+
publishing: "Wird ver\xF6ffentlicht\u2026",
|
|
2345
|
+
publishVersion: "Publish v{version}",
|
|
2346
|
+
cardMasterData: "Stammdaten",
|
|
2347
|
+
labelPlanKey: "Plan-Key",
|
|
2348
|
+
labelDisplayName: "Anzeigename",
|
|
2349
|
+
missing: "fehlt",
|
|
2350
|
+
cardPricing: "Version v{version} \xB7 Pricing & Sichtbarkeit",
|
|
2351
|
+
labelValidFrom: "G\xFCltig ab",
|
|
2352
|
+
labelValidUntil: "G\xFCltig bis",
|
|
2353
|
+
missingRequiredOnPublish: "fehlt \u2014 beim Publish Pflicht",
|
|
2354
|
+
unlimited: "\u221E unbegrenzt",
|
|
2355
|
+
labelMonthlyPrice: "Preis monatlich",
|
|
2356
|
+
labelYearlyPrice: "Preis j\xE4hrlich",
|
|
2357
|
+
labelPublicCatalog: "Public-Catalog",
|
|
2358
|
+
visibleInCatalog: "Im Catalog sichtbar",
|
|
2359
|
+
hiddenFromCatalog: "Ausgeblendet",
|
|
2360
|
+
priceFree: "Kostenlos",
|
|
2361
|
+
cardComponents: "Komponenten \xB7 {total} insgesamt",
|
|
2362
|
+
componentQuotas: "Quotas \xB7 {count}",
|
|
2363
|
+
componentFeatures: "Features \xB7 {count}",
|
|
2364
|
+
componentBundles: "Bundles \xB7 {count}",
|
|
2365
|
+
componentEmpty: "keine",
|
|
2366
|
+
cardChangeNote: "Change-Note",
|
|
2367
|
+
changeNoteHint: "Wird im Audit-Log gespeichert und mit der Versions-History angezeigt.",
|
|
2368
|
+
changeNoteMissing: "Keine Change-Note \u2014 im Editor nachtragen (Pflicht beim Publish, Vertragsschutz\xA0P3).",
|
|
2369
|
+
cardChecklist: "Publish-Checkliste",
|
|
2370
|
+
checkPlanKey: "Plan-Key vergeben",
|
|
2371
|
+
checkDisplayName: "Anzeigename vorhanden",
|
|
2372
|
+
checkQuota: "Mindestens 1 Quota zugewiesen",
|
|
2373
|
+
checkFeature: "Mindestens 1 Feature zugewiesen",
|
|
2374
|
+
checkValidFrom: '\u201EG\xFCltig ab" gesetzt (Pflicht beim Publish)',
|
|
2375
|
+
checkValidFromAfterPredecessor: '\u201EG\xFCltig ab" liegt nach Vorg\xE4nger v{version}',
|
|
2376
|
+
checkValidFromAfterPrevious: '\u201EG\xFCltig ab" liegt nach der Vorg\xE4nger-Version',
|
|
2377
|
+
checkChangeNote: "Change-Note vorhanden (Vertragsschutz P3)",
|
|
2378
|
+
cardRegression: "Vertragsschutz P3 \u2014 Regression",
|
|
2379
|
+
regressionHint: "Wenn diese Version regressiv ist (Feature entfernt, Quota gesenkt, Preis erh\xF6ht), blockiert das Backend den Publish. Mit Force-Publish wird die Regression bewusst freigegeben und l\xF6st die Notification-Welle aus.",
|
|
2380
|
+
forceRegressive: "Force-Publish auch bei Regression",
|
|
2381
|
+
cardZeroPrice: "Preis 0,00",
|
|
2382
|
+
zeroPriceHint: "Standardm\xE4\xDFig blockt das Backend einen Publish mit Preis 0,00 (Schutz gegen Seed-Platzhalter). F\xFCr bewusst kostenlose Sondervertr\xE4ge hier freigeben.",
|
|
2383
|
+
allowZeroPrice: "Preis 0,00 bewusst zulassen",
|
|
2384
|
+
cardTenantImpact: "Tenant-Impact bei Publish",
|
|
2385
|
+
impactNone: "Aktuell sind keine Mandanten betroffen. Sobald die Version live ist, k\xF6nnen Mandanten den Plan im Catalog buchen.",
|
|
2386
|
+
impactSome: "{count} Mandant(en) auf der aktuellen Live-Version bleiben per Bestandsschutz (P1) auf ihrer Version \u2014 neue Buchungen laufen auf v{version}."
|
|
2387
|
+
},
|
|
2388
|
+
// PlanCreateDialog — step 1 of the "new plan" flow.
|
|
2389
|
+
createDialog: {
|
|
2390
|
+
title: "Neuen Plan anlegen",
|
|
2391
|
+
subtitle: "Plan-Stamm anlegen. Im n\xE4chsten Schritt weist du Features, Quotas und Bundles zu.",
|
|
2392
|
+
labelPlanKey: "Plan-Key",
|
|
2393
|
+
placeholderPlanKey: "z. B. SCALE",
|
|
2394
|
+
hintPlanKey: "Gro\xDFbuchstaben + Unterstriche \xB7 API-stabil, nicht \xE4nderbar nach Publish",
|
|
2395
|
+
labelDisplayName: "Anzeigename",
|
|
2396
|
+
placeholderDisplayName: "z. B. Scale",
|
|
2397
|
+
hintDisplayName: "Wie der Plan im Catalog erscheint",
|
|
2398
|
+
placeholderDescription: "Was bekommt der Kunde mit diesem Plan?",
|
|
2399
|
+
labelBasis: "Basis f\xFCr die erste Version",
|
|
2400
|
+
emptyPlan: "Leerer Plan",
|
|
2401
|
+
emptyPlanHint: "Im Editor alles selbst zusammenstellen",
|
|
2402
|
+
cloneOf: "Klon von {label}",
|
|
2403
|
+
counts: "{features} Features \xB7 {quotas} Quotas \xB7 {bundles} Bundles",
|
|
2404
|
+
errorKeyFormat: "Muss mit Buchstabe beginnen, nur A\u2013Z, 0\u20139, _.",
|
|
2405
|
+
errorKeyExists: '\u201E{key}" existiert bereits.',
|
|
2406
|
+
submitting: "Wird angelegt\u2026",
|
|
2407
|
+
submit: "Weiter \xB7 Komponenten"
|
|
2408
|
+
},
|
|
2409
|
+
// PlanPublishDialog — publish confirmation from the plan cockpit.
|
|
2410
|
+
publishDialog: {
|
|
2411
|
+
title: "Version publishen?",
|
|
2412
|
+
bodyLead: "Plan",
|
|
2413
|
+
bodyTail: ", Draft v{version}.",
|
|
2414
|
+
supersededNoteLead: "Eine ggf. zuvor live Version wird auf",
|
|
2415
|
+
supersededNoteTail: "gesetzt (Vertragsschutz P1: Bestand-Subscriptions bleiben auf der alten Version bis zum n\xE4chsten Renewal).",
|
|
2416
|
+
forceRegressive: "Force-Publish auch bei Regression (Feature entfernt / Quota gesenkt / Preis erh\xF6ht)",
|
|
2417
|
+
allowZeroPrice: "Preis 0,00 bewusst zulassen (kostenloser Sondervertrag)",
|
|
2418
|
+
regressiveChanges: "Regressive \xC4nderungen:",
|
|
2419
|
+
confirm: "Publish"
|
|
2420
|
+
},
|
|
2421
|
+
// PlanArchiveDialog — hard delete of a plan without published versions.
|
|
2422
|
+
archiveDialog: {
|
|
2423
|
+
title: "Plan komplett l\xF6schen?",
|
|
2424
|
+
bodyLead: "Plan",
|
|
2425
|
+
bodyVerb: "wird",
|
|
2426
|
+
bodyEmphasis: "unwiderruflich aus der DB entfernt",
|
|
2427
|
+
bodyTail: ". Da der Plan keine published Version hat, sind keine Subscriptions betroffen.",
|
|
2428
|
+
contractProtectionNote: "Vertragsschutz P1: Pl\xE4ne mit jemals ver\xF6ffentlichten Versionen k\xF6nnen nicht gel\xF6scht werden \u2014 das Backend w\xFCrde 422 antworten."
|
|
2429
|
+
},
|
|
2430
|
+
// PlanDiscardDraftDialog — discard an open draft version.
|
|
2431
|
+
discardDialog: {
|
|
2432
|
+
title: "Draft verwerfen?",
|
|
2433
|
+
bodyLead: "Draft v{version} von",
|
|
2434
|
+
bodyTail: "wird unwiderruflich gel\xF6scht. Published Versions bleiben unver\xE4ndert."
|
|
2435
|
+
},
|
|
2436
|
+
// PlanBundleOverview — bundle cards below the plan list.
|
|
2437
|
+
bundleOverview: {
|
|
2438
|
+
title: "Bundles",
|
|
2439
|
+
empty: "Keine Bundles vorhanden.",
|
|
2440
|
+
contains: "Enth\xE4lt",
|
|
2441
|
+
compatibleWith: "Kompatibel mit",
|
|
2442
|
+
allPlans: "Alle Pl\xE4ne"
|
|
2443
|
+
},
|
|
2444
|
+
// PlanCycleToggle — monthly/yearly switch (labels come from `common`).
|
|
2445
|
+
cycle: {
|
|
2446
|
+
ariaLabel: "Abrechnungszyklus"
|
|
2447
|
+
}
|
|
2448
|
+
},
|
|
2449
|
+
{
|
|
2450
|
+
page: {
|
|
2451
|
+
loading: "Loading plans\u2026",
|
|
2452
|
+
toastPlanCreated: "Plan {planKey} created \u2014 now assemble the first version.",
|
|
2453
|
+
toastDraftSaved: "Draft v{version} of {planKey} saved.",
|
|
2454
|
+
toastPlanPublished: "Plan {planKey} was published as v{version} \u2014 visible in the catalog.",
|
|
2455
|
+
toastPlanDeleted: "Plan {planKey} completely removed from the database.",
|
|
2456
|
+
toastDraftDiscarded: "Draft v{version} of {planKey} discarded \u2014 live version unchanged.",
|
|
2457
|
+
toastVersionTerminated: "v{version} terminated.",
|
|
2458
|
+
errorSessionExpiredSave: "Session expired \u2014 please sign in again and save once more.",
|
|
2459
|
+
errorStrictMode: "Strict mode check: {details}",
|
|
2460
|
+
errorStrictModeFallback: "Drift against the discovery snapshot.",
|
|
2461
|
+
errorDraftRegression: "This version is regressive (feature removed / quota lowered / price increased). Publishing requires force-regressive \u2014 this should not happen when saving as a draft.",
|
|
2462
|
+
errorSaveFailedHttp: "Failed to save (HTTP {status}).",
|
|
2463
|
+
errorSaveFailedDetail: "Failed to save: {message}",
|
|
2464
|
+
errorSaveFailedConsole: "Failed to save \u2014 see the browser console for details.",
|
|
2465
|
+
errorPlanHasPublishedVersions: "Plan has published versions \u2014 it cannot be deleted (contract protection P1).",
|
|
2466
|
+
errorPlanHasDrafts: "Plan still has an open draft \u2014 please discard it first via the trash icon.",
|
|
2467
|
+
errorHardDeleteNotImplemented: "The backend does not support hard delete yet \u2014 rebuild and restart the API server.",
|
|
2468
|
+
errorPlanAlreadyRemoved: "Plan has already been removed (404). Reloading the list.",
|
|
2469
|
+
errorOperationFailedHttp: "Operation failed (HTTP {status}).",
|
|
2470
|
+
errorOperationFailedDetail: "Operation failed: {message}. See the browser console for details.",
|
|
2471
|
+
errorVersionAlreadyPublished: "This version is already published and cannot be discarded.",
|
|
2472
|
+
errorDiscardNotImplemented: "The backend does not support discarding yet \u2014 please rebuild and restart the API server.",
|
|
2473
|
+
errorDraftAlreadyRemoved: "Draft has already been removed (404) \u2014 the list is about to reload.",
|
|
2474
|
+
errorDiscardFailedHttp: "Failed to discard (HTTP {status}).",
|
|
2475
|
+
errorDiscardFailedDetail: "Failed to discard: {message}. See the browser console for details (often: stale API server build or CORS blocking DELETE).",
|
|
2476
|
+
errorSessionExpiredPublish: "Session expired \u2014 please sign in again and retry.",
|
|
2477
|
+
errorPublishRegression: 'This version is regressive. Enable "force publish" if the step is intentional.',
|
|
2478
|
+
errorValidFromRequired: '"Effective as of" must be set when publishing. Please open the draft and enter the date.',
|
|
2479
|
+
errorValidFromNotAfterPrevious: '"Effective as of" must be strictly after the "effective as of" of the previous version. Please pick a later date.',
|
|
2480
|
+
errorZeroPrice: 'This version has a price of 0.00 (protection against seed placeholders). Enable "deliberately allow price 0.00" if this is an intentional free special contract.',
|
|
2481
|
+
errorPublishFailedHttp: "Publishing failed (HTTP {status})"
|
|
2482
|
+
},
|
|
2483
|
+
regressionFields: {
|
|
2484
|
+
monthlyNet: "Price (monthly, net)",
|
|
2485
|
+
yearlyNet: "Price (yearly, net)",
|
|
2486
|
+
featuresRemoved: "Removed features",
|
|
2487
|
+
featuresAdded: "Added features",
|
|
2488
|
+
quotasLowered: "Lowered quotas",
|
|
2489
|
+
quotasRaised: "Raised quotas",
|
|
2490
|
+
bundlesRemoved: "Removed bundles",
|
|
2491
|
+
bundlesAdded: "Added bundles"
|
|
2492
|
+
},
|
|
2493
|
+
list: {
|
|
2494
|
+
title: "All plans",
|
|
2495
|
+
summary: "{plans} plans \xB7 {live} live \xB7 {drafts} open drafts \xB7 {tenants} tenants assigned",
|
|
2496
|
+
matrixView: "Matrix view",
|
|
2497
|
+
newPlan: "New plan",
|
|
2498
|
+
searchPlaceholder: "Search plan\u2026",
|
|
2499
|
+
sortedBy: "Sorted by: order",
|
|
2500
|
+
columnPlan: "Plan",
|
|
2501
|
+
columnVersion: "Version",
|
|
2502
|
+
columnPrice: "Price",
|
|
2503
|
+
columnTenants: "Tenants",
|
|
2504
|
+
emptyNoPlans: 'No plans yet \u2014 create the first one via "New plan" in the top right.',
|
|
2505
|
+
emptyNoMatch: 'No plans match the search "{query}".',
|
|
2506
|
+
badgeNew: "NEW",
|
|
2507
|
+
chipLive: "live",
|
|
2508
|
+
chipPrivate: "private",
|
|
2509
|
+
chipNoLive: "no live version",
|
|
2510
|
+
chipScheduled: "scheduled",
|
|
2511
|
+
chipDraft: "Draft",
|
|
2512
|
+
validFrom: "from {date}",
|
|
2513
|
+
since: "since",
|
|
2514
|
+
from: "from",
|
|
2515
|
+
until: "until",
|
|
2516
|
+
priceFree: "Free",
|
|
2517
|
+
perMonthShort: "/ mo",
|
|
2518
|
+
perYearShort: "/ yr",
|
|
2519
|
+
tenantCount: "{count} tenants",
|
|
2520
|
+
noChangeNote: "no change note",
|
|
2521
|
+
actionDeleteBlocked: "Plan has published versions \u2014 it cannot be deleted (contract protection P1)",
|
|
2522
|
+
actionDeletePlan: "Delete plan completely",
|
|
2523
|
+
actionClonePlan: "Clone plan",
|
|
2524
|
+
actionNewVersion: "Create new version",
|
|
2525
|
+
actionOpenPlan: "Open plan",
|
|
2526
|
+
actionDiscardDraft: "Discard draft v{version}",
|
|
2527
|
+
actionEditDraft: "Edit draft",
|
|
2528
|
+
actionOpenInCockpit: "Open in cockpit"
|
|
2529
|
+
},
|
|
2530
|
+
matrix: {
|
|
2531
|
+
title: "Plans \xB7 matrix comparison",
|
|
2532
|
+
summary: "All plans side by side \xB7 {plans} plans \xB7 {features} features \xB7 {quotas} quotas \xB7 {bundles} bundles",
|
|
2533
|
+
catalogPreview: "Catalog preview",
|
|
2534
|
+
createPlan: "Create plan",
|
|
2535
|
+
createPlanSub: "or create a clone",
|
|
2536
|
+
componentColumn: "Component",
|
|
2537
|
+
chipLiveVersion: "v{version} live",
|
|
2538
|
+
chipNoLive: "no live version",
|
|
2539
|
+
chipDraftVersion: "v{version} draft",
|
|
2540
|
+
priceFree: "Free",
|
|
2541
|
+
perMonthShort: "/ mo",
|
|
2542
|
+
perYearShort: "/yr",
|
|
2543
|
+
priceDraftMarker: "(draft)",
|
|
2544
|
+
noPrices: "no prices yet",
|
|
2545
|
+
tenantCount: "{count} tenants",
|
|
2546
|
+
validFrom: "from {date}",
|
|
2547
|
+
inCatalog: "in catalog",
|
|
2548
|
+
private: "private",
|
|
2549
|
+
clonePlan: "Clone plan",
|
|
2550
|
+
groupQuotas: "Quotas",
|
|
2551
|
+
groupFeatures: "Features",
|
|
2552
|
+
groupBundles: "Bundles",
|
|
2553
|
+
baseBadge: "Base \xB7 always included",
|
|
2554
|
+
legendIncluded: "included",
|
|
2555
|
+
legendNotIncluded: "not included",
|
|
2556
|
+
legendLoading: "loading versions\u2026"
|
|
2557
|
+
},
|
|
2558
|
+
review: {
|
|
2559
|
+
title: "Review & publish",
|
|
2560
|
+
subtitleLead: "Final check before",
|
|
2561
|
+
subtitleTail: "goes live.",
|
|
2562
|
+
saving: "Saving\u2026",
|
|
2563
|
+
saveAsDraft: "Save as draft",
|
|
2564
|
+
publishBlocked: "Publish checklist is not complete yet",
|
|
2565
|
+
publishing: "Publishing\u2026",
|
|
2566
|
+
publishVersion: "Publish v{version}",
|
|
2567
|
+
cardMasterData: "Master data",
|
|
2568
|
+
labelPlanKey: "Plan key",
|
|
2569
|
+
labelDisplayName: "Display name",
|
|
2570
|
+
missing: "missing",
|
|
2571
|
+
cardPricing: "Version v{version} \xB7 pricing & visibility",
|
|
2572
|
+
labelValidFrom: "Effective as of",
|
|
2573
|
+
labelValidUntil: "Valid until",
|
|
2574
|
+
missingRequiredOnPublish: "missing \u2014 required when publishing",
|
|
2575
|
+
unlimited: "\u221E unlimited",
|
|
2576
|
+
labelMonthlyPrice: "Monthly price",
|
|
2577
|
+
labelYearlyPrice: "Yearly price",
|
|
2578
|
+
labelPublicCatalog: "Public catalog",
|
|
2579
|
+
visibleInCatalog: "Visible in catalog",
|
|
2580
|
+
hiddenFromCatalog: "Hidden",
|
|
2581
|
+
priceFree: "Free",
|
|
2582
|
+
cardComponents: "Components \xB7 {total} in total",
|
|
2583
|
+
componentQuotas: "Quotas \xB7 {count}",
|
|
2584
|
+
componentFeatures: "Features \xB7 {count}",
|
|
2585
|
+
componentBundles: "Bundles \xB7 {count}",
|
|
2586
|
+
componentEmpty: "none",
|
|
2587
|
+
cardChangeNote: "Change note",
|
|
2588
|
+
changeNoteHint: "Stored in the audit log and shown with the version history.",
|
|
2589
|
+
changeNoteMissing: "No change note \u2014 add it in the editor (required when publishing, contract protection\xA0P3).",
|
|
2590
|
+
cardChecklist: "Publish checklist",
|
|
2591
|
+
checkPlanKey: "Plan key assigned",
|
|
2592
|
+
checkDisplayName: "Display name present",
|
|
2593
|
+
checkQuota: "At least 1 quota assigned",
|
|
2594
|
+
checkFeature: "At least 1 feature assigned",
|
|
2595
|
+
checkValidFrom: '"Effective as of" set (required when publishing)',
|
|
2596
|
+
checkValidFromAfterPredecessor: '"Effective as of" is after predecessor v{version}',
|
|
2597
|
+
checkValidFromAfterPrevious: '"Effective as of" is after the previous version',
|
|
2598
|
+
checkChangeNote: "Change note present (contract protection P3)",
|
|
2599
|
+
cardRegression: "Contract protection P3 \u2014 regression",
|
|
2600
|
+
regressionHint: "If this version is regressive (feature removed, quota lowered, price increased), the backend blocks the publish. Force publish deliberately releases the regression and triggers the notification wave.",
|
|
2601
|
+
forceRegressive: "Force publish even on regression",
|
|
2602
|
+
cardZeroPrice: "Price 0.00",
|
|
2603
|
+
zeroPriceHint: "By default the backend blocks a publish with price 0.00 (protection against seed placeholders). Release it here for deliberately free special contracts.",
|
|
2604
|
+
allowZeroPrice: "Deliberately allow price 0.00",
|
|
2605
|
+
cardTenantImpact: "Tenant impact on publish",
|
|
2606
|
+
impactNone: "No tenants are affected right now. Once the version is live, tenants can book the plan from the catalog.",
|
|
2607
|
+
impactSome: "{count} tenant(s) on the current live version stay on their version under grandfathering (P1) \u2014 new bookings run on v{version}."
|
|
2608
|
+
},
|
|
2609
|
+
createDialog: {
|
|
2610
|
+
title: "Create new plan",
|
|
2611
|
+
subtitle: "Create the plan master record. In the next step you assign features, quotas and bundles.",
|
|
2612
|
+
labelPlanKey: "Plan key",
|
|
2613
|
+
placeholderPlanKey: "e.g. SCALE",
|
|
2614
|
+
hintPlanKey: "Uppercase + underscores \xB7 API-stable, not changeable after publishing",
|
|
2615
|
+
labelDisplayName: "Display name",
|
|
2616
|
+
placeholderDisplayName: "e.g. Scale",
|
|
2617
|
+
hintDisplayName: "How the plan appears in the catalog",
|
|
2618
|
+
placeholderDescription: "What does the customer get with this plan?",
|
|
2619
|
+
labelBasis: "Basis for the first version",
|
|
2620
|
+
emptyPlan: "Empty plan",
|
|
2621
|
+
emptyPlanHint: "Assemble everything yourself in the editor",
|
|
2622
|
+
cloneOf: "Clone of {label}",
|
|
2623
|
+
counts: "{features} features \xB7 {quotas} quotas \xB7 {bundles} bundles",
|
|
2624
|
+
errorKeyFormat: "Must start with a letter, only A\u2013Z, 0\u20139, _.",
|
|
2625
|
+
errorKeyExists: '"{key}" already exists.',
|
|
2626
|
+
submitting: "Creating\u2026",
|
|
2627
|
+
submit: "Next \xB7 components"
|
|
2628
|
+
},
|
|
2629
|
+
publishDialog: {
|
|
2630
|
+
title: "Publish version?",
|
|
2631
|
+
bodyLead: "Plan",
|
|
2632
|
+
bodyTail: ", draft v{version}.",
|
|
2633
|
+
supersededNoteLead: "A previously live version, if any, is set to",
|
|
2634
|
+
supersededNoteTail: "(contract protection P1: existing subscriptions stay on the old version until the next renewal).",
|
|
2635
|
+
forceRegressive: "Force publish even on regression (feature removed / quota lowered / price increased)",
|
|
2636
|
+
allowZeroPrice: "Deliberately allow price 0.00 (free special contract)",
|
|
2637
|
+
regressiveChanges: "Regressive changes:",
|
|
2638
|
+
confirm: "Publish"
|
|
2639
|
+
},
|
|
2640
|
+
archiveDialog: {
|
|
2641
|
+
title: "Delete plan completely?",
|
|
2642
|
+
bodyLead: "Plan",
|
|
2643
|
+
bodyVerb: "will be",
|
|
2644
|
+
bodyEmphasis: "permanently removed from the database",
|
|
2645
|
+
bodyTail: ". Since the plan has no published version, no subscriptions are affected.",
|
|
2646
|
+
contractProtectionNote: "Contract protection P1: plans with ever-published versions cannot be deleted \u2014 the backend would respond with 422."
|
|
2647
|
+
},
|
|
2648
|
+
discardDialog: {
|
|
2649
|
+
title: "Discard draft?",
|
|
2650
|
+
bodyLead: "Draft v{version} of",
|
|
2651
|
+
bodyTail: "will be permanently deleted. Published versions remain unchanged."
|
|
2652
|
+
},
|
|
2653
|
+
bundleOverview: {
|
|
2654
|
+
title: "Bundles",
|
|
2655
|
+
empty: "No bundles available.",
|
|
2656
|
+
contains: "Contains",
|
|
2657
|
+
compatibleWith: "Compatible with",
|
|
2658
|
+
allPlans: "All plans"
|
|
2659
|
+
},
|
|
2660
|
+
cycle: {
|
|
2661
|
+
ariaLabel: "Billing cycle"
|
|
2662
|
+
}
|
|
2663
|
+
}
|
|
2664
|
+
);
|
|
2665
|
+
|
|
2666
|
+
// src/client/i18n/messages/promos.ts
|
|
2667
|
+
var promosMessages = defineMessages(
|
|
2668
|
+
{
|
|
2669
|
+
title: "Promo-Codes",
|
|
2670
|
+
createAction: "Promo-Code anlegen",
|
|
2671
|
+
apiErrorHttpStatus: "Promotions-API antwortete mit HTTP {status}",
|
|
2672
|
+
list: {
|
|
2673
|
+
searchLabel: "Suche (Code)",
|
|
2674
|
+
tileScheduled: "Geplant",
|
|
2675
|
+
tilePaused: "Pausiert",
|
|
2676
|
+
hintRedeemable: "einl\xF6sbar",
|
|
2677
|
+
hintStartsLater: "startet k\xFCnftig",
|
|
2678
|
+
columnCode: "Code",
|
|
2679
|
+
columnValue: "Wert",
|
|
2680
|
+
columnRedemptions: "Einl\xF6sungen",
|
|
2681
|
+
columnCampaign: "Kampagne",
|
|
2682
|
+
columnValidUntil: "G\xFCltig bis",
|
|
2683
|
+
actionPause: "Pausieren",
|
|
2684
|
+
actionActivate: "Aktivieren",
|
|
2685
|
+
deleteTitle: 'Promo-Code "{code}" l\xF6schen',
|
|
2686
|
+
deleteMessage: "Soft-Delete via Status=EXPIRED. Bestehende Redemptions bleiben.",
|
|
2687
|
+
deletedNotice: "{code} gel\xF6scht.",
|
|
2688
|
+
createdNotice: "Promo-Code angelegt.",
|
|
2689
|
+
updatedNotice: "Promo-Code aktualisiert.",
|
|
2690
|
+
actionFailed: "Aktion fehlgeschlagen"
|
|
2691
|
+
},
|
|
2692
|
+
detail: {
|
|
2693
|
+
promoCodeLabel: "Promo-Code",
|
|
2694
|
+
configLabel: "Konfiguration",
|
|
2695
|
+
statsLabel: "Statistik",
|
|
2696
|
+
redemptionsLabel: "Einl\xF6sungen",
|
|
2697
|
+
emptyLabel: "Code nicht gefunden.",
|
|
2698
|
+
loading: "wird geladen\u2026",
|
|
2699
|
+
columnTenant: "Tenant",
|
|
2700
|
+
columnStart: "Start",
|
|
2701
|
+
columnEnd: "Ende",
|
|
2702
|
+
columnRedeemedAt: "Eingel\xF6st"
|
|
2703
|
+
},
|
|
2704
|
+
form: {
|
|
2705
|
+
sectionCodeDiscount: "Code & Rabatt",
|
|
2706
|
+
sectionValidity: "G\xFCltigkeit & Laufzeit",
|
|
2707
|
+
sectionCampaign: "Kampagne & Notizen",
|
|
2708
|
+
advancedToggle: "Erweiterte Einschr\xE4nkungen",
|
|
2709
|
+
codeLabel: "Code",
|
|
2710
|
+
codePlaceholder: "z. B. WELCOME10",
|
|
2711
|
+
codeRandom: "Zufall",
|
|
2712
|
+
codeHint: 'Gro\xDFbuchstaben, Zahlen, \u201E-" und \u201E_" \xB7 nach Anlage stabil',
|
|
2713
|
+
codeStableHint: "Nach Anlage stabil.",
|
|
2714
|
+
valueTypeLabel: "Rabatt-Typ",
|
|
2715
|
+
valueTypePercent: "Prozent",
|
|
2716
|
+
valueTypePercentSub: "\u2212x %",
|
|
2717
|
+
valueTypeAbsolute: "Fester \u20AC",
|
|
2718
|
+
valueTypeAbsoluteSub: "\u2212x \u20AC",
|
|
2719
|
+
valuePercentLabel: "Rabatt in %",
|
|
2720
|
+
valueAbsoluteLabel: "Rabatt in \u20AC",
|
|
2721
|
+
plansLabel: "Anwendbar auf Pl\xE4ne",
|
|
2722
|
+
plansHint: "Leer = alle Pl\xE4ne ({count} ausgew\xE4hlt)",
|
|
2723
|
+
durationLabel: "Laufzeit des Rabatts",
|
|
2724
|
+
durationOnce: "Einmalig",
|
|
2725
|
+
durationMonths: "N Monate",
|
|
2726
|
+
durationBillingCycles: "N Perioden",
|
|
2727
|
+
durationMonthsPlaceholder: "Monate",
|
|
2728
|
+
durationCyclesPlaceholder: "Perioden",
|
|
2729
|
+
maxRedemptionsLabel: "Max. Einl\xF6sungen",
|
|
2730
|
+
maxRedemptionsPlaceholder: "leer = \u221E",
|
|
2731
|
+
maxRedemptionsHintCreate: "Leerlassen f\xFCr unbegrenzt",
|
|
2732
|
+
maxRedemptionsHintEdit: "Nur erh\xF6hbar, nicht senkbar (bestehende Einl\xF6sungen bleiben g\xFCltig).",
|
|
2733
|
+
validFromLabel: "G\xFCltig ab",
|
|
2734
|
+
validUntilLabel: "G\xFCltig bis",
|
|
2735
|
+
statusPaused: "Pausiert",
|
|
2736
|
+
statusHint: "Bestehende Redemptions bleiben unver\xE4ndert.",
|
|
2737
|
+
campaignLabel: "Kampagne (optional)",
|
|
2738
|
+
campaignPlaceholder: "z. B. Fr\xFChjahrs-Aktion 2026",
|
|
2739
|
+
campaignHint: "Gruppiert mehrere Codes optisch",
|
|
2740
|
+
noteLabel: "Notiz (intern)",
|
|
2741
|
+
notePlaceholder: "Kontext, Quelle, Sales-Bezug \u2014 wird nicht an Kunden ausgespielt.",
|
|
2742
|
+
billingCycleLabel: "Nur f\xFCr Abrechnungs-Zyklus",
|
|
2743
|
+
minAmountLabel: "Mindest-Plan-Betrag (\u20AC brutto)",
|
|
2744
|
+
minAmountPlaceholder: "leer = keine Schwelle",
|
|
2745
|
+
firstTimeOnly: "Nur Neukunden",
|
|
2746
|
+
allowZeroInvoice: "0-\u20AC-Rechnung zulassen",
|
|
2747
|
+
revenueAccountLabel: "Erl\xF6s-Minderungs-Konto (Buchhaltung)",
|
|
2748
|
+
revenueAccountPlaceholder: "z. B. 8736",
|
|
2749
|
+
previewEyebrow: "Vorschau im Catalog",
|
|
2750
|
+
previewOnce: "einmalig",
|
|
2751
|
+
previewMonths: "{count} Monate",
|
|
2752
|
+
previewCycles: "{count} Perioden",
|
|
2753
|
+
previewAllPlans: "alle Pl\xE4ne",
|
|
2754
|
+
previewNoPlanFilter: "kein Plan-Filter",
|
|
2755
|
+
previewMax: "max. {count}"
|
|
2756
|
+
},
|
|
2757
|
+
createDialog: {
|
|
2758
|
+
title: "Neuer Promo-Code",
|
|
2759
|
+
subtitle: "Code, Rabatt-Logik, Laufzeit und Plan-Zuordnung festlegen."
|
|
2760
|
+
},
|
|
2761
|
+
editDialog: {
|
|
2762
|
+
title: "Promo-Code bearbeiten",
|
|
2763
|
+
redemptionsSoFar: "{count} Einl\xF6sungen bisher"
|
|
2764
|
+
}
|
|
2765
|
+
},
|
|
2766
|
+
{
|
|
2767
|
+
title: "Promo codes",
|
|
2768
|
+
createAction: "Create promo code",
|
|
2769
|
+
apiErrorHttpStatus: "Promotions API responded with HTTP {status}",
|
|
2770
|
+
list: {
|
|
2771
|
+
searchLabel: "Search (code)",
|
|
2772
|
+
tileScheduled: "Scheduled",
|
|
2773
|
+
tilePaused: "Paused",
|
|
2774
|
+
hintRedeemable: "redeemable",
|
|
2775
|
+
hintStartsLater: "starts later",
|
|
2776
|
+
columnCode: "Code",
|
|
2777
|
+
columnValue: "Value",
|
|
2778
|
+
columnRedemptions: "Redemptions",
|
|
2779
|
+
columnCampaign: "Campaign",
|
|
2780
|
+
columnValidUntil: "Valid until",
|
|
2781
|
+
actionPause: "Pause",
|
|
2782
|
+
actionActivate: "Activate",
|
|
2783
|
+
deleteTitle: 'Delete promo code "{code}"',
|
|
2784
|
+
deleteMessage: "Soft delete via status=EXPIRED. Existing redemptions remain.",
|
|
2785
|
+
deletedNotice: "{code} deleted.",
|
|
2786
|
+
createdNotice: "Promo code created.",
|
|
2787
|
+
updatedNotice: "Promo code updated.",
|
|
2788
|
+
actionFailed: "Action failed"
|
|
2789
|
+
},
|
|
2790
|
+
detail: {
|
|
2791
|
+
promoCodeLabel: "Promo code",
|
|
2792
|
+
configLabel: "Configuration",
|
|
2793
|
+
statsLabel: "Statistics",
|
|
2794
|
+
redemptionsLabel: "Redemptions",
|
|
2795
|
+
emptyLabel: "Code not found.",
|
|
2796
|
+
loading: "loading\u2026",
|
|
2797
|
+
columnTenant: "Tenant",
|
|
2798
|
+
columnStart: "Start",
|
|
2799
|
+
columnEnd: "End",
|
|
2800
|
+
columnRedeemedAt: "Redeemed"
|
|
2801
|
+
},
|
|
2802
|
+
form: {
|
|
2803
|
+
sectionCodeDiscount: "Code & discount",
|
|
2804
|
+
sectionValidity: "Validity & duration",
|
|
2805
|
+
sectionCampaign: "Campaign & notes",
|
|
2806
|
+
advancedToggle: "Advanced restrictions",
|
|
2807
|
+
codeLabel: "Code",
|
|
2808
|
+
codePlaceholder: "e.g. WELCOME10",
|
|
2809
|
+
codeRandom: "Random",
|
|
2810
|
+
codeHint: 'Uppercase letters, digits, "-" and "_" \xB7 stable after creation',
|
|
2811
|
+
codeStableHint: "Stable after creation.",
|
|
2812
|
+
valueTypeLabel: "Discount type",
|
|
2813
|
+
valueTypePercent: "Percent",
|
|
2814
|
+
valueTypePercentSub: "\u2212x %",
|
|
2815
|
+
valueTypeAbsolute: "Fixed \u20AC",
|
|
2816
|
+
valueTypeAbsoluteSub: "\u2212x \u20AC",
|
|
2817
|
+
valuePercentLabel: "Discount in %",
|
|
2818
|
+
valueAbsoluteLabel: "Discount in \u20AC",
|
|
2819
|
+
plansLabel: "Applies to plans",
|
|
2820
|
+
plansHint: "Empty = all plans ({count} selected)",
|
|
2821
|
+
durationLabel: "Discount duration",
|
|
2822
|
+
durationOnce: "Once",
|
|
2823
|
+
durationMonths: "N months",
|
|
2824
|
+
durationBillingCycles: "N billing cycles",
|
|
2825
|
+
durationMonthsPlaceholder: "Months",
|
|
2826
|
+
durationCyclesPlaceholder: "Billing cycles",
|
|
2827
|
+
maxRedemptionsLabel: "Max. redemptions",
|
|
2828
|
+
maxRedemptionsPlaceholder: "empty = \u221E",
|
|
2829
|
+
maxRedemptionsHintCreate: "Leave empty for unlimited",
|
|
2830
|
+
maxRedemptionsHintEdit: "Can only be raised, not lowered (existing redemptions stay valid).",
|
|
2831
|
+
validFromLabel: "Valid from",
|
|
2832
|
+
validUntilLabel: "Valid until",
|
|
2833
|
+
statusPaused: "Paused",
|
|
2834
|
+
statusHint: "Existing redemptions remain unchanged.",
|
|
2835
|
+
campaignLabel: "Campaign (optional)",
|
|
2836
|
+
campaignPlaceholder: "e.g. Spring campaign 2026",
|
|
2837
|
+
campaignHint: "Groups several codes visually",
|
|
2838
|
+
noteLabel: "Note (internal)",
|
|
2839
|
+
notePlaceholder: "Context, source, sales reference \u2014 not shown to customers.",
|
|
2840
|
+
billingCycleLabel: "Only for billing cycle",
|
|
2841
|
+
minAmountLabel: "Minimum plan amount (\u20AC gross)",
|
|
2842
|
+
minAmountPlaceholder: "empty = no threshold",
|
|
2843
|
+
firstTimeOnly: "New customers only",
|
|
2844
|
+
allowZeroInvoice: "Allow \u20AC0 invoice",
|
|
2845
|
+
revenueAccountLabel: "Revenue deduction account (accounting)",
|
|
2846
|
+
revenueAccountPlaceholder: "e.g. 8736",
|
|
2847
|
+
previewEyebrow: "Preview in the catalog",
|
|
2848
|
+
previewOnce: "once",
|
|
2849
|
+
previewMonths: "{count} months",
|
|
2850
|
+
previewCycles: "{count} billing cycles",
|
|
2851
|
+
previewAllPlans: "all plans",
|
|
2852
|
+
previewNoPlanFilter: "no plan filter",
|
|
2853
|
+
previewMax: "max. {count}"
|
|
2854
|
+
},
|
|
2855
|
+
createDialog: {
|
|
2856
|
+
title: "New promo code",
|
|
2857
|
+
subtitle: "Define code, discount logic, duration and plan assignment."
|
|
2858
|
+
},
|
|
2859
|
+
editDialog: {
|
|
2860
|
+
title: "Edit promo code",
|
|
2861
|
+
redemptionsSoFar: "{count} redemptions so far"
|
|
2862
|
+
}
|
|
2863
|
+
}
|
|
2864
|
+
);
|
|
2865
|
+
|
|
2866
|
+
// src/client/i18n/messages/shell.ts
|
|
2867
|
+
var shellMessages = defineMessages(
|
|
2868
|
+
{
|
|
2869
|
+
emailLabel: "E-Mail",
|
|
2870
|
+
passwordLabel: "Passwort",
|
|
2871
|
+
invalidEmail: "Bitte g\xFCltige E-Mail",
|
|
2872
|
+
header: {
|
|
2873
|
+
productionWarning: "Aktionen wirken sich sofort auf alle Mandanten aus.",
|
|
2874
|
+
subtitle: "SuperAdmin \xB7 Plattform-Verwaltung",
|
|
2875
|
+
roleBadge: "SUPER ADMIN",
|
|
2876
|
+
logout: "Abmelden"
|
|
2877
|
+
},
|
|
2878
|
+
drawer: {
|
|
2879
|
+
docs: "Doku \xF6ffnen"
|
|
2880
|
+
},
|
|
2881
|
+
manifestError: {
|
|
2882
|
+
title: "Admin-Manifest nicht erreichbar",
|
|
2883
|
+
lead: "Das Plattform-Manifest konnte nicht geladen werden. Ohne Manifest sind Sidebar, Capabilities und Action-Buttons nicht zuverl\xE4ssig \u2014 die UI w\xFCrde sonst falsche oder unerreichbare Buttons rendern. Der Router hat dich deshalb hierher geschickt (fail-closed).",
|
|
2884
|
+
detailLabel: "Detail:"
|
|
2885
|
+
},
|
|
2886
|
+
login: {
|
|
2887
|
+
signIn: "Anmelden",
|
|
2888
|
+
passwordRequired: "Passwort ist Pflicht",
|
|
2889
|
+
devHintLabel: "Test-Account:",
|
|
2890
|
+
errorBadCredentials: "E-Mail oder Passwort falsch.",
|
|
2891
|
+
errorNotSuperAdmin: "Dieser Account hat keine SUPER_ADMIN-Rolle. Bitte Tenant-Frontend nutzen.",
|
|
2892
|
+
errorFailed: "Anmeldung fehlgeschlagen."
|
|
2893
|
+
},
|
|
2894
|
+
setup: {
|
|
2895
|
+
// U+00AD soft hyphen — allows the compound to break inside the card.
|
|
2896
|
+
title: "Erst\xADeinrichtung",
|
|
2897
|
+
subtitle: "{brand} \xB7 ersten SuperAdmin anlegen",
|
|
2898
|
+
tokenHintBefore: "Es existiert noch kein SuperAdmin. Gib das vom Betreiber gesetzte",
|
|
2899
|
+
tokenHintAfter: "ein und lege den ersten Account an.",
|
|
2900
|
+
tokenLabel: "Setup-Token",
|
|
2901
|
+
tokenRequired: "Setup-Token ist Pflicht",
|
|
2902
|
+
passwordLabel: "Passwort (leer = generieren)",
|
|
2903
|
+
passwordHint: "Mindestens 8 Zeichen, oder leer lassen f\xFCr ein generiertes Passwort.",
|
|
2904
|
+
passwordMinLength: "Mindestens 8 Zeichen",
|
|
2905
|
+
submit: "SuperAdmin anlegen",
|
|
2906
|
+
mfaIntroBefore: "Account",
|
|
2907
|
+
mfaIntroAfter: "angelegt. Richte jetzt die Zwei-Faktor-Authentisierung (TOTP) ein.",
|
|
2908
|
+
generatedPasswordLabel: "Generiertes Passwort (einmalig sichern)",
|
|
2909
|
+
qrAlt: "MFA-QR-Code",
|
|
2910
|
+
qrHint: "Mit der Authenticator-App scannen",
|
|
2911
|
+
manualSecretLabel: 'In Authenticator-App als \u201ESchl\xFCssel manuell eingeben"',
|
|
2912
|
+
otpauthSummary: "otpauth-URI (f\xFCr QR-Generator)",
|
|
2913
|
+
codeLabel: "6-stelliger Code aus der App",
|
|
2914
|
+
codeInvalid: "6-stelliger Code",
|
|
2915
|
+
confirmMfa: "MFA best\xE4tigen",
|
|
2916
|
+
skip: "\xDCberspringen \u2014 Code beim ersten Login eingeben",
|
|
2917
|
+
doneHint: "Einrichtung abgeschlossen. Melde dich jetzt mit dem neuen SuperAdmin an.",
|
|
2918
|
+
toLogin: "Zum Login",
|
|
2919
|
+
errorSetupDisabled: "Setup ist serverseitig deaktiviert (SETUP_TOKEN nicht gesetzt).",
|
|
2920
|
+
errorInvalidToken: "Setup-Token ung\xFCltig.",
|
|
2921
|
+
errorAlreadyDone: "Es existiert bereits ein SuperAdmin \u2014 Setup ist abgeschlossen.",
|
|
2922
|
+
errorInvalidEmail: "Ung\xFCltige E-Mail-Adresse.",
|
|
2923
|
+
errorEmailExists: "Diese E-Mail ist bereits vergeben. W\xE4hle eine andere oder hebe den bestehenden User per CLI/DB zum SUPER_ADMIN an.",
|
|
2924
|
+
errorHttp: "Fehler (HTTP {status}).",
|
|
2925
|
+
errorFailed: "Setup fehlgeschlagen.",
|
|
2926
|
+
errorCodeInvalid: "Code ung\xFCltig \u2014 bitte erneut versuchen.",
|
|
2927
|
+
errorConfirmFailed: "Best\xE4tigung fehlgeschlagen."
|
|
2928
|
+
},
|
|
2929
|
+
mfa: {
|
|
2930
|
+
title: "Multi-Faktor-Best\xE4tigung",
|
|
2931
|
+
defaultDescription: "Diese Aktion ist sicherheitskritisch. Bitte 6-stelligen TOTP-Code aus Authenticator eingeben.",
|
|
2932
|
+
codeLabel: "TOTP-Code",
|
|
2933
|
+
invalidCode: "TOTP-Code ung\xFCltig oder MFA nicht eingerichtet."
|
|
2934
|
+
}
|
|
2935
|
+
},
|
|
2936
|
+
{
|
|
2937
|
+
emailLabel: "Email",
|
|
2938
|
+
passwordLabel: "Password",
|
|
2939
|
+
invalidEmail: "Please enter a valid email",
|
|
2940
|
+
header: {
|
|
2941
|
+
productionWarning: "Actions take effect immediately for all tenants.",
|
|
2942
|
+
subtitle: "SuperAdmin \xB7 Platform administration",
|
|
2943
|
+
roleBadge: "SUPER ADMIN",
|
|
2944
|
+
logout: "Sign out"
|
|
2945
|
+
},
|
|
2946
|
+
drawer: {
|
|
2947
|
+
docs: "Open documentation"
|
|
2948
|
+
},
|
|
2949
|
+
manifestError: {
|
|
2950
|
+
title: "Admin manifest unavailable",
|
|
2951
|
+
lead: "The platform manifest could not be loaded. Without the manifest, sidebar, capabilities and action buttons are not reliable \u2014 the UI would render wrong or unreachable buttons. That is why the router sent you here (fail-closed).",
|
|
2952
|
+
detailLabel: "Detail:"
|
|
2953
|
+
},
|
|
2954
|
+
login: {
|
|
2955
|
+
signIn: "Sign in",
|
|
2956
|
+
passwordRequired: "Password is required",
|
|
2957
|
+
devHintLabel: "Test account:",
|
|
2958
|
+
errorBadCredentials: "Email or password is incorrect.",
|
|
2959
|
+
errorNotSuperAdmin: "This account does not have the SUPER_ADMIN role. Please use the tenant frontend.",
|
|
2960
|
+
errorFailed: "Sign-in failed."
|
|
2961
|
+
},
|
|
2962
|
+
setup: {
|
|
2963
|
+
title: "Initial setup",
|
|
2964
|
+
subtitle: "{brand} \xB7 create the first SuperAdmin",
|
|
2965
|
+
tokenHintBefore: "No SuperAdmin exists yet. Enter the",
|
|
2966
|
+
tokenHintAfter: "set by the operator and create the first account.",
|
|
2967
|
+
tokenLabel: "Setup token",
|
|
2968
|
+
tokenRequired: "Setup token is required",
|
|
2969
|
+
passwordLabel: "Password (empty = generate)",
|
|
2970
|
+
passwordHint: "At least 8 characters, or leave empty for a generated password.",
|
|
2971
|
+
passwordMinLength: "At least 8 characters",
|
|
2972
|
+
submit: "Create SuperAdmin",
|
|
2973
|
+
mfaIntroBefore: "Account",
|
|
2974
|
+
mfaIntroAfter: "created. Now set up two-factor authentication (TOTP).",
|
|
2975
|
+
generatedPasswordLabel: "Generated password (store it now, shown only once)",
|
|
2976
|
+
qrAlt: "MFA QR code",
|
|
2977
|
+
qrHint: "Scan with your authenticator app",
|
|
2978
|
+
manualSecretLabel: 'In your authenticator app via "Enter key manually"',
|
|
2979
|
+
otpauthSummary: "otpauth URI (for a QR generator)",
|
|
2980
|
+
codeLabel: "6-digit code from the app",
|
|
2981
|
+
codeInvalid: "6-digit code",
|
|
2982
|
+
confirmMfa: "Confirm MFA",
|
|
2983
|
+
skip: "Skip \u2014 enter the code at first sign-in",
|
|
2984
|
+
doneHint: "Setup complete. Sign in now with the new SuperAdmin.",
|
|
2985
|
+
toLogin: "Go to sign-in",
|
|
2986
|
+
errorSetupDisabled: "Setup is disabled on the server (SETUP_TOKEN not set).",
|
|
2987
|
+
errorInvalidToken: "Setup token invalid.",
|
|
2988
|
+
errorAlreadyDone: "A SuperAdmin already exists \u2014 setup is complete.",
|
|
2989
|
+
errorInvalidEmail: "Invalid email address.",
|
|
2990
|
+
errorEmailExists: "This email is already taken. Choose another one or promote the existing user to SUPER_ADMIN via CLI/DB.",
|
|
2991
|
+
errorHttp: "Error (HTTP {status}).",
|
|
2992
|
+
errorFailed: "Setup failed.",
|
|
2993
|
+
errorCodeInvalid: "Code invalid \u2014 please try again.",
|
|
2994
|
+
errorConfirmFailed: "Confirmation failed."
|
|
2995
|
+
},
|
|
2996
|
+
mfa: {
|
|
2997
|
+
title: "Multi-factor confirmation",
|
|
2998
|
+
defaultDescription: "This action is security-critical. Please enter the 6-digit TOTP code from your authenticator.",
|
|
2999
|
+
codeLabel: "TOTP code",
|
|
3000
|
+
invalidCode: "TOTP code invalid or MFA not set up."
|
|
3001
|
+
}
|
|
3002
|
+
}
|
|
3003
|
+
);
|
|
3004
|
+
|
|
3005
|
+
// src/client/i18n/messages/tenants.ts
|
|
3006
|
+
var tenantsMessages = defineMessages(
|
|
3007
|
+
{
|
|
3008
|
+
// Terms shared by the list, the detail page and the subscriptions table.
|
|
3009
|
+
tenant: "Mandant",
|
|
3010
|
+
plan: "Plan",
|
|
3011
|
+
list: {
|
|
3012
|
+
title: "Mandanten",
|
|
3013
|
+
searchPlaceholder: "Slug oder Name \u2026",
|
|
3014
|
+
allStatuses: "Alle Aktiv-Status",
|
|
3015
|
+
allPlans: "Alle Pl\xE4ne",
|
|
3016
|
+
columnUsage: "Verbrauch",
|
|
3017
|
+
columnCreatedAt: "Angelegt",
|
|
3018
|
+
suspended: "Suspendiert",
|
|
3019
|
+
empty: "Keine Mandanten mit diesen Filtern.",
|
|
3020
|
+
pagination: "{total} Mandanten \xB7 Seite {page} / {pages}"
|
|
3021
|
+
},
|
|
3022
|
+
detail: {
|
|
3023
|
+
backToList: "Mandanten-Liste",
|
|
3024
|
+
slug: "Slug",
|
|
3025
|
+
masterData: "Stammdaten",
|
|
3026
|
+
pilot: "Pilot",
|
|
3027
|
+
trialEnd: "Trial-Ende",
|
|
3028
|
+
pilotEnd: "Pilot-Ende",
|
|
3029
|
+
vatId: "USt-IdNr.",
|
|
3030
|
+
usage: "Verbrauch",
|
|
3031
|
+
users: "User",
|
|
3032
|
+
userEmail: "E-Mail",
|
|
3033
|
+
userRole: "Rolle",
|
|
3034
|
+
userLastLogin: "Letzter Login"
|
|
3035
|
+
},
|
|
3036
|
+
actions: {
|
|
3037
|
+
confirmTitle: "Aktion best\xE4tigen",
|
|
3038
|
+
leadAction: "Aktion",
|
|
3039
|
+
leadForTenant: "f\xFCr Tenant",
|
|
3040
|
+
typedSlugHint: "Best\xE4tige durch Eintippen des Slugs",
|
|
3041
|
+
slugMismatch: "Muss exakt \u201E{slug}\u201C sein",
|
|
3042
|
+
extendUntilLabel: "Verl\xE4ngern bis (Datum)",
|
|
3043
|
+
dateFutureError: "Bitte ein Datum in der Zukunft w\xE4hlen.",
|
|
3044
|
+
reasonLabel: "Grund (Pflicht f\xFCr Audit-Log, mindestens 5 Zeichen)",
|
|
3045
|
+
reasonError: "Bitte einen Grund mit mindestens 5 Zeichen angeben.",
|
|
3046
|
+
mfaDescription: '{action} \u2014 Tenant \u201E{tenant}". TOTP-Code aus Authenticator eingeben.',
|
|
3047
|
+
successNotify: "{action}: erfolgreich."
|
|
3048
|
+
},
|
|
3049
|
+
subscriptions: {
|
|
3050
|
+
title: "Abonnements",
|
|
3051
|
+
columnEndsAt: "Endet"
|
|
3052
|
+
},
|
|
3053
|
+
draft: {
|
|
3054
|
+
planModules: "{count} Basis-Module"
|
|
3055
|
+
}
|
|
3056
|
+
},
|
|
3057
|
+
{
|
|
3058
|
+
tenant: "Tenant",
|
|
3059
|
+
plan: "Plan",
|
|
3060
|
+
list: {
|
|
3061
|
+
title: "Tenants",
|
|
3062
|
+
searchPlaceholder: "Slug or name \u2026",
|
|
3063
|
+
allStatuses: "All active states",
|
|
3064
|
+
allPlans: "All plans",
|
|
3065
|
+
columnUsage: "Usage",
|
|
3066
|
+
columnCreatedAt: "Created",
|
|
3067
|
+
suspended: "Suspended",
|
|
3068
|
+
empty: "No tenants match these filters.",
|
|
3069
|
+
pagination: "{total} tenants \xB7 Page {page} / {pages}"
|
|
3070
|
+
},
|
|
3071
|
+
detail: {
|
|
3072
|
+
backToList: "Tenant list",
|
|
3073
|
+
slug: "Slug",
|
|
3074
|
+
masterData: "Master data",
|
|
3075
|
+
pilot: "Pilot",
|
|
3076
|
+
trialEnd: "Trial end",
|
|
3077
|
+
pilotEnd: "Pilot end",
|
|
3078
|
+
vatId: "VAT ID",
|
|
3079
|
+
usage: "Usage",
|
|
3080
|
+
users: "Users",
|
|
3081
|
+
userEmail: "Email",
|
|
3082
|
+
userRole: "Role",
|
|
3083
|
+
userLastLogin: "Last login"
|
|
3084
|
+
},
|
|
3085
|
+
actions: {
|
|
3086
|
+
confirmTitle: "Confirm action",
|
|
3087
|
+
leadAction: "Action",
|
|
3088
|
+
leadForTenant: "for tenant",
|
|
3089
|
+
typedSlugHint: "Confirm by typing the slug",
|
|
3090
|
+
slugMismatch: "Must be exactly \u201C{slug}\u201D",
|
|
3091
|
+
extendUntilLabel: "Extend until (date)",
|
|
3092
|
+
dateFutureError: "Please pick a date in the future.",
|
|
3093
|
+
reasonLabel: "Reason (required for the audit log, at least 5 characters)",
|
|
3094
|
+
reasonError: "Please enter a reason with at least 5 characters.",
|
|
3095
|
+
mfaDescription: "{action} \u2014 tenant \u201C{tenant}\u201D. Enter the TOTP code from your authenticator.",
|
|
3096
|
+
successNotify: "{action}: succeeded."
|
|
3097
|
+
},
|
|
3098
|
+
subscriptions: {
|
|
3099
|
+
title: "Subscriptions",
|
|
3100
|
+
columnEndsAt: "Ends"
|
|
3101
|
+
},
|
|
3102
|
+
draft: {
|
|
3103
|
+
planModules: "{count} base modules"
|
|
3104
|
+
}
|
|
3105
|
+
}
|
|
3106
|
+
);
|
|
3107
|
+
|
|
3108
|
+
// src/client/i18n/messages/users.ts
|
|
3109
|
+
var usersMessages = defineMessages(
|
|
3110
|
+
{
|
|
3111
|
+
title: "Benutzer",
|
|
3112
|
+
filterQuery: "E-Mail oder Name",
|
|
3113
|
+
filterTenant: "Tenant-Slug",
|
|
3114
|
+
statusActive: "aktiv",
|
|
3115
|
+
statusDeactivated: "deaktiviert",
|
|
3116
|
+
badgePending: "Pending",
|
|
3117
|
+
tenantFallback: "\u2014 (SuperAdmin)",
|
|
3118
|
+
reasonPrompt: "Grund f\xFCr Audit (Pflichtfeld):",
|
|
3119
|
+
errorAction: "Aktion fehlgeschlagen",
|
|
3120
|
+
tiles: {
|
|
3121
|
+
blocked: "Gesperrt",
|
|
3122
|
+
neverLoggedIn: "Nie eingeloggt",
|
|
3123
|
+
superAdmins: "Super-Admins"
|
|
3124
|
+
},
|
|
3125
|
+
columns: {
|
|
3126
|
+
email: "E-Mail",
|
|
3127
|
+
tenant: "Tenant",
|
|
3128
|
+
role: "Rolle",
|
|
3129
|
+
lastLogin: "Letzter Login"
|
|
3130
|
+
},
|
|
3131
|
+
resetPassword: {
|
|
3132
|
+
action: "Passwort zur\xFCcksetzen",
|
|
3133
|
+
dialogTitle: 'Passwort f\xFCr "{email}" zur\xFCcksetzen',
|
|
3134
|
+
mfaDescription: 'Passwort f\xFCr "{email}" zur\xFCcksetzen \u2014 {reason}.',
|
|
3135
|
+
otpTitle: "Einmal-Passwort generiert",
|
|
3136
|
+
otpMessage: "Bitte sicher \xFCbermitteln: {password}",
|
|
3137
|
+
otpAcknowledge: "Verstanden",
|
|
3138
|
+
success: "Passwort-Reset ausgel\xF6st."
|
|
3139
|
+
},
|
|
3140
|
+
deactivate: {
|
|
3141
|
+
action: "Deaktivieren",
|
|
3142
|
+
dialogTitle: 'User "{email}" deaktivieren',
|
|
3143
|
+
mfaDescription: 'User "{email}" deaktivieren \u2014 {reason}.',
|
|
3144
|
+
success: "{email} deaktiviert."
|
|
3145
|
+
}
|
|
3146
|
+
},
|
|
3147
|
+
{
|
|
3148
|
+
title: "Users",
|
|
3149
|
+
filterQuery: "Email or name",
|
|
3150
|
+
filterTenant: "Tenant slug",
|
|
3151
|
+
statusActive: "active",
|
|
3152
|
+
statusDeactivated: "deactivated",
|
|
3153
|
+
badgePending: "Pending",
|
|
3154
|
+
tenantFallback: "\u2014 (SuperAdmin)",
|
|
3155
|
+
reasonPrompt: "Reason for the audit trail (required):",
|
|
3156
|
+
errorAction: "Action failed",
|
|
3157
|
+
tiles: {
|
|
3158
|
+
blocked: "Blocked",
|
|
3159
|
+
neverLoggedIn: "Never logged in",
|
|
3160
|
+
superAdmins: "Super admins"
|
|
3161
|
+
},
|
|
3162
|
+
columns: {
|
|
3163
|
+
email: "Email",
|
|
3164
|
+
tenant: "Tenant",
|
|
3165
|
+
role: "Role",
|
|
3166
|
+
lastLogin: "Last login"
|
|
3167
|
+
},
|
|
3168
|
+
resetPassword: {
|
|
3169
|
+
action: "Reset password",
|
|
3170
|
+
dialogTitle: 'Reset password for "{email}"',
|
|
3171
|
+
mfaDescription: 'Reset password for "{email}" \u2014 {reason}.',
|
|
3172
|
+
otpTitle: "One-time password generated",
|
|
3173
|
+
otpMessage: "Please transmit securely: {password}",
|
|
3174
|
+
otpAcknowledge: "Understood",
|
|
3175
|
+
success: "Password reset triggered."
|
|
3176
|
+
},
|
|
3177
|
+
deactivate: {
|
|
3178
|
+
action: "Deactivate",
|
|
3179
|
+
dialogTitle: 'Deactivate user "{email}"',
|
|
3180
|
+
mfaDescription: 'Deactivate user "{email}" \u2014 {reason}.',
|
|
3181
|
+
success: "{email} deactivated."
|
|
3182
|
+
}
|
|
3183
|
+
}
|
|
3184
|
+
);
|
|
3185
|
+
|
|
3186
|
+
// src/client/i18n/messages.ts
|
|
3187
|
+
function catalogFor(locale) {
|
|
3188
|
+
return {
|
|
3189
|
+
common: commonMessages[locale],
|
|
3190
|
+
nav: navMessages[locale],
|
|
3191
|
+
shell: shellMessages[locale],
|
|
3192
|
+
dashboard: dashboardMessages[locale],
|
|
3193
|
+
tenants: tenantsMessages[locale],
|
|
3194
|
+
users: usersMessages[locale],
|
|
3195
|
+
audit: auditMessages[locale],
|
|
3196
|
+
plans: plansMessages[locale],
|
|
3197
|
+
planDetail: planDetailMessages[locale],
|
|
3198
|
+
planEditor: planEditorMessages[locale],
|
|
3199
|
+
planVersions: planVersionsMessages[locale],
|
|
3200
|
+
bundles: bundlesMessages[locale],
|
|
3201
|
+
discovery: discoveryMessages[locale],
|
|
3202
|
+
marketing: marketingMessages[locale],
|
|
3203
|
+
promos: promosMessages[locale],
|
|
3204
|
+
pilots: pilotsMessages[locale],
|
|
3205
|
+
email: emailMessages[locale]
|
|
3206
|
+
};
|
|
3207
|
+
}
|
|
3208
|
+
var SA_MESSAGES = {
|
|
3209
|
+
de: catalogFor("de"),
|
|
3210
|
+
en: catalogFor("en")
|
|
3211
|
+
};
|
|
3212
|
+
function resolveMessages(locale, overrides) {
|
|
3213
|
+
if (!overrides) return SA_MESSAGES[locale];
|
|
3214
|
+
return mergeMessages(SA_MESSAGES[locale], overrides);
|
|
3215
|
+
}
|
|
3216
|
+
|
|
3217
|
+
export {
|
|
3218
|
+
defaultKvStore,
|
|
3219
|
+
defaultHttpClient,
|
|
3220
|
+
SA_LOCALES,
|
|
3221
|
+
DEFAULT_SA_LOCALE,
|
|
3222
|
+
SA_INTL_LOCALES,
|
|
3223
|
+
defineMessages,
|
|
3224
|
+
mergeMessages,
|
|
3225
|
+
navMessages,
|
|
3226
|
+
formatMessage,
|
|
3227
|
+
planVersionsMessages,
|
|
3228
|
+
formatCurrency,
|
|
3229
|
+
SA_MESSAGES,
|
|
3230
|
+
resolveMessages
|
|
3231
|
+
};
|