@saasicat/ui-vue 0.4.0 → 0.6.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 +64 -4
- package/dist/chunk-A3W2N26K.js +714 -0
- package/dist/chunk-QZOSDCNP.js +98 -0
- package/dist/chunk-X5SQ5HMB.js +3231 -0
- package/dist/client/index.cjs +3988 -0
- package/dist/client/index.d.cts +321 -0
- package/dist/client/index.d.ts +321 -0
- package/dist/client/index.js +70 -0
- package/dist/index.cjs +4446 -1249
- package/dist/index.d.cts +297 -888
- package/dist/index.d.ts +297 -888
- package/dist/index.js +609 -1348
- package/dist/messages-7b0P8W75.d.cts +1652 -0
- package/dist/messages-7b0P8W75.d.ts +1652 -0
- package/dist/quasar/index.cjs +3340 -0
- package/dist/quasar/index.d.cts +95 -0
- package/dist/quasar/index.d.ts +95 -0
- package/dist/quasar/index.js +96 -0
- package/dist/testing-e2e/admin-pages-suite.cjs +14 -11
- package/dist/testing-e2e/admin-pages-suite.js +14 -11
- package/dist/use-super-admin-i18n-B3v3-SWZ.d.ts +210 -0
- package/dist/use-super-admin-i18n-DMktRVEt.d.cts +210 -0
- package/package.json +23 -3
- package/src/{action-registry.ts → client/action-registry.ts} +4 -4
- package/src/{batch-column-fetcher.ts → client/batch-column-fetcher.ts} +4 -4
- package/src/{boot-loader.ts → 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 +27 -0
- package/src/{manifest-loader.ts → client/manifest-loader.ts} +4 -4
- package/src/{nav-builder.ts → client/nav-builder.ts} +44 -51
- package/src/{plan-versions-catalog.ts → client/plan-versions-catalog.ts} +42 -30
- package/src/components/BundleVersionPublishDialog.vue +35 -24
- package/src/components/FeatureGate.vue +1 -1
- 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 +21 -10
- package/src/components/plan/PlanGrid.vue +2 -2
- package/src/components/plan/PriceSummary.vue +1 -1
- package/src/components/plan/PromoCodeInput.vue +1 -1
- package/src/components/plan/PublicBundleGrid.vue +1 -1
- 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 +82 -79
- package/src/pages-standard/AdminLayout.vue +43 -18
- 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 +31 -17
- package/src/pages-standard/DiscoveryPage.vue +40 -28
- package/src/pages-standard/EmailHistoryPage.vue +98 -69
- package/src/pages-standard/MarketingCatalogPage.vue +40 -21
- package/src/pages-standard/PilotsPage.vue +64 -52
- package/src/pages-standard/PlanVersionsPage.vue +9 -5
- package/src/pages-standard/PlansPage.vue +91 -59
- package/src/pages-standard/PlatformEmailPage.vue +120 -53
- package/src/pages-standard/PromoCodeDetailPage.vue +66 -63
- package/src/pages-standard/PromoCodesPage.vue +51 -54
- package/src/pages-standard/SubscriptionsPage.vue +14 -9
- package/src/pages-standard/SuperAdminLoginPage.vue +19 -16
- package/src/pages-standard/SuperAdminSetupWizard.vue +53 -49
- package/src/pages-standard/TenantDetailPage.vue +54 -40
- package/src/pages-standard/TenantsPage.vue +57 -44
- package/src/pages-standard/UsersPage.vue +70 -52
- 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 +42 -26
- package/src/pages-standard/plan-versions/PlanVersionsAudit.vue +46 -27
- package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +8 -6
- package/src/pages-standard/plan-versions/PlanVersionsList.vue +40 -17
- package/src/pages-standard/plan-versions/PlanVersionsMatrix.vue +1 -1
- package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +25 -13
- 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 +73 -38
- package/src/pages-tenant/OnboardingConfigurator.vue +3 -3
- package/src/pages-tenant/PackageSnapshotPanel.vue +1 -1
- package/src/pages-tenant/PlanChangeWizard.vue +10 -6
- package/src/pages-tenant/TenantPlanSection.vue +20 -16
- package/src/pages-tenant/default-i18n.ts +217 -1
- package/src/pages-tenant/tenant-plan-section/BundlePreviewDialog.vue +9 -7
- package/src/pages-tenant/tenant-plan-section/TenantBundleStore.vue +11 -12
- package/src/pages-tenant/tenant-plan-section/TenantFeatureMatrix.vue +4 -1
- package/src/pages-tenant/tenant-plan-section/TenantPlanCardHeader.vue +1 -1
- package/src/pages-tenant/tenant-plan-section/TenantUsageGrid.vue +1 -1
- package/src/quasar/create-super-admin-app.ts +192 -0
- package/src/quasar/index.ts +11 -0
- package/src/quasar/notify.ts +30 -0
- package/src/testing-e2e/admin-pages-suite.ts +14 -11
- package/src/{manifest-store-factory.ts → vue/manifest-store-factory.ts} +1 -1
- package/src/{platform-loaders.ts → vue/platform-loaders.ts} +4 -4
- package/src/{project-page-host.ts → vue/project-page-host.ts} +6 -4
- package/src/{create-super-admin-app.ts → vue/super-admin-context.ts} +20 -139
- package/src/vue/ui-notify.ts +30 -0
- package/src/{use-actions.ts → vue/use-actions.ts} +1 -1
- package/src/{use-api-list.ts → vue/use-api-list.ts} +1 -1
- package/src/{use-audit-entries.ts → vue/use-audit-entries.ts} +3 -3
- package/src/{use-batch-columns.ts → vue/use-batch-columns.ts} +1 -1
- package/src/{use-bulk-publish.ts → vue/use-bulk-publish.ts} +7 -5
- package/src/{use-bundle-versions-map.ts → vue/use-bundle-versions-map.ts} +7 -5
- package/src/{use-bundles.ts → vue/use-bundles.ts} +14 -14
- package/src/{use-catalog-entries.ts → vue/use-catalog-entries.ts} +14 -11
- package/src/{use-discovery.ts → vue/use-discovery.ts} +9 -6
- package/src/{use-entitlement.ts → vue/use-entitlement.ts} +4 -4
- package/src/{use-live-plan-versions.ts → vue/use-live-plan-versions.ts} +5 -5
- package/src/{use-manifest.ts → vue/use-manifest.ts} +1 -1
- package/src/{use-marketing-projections.ts → vue/use-marketing-projections.ts} +10 -7
- package/src/{use-nav.ts → vue/use-nav.ts} +9 -3
- package/src/{use-plan-editor.ts → vue/use-plan-editor.ts} +2 -2
- package/src/{use-plan-versions.ts → vue/use-plan-versions.ts} +3 -3
- package/src/{use-plans.ts → vue/use-plans.ts} +13 -13
- package/src/{use-platform-tenant-actions.ts → vue/use-platform-tenant-actions.ts} +9 -6
- package/src/{use-promotions.ts → vue/use-promotions.ts} +10 -11
- package/src/{use-public-boot.ts → vue/use-public-boot.ts} +1 -1
- package/src/{use-subscription-draft.ts → vue/use-subscription-draft.ts} +2 -3
- package/src/{use-super-admin-context.ts → vue/use-super-admin-context.ts} +5 -5
- package/src/vue/use-super-admin-i18n.ts +82 -0
- package/src/{use-tenant-action-flow.ts → vue/use-tenant-action-flow.ts} +12 -7
- package/src/{use-tenant-billing-catalog.ts → vue/use-tenant-billing-catalog.ts} +2 -2
- package/src/{use-tenant-billing.ts → vue/use-tenant-billing.ts} +2 -2
- package/src/{use-tenant-manifest.ts → vue/use-tenant-manifest.ts} +2 -4
- package/src/{use-tenant-subscription-bundles.ts → vue/use-tenant-subscription-bundles.ts} +5 -5
- package/src/{use-tenants.ts → vue/use-tenants.ts} +3 -3
- package/dist/testing-e2e/admin-pages-suite.d.cts +0 -37
- package/dist/testing-e2e/admin-pages-suite.d.ts +0 -37
- 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/use-business-types.ts +0 -269
- /package/src/{http-json.ts → client/http-json.ts} +0 -0
- /package/src/{types.ts → client/types.ts} +0 -0
- /package/src/{version.ts → client/version.ts} +0 -0
- /package/src/{create-admin-routes.ts → vue/create-admin-routes.ts} +0 -0
- /package/src/{entitlement-provider.ts → vue/entitlement-provider.ts} +0 -0
- /package/src/{feature-router-guard.ts → vue/feature-router-guard.ts} +0 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { defineMessages } from '../define.js';
|
|
2
|
+
|
|
3
|
+
export const discoveryMessages = defineMessages(
|
|
4
|
+
{
|
|
5
|
+
title: 'Discovery',
|
|
6
|
+
subtitleLead: 'Capabilities, die der Code',
|
|
7
|
+
subtitleEmphasis: 'aktuell',
|
|
8
|
+
subtitleTail:
|
|
9
|
+
'implementiert. Discovery ist Ist-Zustand — die Freigabe für Produkt & Marketing erfolgt im Review.',
|
|
10
|
+
runDiscovery: 'Discovery neu ausführen',
|
|
11
|
+
lastScan: 'Letzter Scan',
|
|
12
|
+
notScannedYet: 'noch nicht gescannt',
|
|
13
|
+
tabFeatures: 'Features ({count})',
|
|
14
|
+
tabQuotas: 'Quotas ({count})',
|
|
15
|
+
searchPlaceholder: 'Feature-Key, Label oder Capability suchen …',
|
|
16
|
+
statusFilterAll: 'Alle Status',
|
|
17
|
+
noFeaturesMatchFilters: 'Keine Features entsprechen den Filtern.',
|
|
18
|
+
noQuotasDeclared: 'Keine Quotas im Code deklariert.',
|
|
19
|
+
orphansTitle: 'Capabilities ohne Feature',
|
|
20
|
+
noOwner: 'Ohne Owner',
|
|
21
|
+
owner: 'Owner',
|
|
22
|
+
unit: 'Einheit',
|
|
23
|
+
replacedBy: 'ersetzt durch {key}',
|
|
24
|
+
replaces: 'ersetzt: {keys}',
|
|
25
|
+
reapproveEmphasis: 'erneut freigeben',
|
|
26
|
+
errorDiscoveryHttp: 'Discovery-Endpoint antwortete mit HTTP {status}',
|
|
27
|
+
errorRescanHttp: 'Discovery-Rescan antwortete mit HTTP {status}',
|
|
28
|
+
errorCatalogHttp: 'Catalog-Entries-API antwortete mit HTTP {status}',
|
|
29
|
+
capList: {
|
|
30
|
+
orphanFeature:
|
|
31
|
+
'Feature im Katalog ohne implementierende Capability — blockiert im blocking-Strict-Mode das Plan-Publish.',
|
|
32
|
+
removedFromCode: 'aus Code entfernt',
|
|
33
|
+
},
|
|
34
|
+
kpi: {
|
|
35
|
+
featuresTotal: 'Features gesamt',
|
|
36
|
+
featuresTotalSub: 'aggregiert aus {count} Capabilities',
|
|
37
|
+
approved: 'Freigegeben',
|
|
38
|
+
approvedSub: 'planungsbereit',
|
|
39
|
+
pending: 'Ausstehend',
|
|
40
|
+
pendingSub: 'noch nicht freigegeben',
|
|
41
|
+
outdated: 'Veraltet / Obsolet',
|
|
42
|
+
outdatedSub: '{outdated} outdated · {obsolete} obsolete',
|
|
43
|
+
orphans: 'Orphans',
|
|
44
|
+
},
|
|
45
|
+
orphanHint: {
|
|
46
|
+
before: 'Diesen Capabilities fehlt der',
|
|
47
|
+
middle: '-Tag im',
|
|
48
|
+
after: '-Decorator — Feature-Zuordnung im Code nachziehen, sonst sind sie nicht verkaufbar.',
|
|
49
|
+
},
|
|
50
|
+
statusLabels: {
|
|
51
|
+
pending: 'Pending',
|
|
52
|
+
approved: 'Approved',
|
|
53
|
+
outdated: 'Outdated',
|
|
54
|
+
obsolete: 'Obsolete',
|
|
55
|
+
},
|
|
56
|
+
statusHints: {
|
|
57
|
+
pending:
|
|
58
|
+
'Im Code gefunden, noch nicht freigegeben — steht der Planung nicht zur Verfügung.',
|
|
59
|
+
approved: 'Für Pläne, Bundles & Marketing freigegeben.',
|
|
60
|
+
outdated:
|
|
61
|
+
'Code hat sich seit der Freigabe geändert — bitte erneut prüfen und freigeben.',
|
|
62
|
+
obsolete: 'Abgekündigt — nicht mehr verwenden, in neuen Plänen ausblenden.',
|
|
63
|
+
},
|
|
64
|
+
reviewActions: {
|
|
65
|
+
approve: 'Freigeben',
|
|
66
|
+
revoke: 'Freigabe entziehen',
|
|
67
|
+
reapprove: 'Erneut freigeben',
|
|
68
|
+
reactivate: 'Reaktivieren',
|
|
69
|
+
markOutdated: 'Als veraltet markieren',
|
|
70
|
+
markObsolete: 'Als obsolet markieren',
|
|
71
|
+
},
|
|
72
|
+
feature: {
|
|
73
|
+
newCaps: '{count} neu',
|
|
74
|
+
deprecatedCaps: '{count} deprecated',
|
|
75
|
+
capabilityOne: 'Capability',
|
|
76
|
+
capabilityMany: 'Capabilities',
|
|
77
|
+
outdatedBanner:
|
|
78
|
+
'Die Implementierung hat sich seit der letzten Freigabe geändert. Bitte Stammdaten & Capabilities prüfen und',
|
|
79
|
+
obsoleteBanner:
|
|
80
|
+
'Dieses Feature ist abgekündigt. Es sollte in neuen Plänen nicht mehr verwendet werden.',
|
|
81
|
+
tabBaseData: 'Stammdaten',
|
|
82
|
+
tabTranslations: 'Übersetzungen',
|
|
83
|
+
settings: 'Einstellungen',
|
|
84
|
+
iconLabel: 'Icon (Quasar-Icon-Name)',
|
|
85
|
+
iconPlaceholder: 'z. B. directions_car',
|
|
86
|
+
tierLabel: 'Tier',
|
|
87
|
+
codeCapabilities: 'Code Capabilities',
|
|
88
|
+
codeCapabilitiesCount: '{count} · read-only',
|
|
89
|
+
},
|
|
90
|
+
quota: {
|
|
91
|
+
usageProvider: 'UsageProvider',
|
|
92
|
+
usageProviderMissing: 'fehlt',
|
|
93
|
+
noUsageProviderWarning:
|
|
94
|
+
'Eine harte Quota ohne UsageProvider ist nicht deploy-fähig (Preflight, SPEC_V2 §6.3).',
|
|
95
|
+
outdatedBanner:
|
|
96
|
+
'Die code-abgeleiteten Quota-Fakten (Einheit/Enforcement/Provider) haben sich seit der letzten Freigabe geändert — bitte prüfen und',
|
|
97
|
+
},
|
|
98
|
+
caps: {
|
|
99
|
+
emptyHint:
|
|
100
|
+
'Feature im Katalog ohne implementierende Capability — blockiert im blocking-Strict-Mode das Plan-Publish.',
|
|
101
|
+
flagNew: 'neu',
|
|
102
|
+
flagExperimental: 'experimental',
|
|
103
|
+
flagDeprecated: 'deprecated',
|
|
104
|
+
flagRemoved: 'aus Code entfernt',
|
|
105
|
+
implementedAt: 'impl',
|
|
106
|
+
},
|
|
107
|
+
trans: {
|
|
108
|
+
sourceBadge: 'Source',
|
|
109
|
+
fieldLabel: 'Label',
|
|
110
|
+
unitFromCode: 'aus Code',
|
|
111
|
+
copyFromDefault: 'Aus DE',
|
|
112
|
+
copyFromDefaultHint: 'Leere Felder aus der Default-Locale übernehmen',
|
|
113
|
+
fallbackPlaceholder: 'Fallback: „{value}“',
|
|
114
|
+
noOtherLocales:
|
|
115
|
+
'Keine weiteren Sprachen aktiv — Sprachen werden im Marketing-Catalog aktiviert.',
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
title: 'Discovery',
|
|
120
|
+
subtitleLead: 'Capabilities the code',
|
|
121
|
+
subtitleEmphasis: 'currently',
|
|
122
|
+
subtitleTail:
|
|
123
|
+
'implements. Discovery is the actual state — approval for product & marketing happens in the review.',
|
|
124
|
+
runDiscovery: 'Run discovery again',
|
|
125
|
+
lastScan: 'Last scan',
|
|
126
|
+
notScannedYet: 'not scanned yet',
|
|
127
|
+
tabFeatures: 'Features ({count})',
|
|
128
|
+
tabQuotas: 'Quotas ({count})',
|
|
129
|
+
searchPlaceholder: 'Search feature key, label or capability …',
|
|
130
|
+
statusFilterAll: 'All statuses',
|
|
131
|
+
noFeaturesMatchFilters: 'No features match the filters.',
|
|
132
|
+
noQuotasDeclared: 'No quotas declared in the code.',
|
|
133
|
+
orphansTitle: 'Capabilities without a feature',
|
|
134
|
+
noOwner: 'Without owner',
|
|
135
|
+
owner: 'Owner',
|
|
136
|
+
unit: 'Unit',
|
|
137
|
+
replacedBy: 'replaced by {key}',
|
|
138
|
+
replaces: 'replaces: {keys}',
|
|
139
|
+
reapproveEmphasis: 'approve again',
|
|
140
|
+
errorDiscoveryHttp: 'Discovery endpoint responded with HTTP {status}',
|
|
141
|
+
errorRescanHttp: 'Discovery rescan responded with HTTP {status}',
|
|
142
|
+
errorCatalogHttp: 'Catalog entries API responded with HTTP {status}',
|
|
143
|
+
capList: {
|
|
144
|
+
orphanFeature:
|
|
145
|
+
'Feature in the catalog without an implementing capability — blocks plan publishing in blocking strict mode.',
|
|
146
|
+
removedFromCode: 'removed from code',
|
|
147
|
+
},
|
|
148
|
+
kpi: {
|
|
149
|
+
featuresTotal: 'Features total',
|
|
150
|
+
featuresTotalSub: 'aggregated from {count} capabilities',
|
|
151
|
+
approved: 'Approved',
|
|
152
|
+
approvedSub: 'ready for planning',
|
|
153
|
+
pending: 'Pending',
|
|
154
|
+
pendingSub: 'not approved yet',
|
|
155
|
+
outdated: 'Outdated / obsolete',
|
|
156
|
+
outdatedSub: '{outdated} outdated · {obsolete} obsolete',
|
|
157
|
+
orphans: 'Orphans',
|
|
158
|
+
},
|
|
159
|
+
orphanHint: {
|
|
160
|
+
before: 'These capabilities are missing the',
|
|
161
|
+
middle: ' tag in the',
|
|
162
|
+
after: ' decorator — add the feature assignment in the code, otherwise they cannot be sold.',
|
|
163
|
+
},
|
|
164
|
+
statusLabels: {
|
|
165
|
+
pending: 'Pending',
|
|
166
|
+
approved: 'Approved',
|
|
167
|
+
outdated: 'Outdated',
|
|
168
|
+
obsolete: 'Obsolete',
|
|
169
|
+
},
|
|
170
|
+
statusHints: {
|
|
171
|
+
pending: 'Found in the code, not approved yet — not available for planning.',
|
|
172
|
+
approved: 'Approved for plans, bundles & marketing.',
|
|
173
|
+
outdated: 'The code has changed since the approval — please review and approve again.',
|
|
174
|
+
obsolete: 'Deprecated — do not use any more, hide in new plans.',
|
|
175
|
+
},
|
|
176
|
+
reviewActions: {
|
|
177
|
+
approve: 'Approve',
|
|
178
|
+
revoke: 'Revoke approval',
|
|
179
|
+
reapprove: 'Approve again',
|
|
180
|
+
reactivate: 'Reactivate',
|
|
181
|
+
markOutdated: 'Mark as outdated',
|
|
182
|
+
markObsolete: 'Mark as obsolete',
|
|
183
|
+
},
|
|
184
|
+
feature: {
|
|
185
|
+
newCaps: '{count} new',
|
|
186
|
+
deprecatedCaps: '{count} deprecated',
|
|
187
|
+
capabilityOne: 'Capability',
|
|
188
|
+
capabilityMany: 'Capabilities',
|
|
189
|
+
outdatedBanner:
|
|
190
|
+
'The implementation has changed since the last approval. Please review the master data & capabilities and',
|
|
191
|
+
obsoleteBanner: 'This feature is deprecated. It should no longer be used in new plans.',
|
|
192
|
+
tabBaseData: 'Master data',
|
|
193
|
+
tabTranslations: 'Translations',
|
|
194
|
+
settings: 'Settings',
|
|
195
|
+
iconLabel: 'Icon (Quasar icon name)',
|
|
196
|
+
iconPlaceholder: 'e.g. directions_car',
|
|
197
|
+
tierLabel: 'Tier',
|
|
198
|
+
codeCapabilities: 'Code capabilities',
|
|
199
|
+
codeCapabilitiesCount: '{count} · read-only',
|
|
200
|
+
},
|
|
201
|
+
quota: {
|
|
202
|
+
usageProvider: 'UsageProvider',
|
|
203
|
+
usageProviderMissing: 'missing',
|
|
204
|
+
noUsageProviderWarning:
|
|
205
|
+
'A hard quota without a UsageProvider is not deployable (preflight, SPEC_V2 §6.3).',
|
|
206
|
+
outdatedBanner:
|
|
207
|
+
'The code-derived quota facts (unit/enforcement/provider) have changed since the last approval — please review and',
|
|
208
|
+
},
|
|
209
|
+
caps: {
|
|
210
|
+
emptyHint:
|
|
211
|
+
'Feature in the catalog without an implementing capability — blocks the plan publish in blocking strict mode.',
|
|
212
|
+
flagNew: 'new',
|
|
213
|
+
flagExperimental: 'experimental',
|
|
214
|
+
flagDeprecated: 'deprecated',
|
|
215
|
+
flagRemoved: 'removed from code',
|
|
216
|
+
implementedAt: 'impl',
|
|
217
|
+
},
|
|
218
|
+
trans: {
|
|
219
|
+
sourceBadge: 'Source',
|
|
220
|
+
fieldLabel: 'Label',
|
|
221
|
+
unitFromCode: 'from code',
|
|
222
|
+
copyFromDefault: 'From DE',
|
|
223
|
+
copyFromDefaultHint: 'Fill empty fields from the default locale',
|
|
224
|
+
fallbackPlaceholder: 'Fallback: “{value}”',
|
|
225
|
+
noOtherLocales:
|
|
226
|
+
'No other languages active — languages are activated in the marketing catalog.',
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
);
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { defineMessages } from '../define.js';
|
|
2
|
+
|
|
3
|
+
export const emailMessages = defineMessages(
|
|
4
|
+
{
|
|
5
|
+
sender: 'Absender',
|
|
6
|
+
recipient: 'Empfänger',
|
|
7
|
+
errorAction: 'Aktion fehlgeschlagen',
|
|
8
|
+
provider: {
|
|
9
|
+
title: 'Plattform-E-Mail',
|
|
10
|
+
subtitle: 'Zentraler Absender für Registrierungs- und System-Mails dieser Plattform.',
|
|
11
|
+
sendTestMail: 'Test-Mail senden',
|
|
12
|
+
dialogCreateTitle: 'Absender anlegen',
|
|
13
|
+
dialogEditTitle: 'Absender bearbeiten',
|
|
14
|
+
fieldSmtpHost: 'SMTP-Host',
|
|
15
|
+
fieldSmtpPort: 'SMTP-Port',
|
|
16
|
+
fieldSmtpUser: 'SMTP-Benutzer',
|
|
17
|
+
fieldSmtpPassword: 'SMTP-Passwort',
|
|
18
|
+
fieldSmtpPasswordEdit: 'SMTP-Passwort (leer = unverändert)',
|
|
19
|
+
fieldEncryption: 'Verschlüsselung',
|
|
20
|
+
fieldFromEmail: 'Absender-Adresse',
|
|
21
|
+
fieldFromName: 'Absender-Name',
|
|
22
|
+
fieldSubject: 'Betreff (optional)',
|
|
23
|
+
send: 'Senden',
|
|
24
|
+
statusActive: 'aktiv',
|
|
25
|
+
statusInactive: 'inaktiv',
|
|
26
|
+
columnHost: 'Host',
|
|
27
|
+
columnEncryption: 'Krypto',
|
|
28
|
+
deleteDialogTitle: 'Absender löschen',
|
|
29
|
+
deleteDialogMessage: '"{name}" wirklich löschen?',
|
|
30
|
+
mfaCreate: 'Absender "{name}" anlegen.',
|
|
31
|
+
mfaSave: 'Absender "{name}" speichern.',
|
|
32
|
+
mfaDelete: 'Absender "{name}" löschen.',
|
|
33
|
+
saved: 'Gespeichert.',
|
|
34
|
+
deleted: 'Gelöscht.',
|
|
35
|
+
},
|
|
36
|
+
history: {
|
|
37
|
+
title: 'Plattform-E-Mail-Verlauf',
|
|
38
|
+
subtitle:
|
|
39
|
+
'Über den Plattform-Absender versendete System-Mails — Empfänger, Status und Fehler.',
|
|
40
|
+
searchLabel: 'Suche (Empfänger, Betreff, Inhalt …)',
|
|
41
|
+
statusSent: 'Gesendet',
|
|
42
|
+
statusFailed: 'Fehlgeschlagen',
|
|
43
|
+
statusPending: 'Ausstehend',
|
|
44
|
+
statusBounced: 'Bounced',
|
|
45
|
+
resend: 'Erneut senden',
|
|
46
|
+
removeFromHistory: 'Aus Verlauf entfernen',
|
|
47
|
+
empty: 'Keine E-Mails im Verlauf.',
|
|
48
|
+
columnSubject: 'Betreff',
|
|
49
|
+
columnCreatedAt: 'Erstellt',
|
|
50
|
+
columnSentAt: 'Gesendet',
|
|
51
|
+
detailFromTo: 'Von {from} · An {to}',
|
|
52
|
+
detailTimestamps: 'Erstellt {created} · Gesendet {sent}',
|
|
53
|
+
noContent: 'Kein Inhalt gespeichert.',
|
|
54
|
+
smtpResponse: 'SMTP-Antwort',
|
|
55
|
+
confirmRemoveTitle: 'E-Mail entfernen',
|
|
56
|
+
confirmRemoveMessage:
|
|
57
|
+
'Diese E-Mail aus dem Verlauf entfernen? Der Eintrag wird ausgeblendet, bleibt aber für das Audit erhalten.',
|
|
58
|
+
mfaResend: 'Plattform-Mail erneut senden',
|
|
59
|
+
mfaRemove: 'Plattform-Mail aus Verlauf entfernen',
|
|
60
|
+
sendFailed: 'Versand fehlgeschlagen',
|
|
61
|
+
resendSuccess: 'E-Mail erneut versendet',
|
|
62
|
+
removeSuccess: 'Aus Verlauf entfernt',
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
sender: 'Sender',
|
|
67
|
+
recipient: 'Recipient',
|
|
68
|
+
errorAction: 'Action failed',
|
|
69
|
+
provider: {
|
|
70
|
+
title: 'Platform email',
|
|
71
|
+
subtitle: 'Central sender for registration and system emails of this platform.',
|
|
72
|
+
sendTestMail: 'Send test email',
|
|
73
|
+
dialogCreateTitle: 'Create sender',
|
|
74
|
+
dialogEditTitle: 'Edit sender',
|
|
75
|
+
fieldSmtpHost: 'SMTP host',
|
|
76
|
+
fieldSmtpPort: 'SMTP port',
|
|
77
|
+
fieldSmtpUser: 'SMTP user',
|
|
78
|
+
fieldSmtpPassword: 'SMTP password',
|
|
79
|
+
fieldSmtpPasswordEdit: 'SMTP password (empty = unchanged)',
|
|
80
|
+
fieldEncryption: 'Encryption',
|
|
81
|
+
fieldFromEmail: 'Sender address',
|
|
82
|
+
fieldFromName: 'Sender name',
|
|
83
|
+
fieldSubject: 'Subject (optional)',
|
|
84
|
+
send: 'Send',
|
|
85
|
+
statusActive: 'active',
|
|
86
|
+
statusInactive: 'inactive',
|
|
87
|
+
columnHost: 'Host',
|
|
88
|
+
columnEncryption: 'Crypto',
|
|
89
|
+
deleteDialogTitle: 'Delete sender',
|
|
90
|
+
deleteDialogMessage: 'Really delete "{name}"?',
|
|
91
|
+
mfaCreate: 'Create sender "{name}".',
|
|
92
|
+
mfaSave: 'Save sender "{name}".',
|
|
93
|
+
mfaDelete: 'Delete sender "{name}".',
|
|
94
|
+
saved: 'Saved.',
|
|
95
|
+
deleted: 'Deleted.',
|
|
96
|
+
},
|
|
97
|
+
history: {
|
|
98
|
+
title: 'Platform email history',
|
|
99
|
+
subtitle: 'System emails sent via the platform sender — recipients, status and errors.',
|
|
100
|
+
searchLabel: 'Search (recipient, subject, content …)',
|
|
101
|
+
statusSent: 'Sent',
|
|
102
|
+
statusFailed: 'Failed',
|
|
103
|
+
statusPending: 'Pending',
|
|
104
|
+
statusBounced: 'Bounced',
|
|
105
|
+
resend: 'Resend',
|
|
106
|
+
removeFromHistory: 'Remove from history',
|
|
107
|
+
empty: 'No emails in the history.',
|
|
108
|
+
columnSubject: 'Subject',
|
|
109
|
+
columnCreatedAt: 'Created',
|
|
110
|
+
columnSentAt: 'Sent',
|
|
111
|
+
detailFromTo: 'From {from} · To {to}',
|
|
112
|
+
detailTimestamps: 'Created {created} · Sent {sent}',
|
|
113
|
+
noContent: 'No content stored.',
|
|
114
|
+
smtpResponse: 'SMTP response',
|
|
115
|
+
confirmRemoveTitle: 'Remove email',
|
|
116
|
+
confirmRemoveMessage:
|
|
117
|
+
'Remove this email from the history? The entry is hidden but kept for the audit trail.',
|
|
118
|
+
mfaResend: 'Resend platform email',
|
|
119
|
+
mfaRemove: 'Remove platform email from history',
|
|
120
|
+
sendFailed: 'Sending failed',
|
|
121
|
+
resendSuccess: 'Email resent',
|
|
122
|
+
removeSuccess: 'Removed from history',
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
);
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { defineMessages } from '../define.js';
|
|
2
|
+
|
|
3
|
+
export const marketingMessages = defineMessages(
|
|
4
|
+
{
|
|
5
|
+
topFeatures: 'Top-Features',
|
|
6
|
+
tabs: {
|
|
7
|
+
preview: 'Public-Catalog Vorschau',
|
|
8
|
+
admin: 'Marketing-Verwaltung',
|
|
9
|
+
promos: 'Aktionen',
|
|
10
|
+
},
|
|
11
|
+
header: {
|
|
12
|
+
title: 'Marketing-Catalog',
|
|
13
|
+
subtitle:
|
|
14
|
+
'Öffentliche Marketing-Projektion · gefilterte Sicht für Website, Pricing-Page und Checkout',
|
|
15
|
+
localesLabel: 'Sprachen:',
|
|
16
|
+
defaultLocale: 'Default-Sprache',
|
|
17
|
+
deactivateLocale: 'Sprache deaktivieren',
|
|
18
|
+
addLocale: '+ Sprache',
|
|
19
|
+
refresh: 'Aktualisieren',
|
|
20
|
+
},
|
|
21
|
+
page: {
|
|
22
|
+
loading: 'Lade Marketing-Catalog …',
|
|
23
|
+
emptyPlansBefore:
|
|
24
|
+
'Noch keine Pläne angelegt — der Marketing-Catalog projiziert veröffentlichte Pläne. Lege zuerst unter',
|
|
25
|
+
emptyPlansLink: 'Pläne',
|
|
26
|
+
emptyPlansAfter: 'einen Plan mit Live-Version an.',
|
|
27
|
+
},
|
|
28
|
+
cta: {
|
|
29
|
+
contact: 'Kontakt aufnehmen',
|
|
30
|
+
trial: 'Jetzt {days} Tage testen',
|
|
31
|
+
choosePlan: 'Plan wählen',
|
|
32
|
+
},
|
|
33
|
+
preview: {
|
|
34
|
+
eyebrow: 'Preise & Pakete',
|
|
35
|
+
hero: 'Der passende Plan',
|
|
36
|
+
sub: 'Flexibel skalieren, jederzeit upgraden. Kein Setup-Fee, monatlich kündbar.',
|
|
37
|
+
emptyBefore:
|
|
38
|
+
'Kein Plan ist aktuell für den Public-Catalog sichtbar. Aktiviere die Sichtbarkeit im Tab',
|
|
39
|
+
emptyAfter: '.',
|
|
40
|
+
priceOnRequest: 'Auf Anfrage',
|
|
41
|
+
perMonth: '/ Monat',
|
|
42
|
+
regularPrice: 'regulär',
|
|
43
|
+
orYearly: 'oder {price} jährlich',
|
|
44
|
+
trialNote: '{days} Tage kostenlos · keine Kreditkarte nötig',
|
|
45
|
+
promoBadgeFallback: 'Aktion',
|
|
46
|
+
noTopFeatures: 'Keine Top-Features gepflegt.',
|
|
47
|
+
},
|
|
48
|
+
admin: {
|
|
49
|
+
subtitle:
|
|
50
|
+
'Sichtbarkeit, Reihenfolge & Highlight-Badges pro Plan · Edits gehen direkt live',
|
|
51
|
+
colPlan: 'Plan',
|
|
52
|
+
colVisible: 'Sichtbar',
|
|
53
|
+
colBadge: 'Badge',
|
|
54
|
+
colPriority: 'Priorität',
|
|
55
|
+
colHighlight: 'Highlight',
|
|
56
|
+
versionTabsLabel: 'Plan-Versionen für {plan}',
|
|
57
|
+
versionTitle: 'Version {version}: gültig {from} bis {until}{changeNote}',
|
|
58
|
+
versionValidFromUnknown: 'unbekannt',
|
|
59
|
+
noLiveVersion: 'keine Live-Version',
|
|
60
|
+
hidden: 'versteckt',
|
|
61
|
+
featured: 'Featured',
|
|
62
|
+
live: 'live',
|
|
63
|
+
expandTitle: 'Teaser, Trial & Top-Features bearbeiten',
|
|
64
|
+
planNameLabel: 'Plan-Name',
|
|
65
|
+
planNameLocked: 'wird in den Plan-Stammdaten gepflegt',
|
|
66
|
+
planNameSourceValue: '„{label}"',
|
|
67
|
+
planNameFallbackHint: 'leer · Fallback auf „{label}" wird verwendet',
|
|
68
|
+
teaserLabel: 'Teaser-Text',
|
|
69
|
+
teaserPlaceholder: 'Kurzbeschreibung für die Pricing-Page …',
|
|
70
|
+
teaserHint: 'erscheint unter dem Plannamen in der Vorschau',
|
|
71
|
+
trialLabel: 'Kostenlose Testphase',
|
|
72
|
+
trialOn: 'Trial aktiv',
|
|
73
|
+
trialOff: 'Kein Trial',
|
|
74
|
+
trialDaysUnit: 'Tage',
|
|
75
|
+
ctaAutoHint: 'CTA-Text generiert sich automatisch („{cta}“).',
|
|
76
|
+
ctaOverrideLabel: 'CTA-Text überschreiben (optional)',
|
|
77
|
+
ctaOverrideHint: 'leer lassen für Auto-Text',
|
|
78
|
+
topFeatureCount: '{count} Einträge',
|
|
79
|
+
featureLabelPlaceholder: 'z. B. Beitragsverwaltung',
|
|
80
|
+
featureStrongPlaceholder: 'Highlight, z. B. bis 100',
|
|
81
|
+
moveUp: 'Nach oben',
|
|
82
|
+
moveDown: 'Nach unten',
|
|
83
|
+
topFeaturesEmpty:
|
|
84
|
+
'Noch keine Top-Features — füge Plan-Komponenten oder freien Text hinzu.',
|
|
85
|
+
addCustomFeature: 'Eigener Eintrag',
|
|
86
|
+
suggestionsLabel: 'aus Plan-Komponenten:',
|
|
87
|
+
addSuggestionTitle: '„{label}“ als Top-Feature übernehmen',
|
|
88
|
+
},
|
|
89
|
+
promotionsTab: {
|
|
90
|
+
title: 'Aktionen & Rabatte',
|
|
91
|
+
subtitle:
|
|
92
|
+
'Zeitlich begrenzte Preis-Aktionen — überschreiben den regulären Preis auf der Pricing-Page (SPEC_V2 §9a).',
|
|
93
|
+
add: '+ Aktion anlegen',
|
|
94
|
+
timelineHead: 'Aktions-Timeline · gestrichelt = heute',
|
|
95
|
+
today: 'heute',
|
|
96
|
+
emptyBefore: 'Noch keine Aktionen. Über',
|
|
97
|
+
emptyAfter: 'eine zeitgesteuerte Preis-Aktion erstellen.',
|
|
98
|
+
statusActive: 'aktiv',
|
|
99
|
+
statusScheduled: 'geplant',
|
|
100
|
+
statusExpired: 'abgelaufen',
|
|
101
|
+
noPlans: '— keine Pläne —',
|
|
102
|
+
cycleMonthlyShort: 'mtl.',
|
|
103
|
+
cycleYearlyShort: 'jährl.',
|
|
104
|
+
cycleBothShort: 'mtl. & jährl.',
|
|
105
|
+
onlyPrefix: 'nur',
|
|
106
|
+
chipIntro: '{price} € · {months} Mo.',
|
|
107
|
+
chipFreeMonths: '{months} Mo. gratis',
|
|
108
|
+
newPromotionLabel: 'Neue Aktion',
|
|
109
|
+
internalLabelLabel: 'Interne Bezeichnung',
|
|
110
|
+
typePercent: 'Prozent-Rabatt',
|
|
111
|
+
typeAmount: 'Festbetrag',
|
|
112
|
+
typeIntro: 'Einführungspreis',
|
|
113
|
+
typeFreeMonths: 'Gratis-Monate',
|
|
114
|
+
valueLabel: 'Wert',
|
|
115
|
+
percentUnit: '% Rabatt',
|
|
116
|
+
amountUnit: '€ Festbetrag',
|
|
117
|
+
introForPrefix: 'für',
|
|
118
|
+
introMonthsUnit: 'Monate à',
|
|
119
|
+
introPriceUnit: '€/Mo',
|
|
120
|
+
freeMonthsPrefix: 'erste',
|
|
121
|
+
freeMonthsUnit: 'Monate gratis',
|
|
122
|
+
billingCycleLabel: 'Abrechnungs-Zyklus',
|
|
123
|
+
priorityLabel: 'Priorität',
|
|
124
|
+
appliesToLabel: 'Betroffene Pläne',
|
|
125
|
+
localeRestrictionLabel: 'Sprach-Beschränkung',
|
|
126
|
+
allLocales: 'alle Sprachen',
|
|
127
|
+
translationsLabel: 'Übersetzungen',
|
|
128
|
+
badgePlaceholder: 'Badge-Text',
|
|
129
|
+
fineprintPlaceholder: 'Fineprint (unter dem CTA)',
|
|
130
|
+
colorLabel: 'Farbe',
|
|
131
|
+
delete: 'Aktion löschen',
|
|
132
|
+
deleteConfirm: 'Aktion „{label}“ wirklich löschen?',
|
|
133
|
+
},
|
|
134
|
+
errors: {
|
|
135
|
+
projectionsApi: 'MarketingProjections-API antwortete mit HTTP {status}',
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
topFeatures: 'Top features',
|
|
140
|
+
tabs: {
|
|
141
|
+
preview: 'Public catalog preview',
|
|
142
|
+
admin: 'Marketing administration',
|
|
143
|
+
promos: 'Promotions',
|
|
144
|
+
},
|
|
145
|
+
header: {
|
|
146
|
+
title: 'Marketing catalog',
|
|
147
|
+
subtitle:
|
|
148
|
+
'Public marketing projection · filtered view for website, pricing page and checkout',
|
|
149
|
+
localesLabel: 'Languages:',
|
|
150
|
+
defaultLocale: 'Default language',
|
|
151
|
+
deactivateLocale: 'Deactivate language',
|
|
152
|
+
addLocale: '+ Language',
|
|
153
|
+
refresh: 'Refresh',
|
|
154
|
+
},
|
|
155
|
+
page: {
|
|
156
|
+
loading: 'Loading marketing catalog …',
|
|
157
|
+
emptyPlansBefore:
|
|
158
|
+
'No plans created yet — the marketing catalog projects published plans. Go to',
|
|
159
|
+
emptyPlansLink: 'Plans',
|
|
160
|
+
emptyPlansAfter: 'first and create a plan with a live version.',
|
|
161
|
+
},
|
|
162
|
+
cta: {
|
|
163
|
+
contact: 'Get in touch',
|
|
164
|
+
trial: 'Start your {days}-day trial',
|
|
165
|
+
choosePlan: 'Choose plan',
|
|
166
|
+
},
|
|
167
|
+
preview: {
|
|
168
|
+
eyebrow: 'Pricing & plans',
|
|
169
|
+
hero: 'The right plan for you',
|
|
170
|
+
sub: 'Scale flexibly, upgrade anytime. No setup fee, cancel monthly.',
|
|
171
|
+
emptyBefore:
|
|
172
|
+
'No plan is currently visible in the public catalog. Enable visibility in the',
|
|
173
|
+
emptyAfter: ' tab.',
|
|
174
|
+
priceOnRequest: 'On request',
|
|
175
|
+
perMonth: '/ month',
|
|
176
|
+
regularPrice: 'regular',
|
|
177
|
+
orYearly: 'or {price} yearly',
|
|
178
|
+
trialNote: '{days} days free · no credit card required',
|
|
179
|
+
promoBadgeFallback: 'Promotion',
|
|
180
|
+
noTopFeatures: 'No top features maintained.',
|
|
181
|
+
},
|
|
182
|
+
admin: {
|
|
183
|
+
subtitle: 'Visibility, order & highlight badges per plan · edits go live immediately',
|
|
184
|
+
colPlan: 'Plan',
|
|
185
|
+
colVisible: 'Visible',
|
|
186
|
+
colBadge: 'Badge',
|
|
187
|
+
colPriority: 'Priority',
|
|
188
|
+
colHighlight: 'Highlight',
|
|
189
|
+
versionTabsLabel: 'Plan versions for {plan}',
|
|
190
|
+
versionTitle: 'Version {version}: valid {from} to {until}{changeNote}',
|
|
191
|
+
versionValidFromUnknown: 'unknown',
|
|
192
|
+
noLiveVersion: 'no live version',
|
|
193
|
+
hidden: 'hidden',
|
|
194
|
+
featured: 'Featured',
|
|
195
|
+
live: 'live',
|
|
196
|
+
expandTitle: 'Edit teaser, trial & top features',
|
|
197
|
+
planNameLabel: 'Plan name',
|
|
198
|
+
planNameLocked: 'maintained in the plan master data',
|
|
199
|
+
planNameSourceValue: '"{label}"',
|
|
200
|
+
planNameFallbackHint: 'empty · fallback to "{label}" is used',
|
|
201
|
+
teaserLabel: 'Teaser text',
|
|
202
|
+
teaserPlaceholder: 'Short description for the pricing page …',
|
|
203
|
+
teaserHint: 'appears below the plan name in the preview',
|
|
204
|
+
trialLabel: 'Free trial',
|
|
205
|
+
trialOn: 'Trial active',
|
|
206
|
+
trialOff: 'No trial',
|
|
207
|
+
trialDaysUnit: 'days',
|
|
208
|
+
ctaAutoHint: 'The CTA text is generated automatically ("{cta}").',
|
|
209
|
+
ctaOverrideLabel: 'Override CTA text (optional)',
|
|
210
|
+
ctaOverrideHint: 'leave empty for the auto text',
|
|
211
|
+
topFeatureCount: '{count} entries',
|
|
212
|
+
featureLabelPlaceholder: 'e.g. Membership management',
|
|
213
|
+
featureStrongPlaceholder: 'Highlight, e.g. up to 100',
|
|
214
|
+
moveUp: 'Move up',
|
|
215
|
+
moveDown: 'Move down',
|
|
216
|
+
topFeaturesEmpty: 'No top features yet — add plan components or free text.',
|
|
217
|
+
addCustomFeature: 'Custom entry',
|
|
218
|
+
suggestionsLabel: 'from plan components:',
|
|
219
|
+
addSuggestionTitle: 'Add "{label}" as a top feature',
|
|
220
|
+
},
|
|
221
|
+
promotionsTab: {
|
|
222
|
+
title: 'Promotions & discounts',
|
|
223
|
+
subtitle:
|
|
224
|
+
'Time-limited price promotions — they override the regular price on the pricing page (SPEC_V2 §9a).',
|
|
225
|
+
add: '+ Create promotion',
|
|
226
|
+
timelineHead: 'Promotion timeline · dashed = today',
|
|
227
|
+
today: 'today',
|
|
228
|
+
emptyBefore: 'No promotions yet. Use',
|
|
229
|
+
emptyAfter: 'to create a time-controlled price promotion.',
|
|
230
|
+
statusActive: 'active',
|
|
231
|
+
statusScheduled: 'scheduled',
|
|
232
|
+
statusExpired: 'expired',
|
|
233
|
+
noPlans: '— no plans —',
|
|
234
|
+
cycleMonthlyShort: 'mth.',
|
|
235
|
+
cycleYearlyShort: 'yr.',
|
|
236
|
+
cycleBothShort: 'mth. & yr.',
|
|
237
|
+
onlyPrefix: 'only',
|
|
238
|
+
chipIntro: '{price} € · {months} mo.',
|
|
239
|
+
chipFreeMonths: '{months} mo. free',
|
|
240
|
+
newPromotionLabel: 'New promotion',
|
|
241
|
+
internalLabelLabel: 'Internal label',
|
|
242
|
+
typePercent: 'Percentage discount',
|
|
243
|
+
typeAmount: 'Fixed amount',
|
|
244
|
+
typeIntro: 'Introductory price',
|
|
245
|
+
typeFreeMonths: 'Free months',
|
|
246
|
+
valueLabel: 'Value',
|
|
247
|
+
percentUnit: '% discount',
|
|
248
|
+
amountUnit: '€ fixed amount',
|
|
249
|
+
introForPrefix: 'for',
|
|
250
|
+
introMonthsUnit: 'months at',
|
|
251
|
+
introPriceUnit: '€/mo',
|
|
252
|
+
freeMonthsPrefix: 'first',
|
|
253
|
+
freeMonthsUnit: 'months free',
|
|
254
|
+
billingCycleLabel: 'Billing cycle',
|
|
255
|
+
priorityLabel: 'Priority',
|
|
256
|
+
appliesToLabel: 'Affected plans',
|
|
257
|
+
localeRestrictionLabel: 'Language restriction',
|
|
258
|
+
allLocales: 'all languages',
|
|
259
|
+
translationsLabel: 'Translations',
|
|
260
|
+
badgePlaceholder: 'Badge text',
|
|
261
|
+
fineprintPlaceholder: 'Fine print (below the CTA)',
|
|
262
|
+
colorLabel: 'Color',
|
|
263
|
+
delete: 'Delete promotion',
|
|
264
|
+
deleteConfirm: 'Really delete promotion "{label}"?',
|
|
265
|
+
},
|
|
266
|
+
errors: {
|
|
267
|
+
projectionsApi: 'MarketingProjections API responded with HTTP {status}',
|
|
268
|
+
},
|
|
269
|
+
},
|
|
270
|
+
);
|