added watermark settings tab on the branding page and added more package details to the billing page, added a new guest notifications page

This commit is contained in:
Codex Agent
2025-12-17 16:39:25 +01:00
parent efe697f155
commit 5f3e7ae8c8
25 changed files with 2062 additions and 202 deletions

View File

@@ -41,6 +41,7 @@ const resources = {
} as const;
const FALLBACK_LOCALE = 'de';
const NAMESPACES = ['common', 'dashboard', 'onboarding', 'management', 'settings', 'auth', 'mobile'] as const;
if (!i18n.isInitialized) {
i18n
@@ -51,7 +52,9 @@ if (!i18n.isInitialized) {
fallbackLng: FALLBACK_LOCALE,
lng: document.documentElement.lang || undefined,
supportedLngs: ['de', 'en'],
ns: NAMESPACES,
defaultNS: DEFAULT_NAMESPACE,
fallbackNS: DEFAULT_NAMESPACE,
interpolation: {
escapeValue: false,
},

View File

@@ -30,6 +30,14 @@
"more": "Weitere Einträge konnten nicht geladen werden."
},
"sections": {
"invoices": {
"title": "Rechnungen & Zahlungen",
"empty": "Keine Zahlungen gefunden."
},
"addOns": {
"title": "Add-ons",
"empty": "Keine Add-ons gebucht."
},
"overview": {
"title": "Paketübersicht",
"description": "Dein aktives Paket und die wichtigsten Kennzahlen.",
@@ -132,6 +140,15 @@
"loadMore": "Weitere Add-ons laden",
"loadingMore": "Add-ons werden geladen…"
},
"features": {
"branding": "Branding",
"watermark": "Wasserzeichen",
"maxPhotos": "Max. Fotos",
"maxGuests": "Max. Gäste",
"galleryDays": "Galerietage",
"maxTasks": "Max. Aufgaben",
"featureList": "Enthaltene Features"
},
"packages": {
"title": "Paket-Historie",
"description": "Übersicht über aktive und vergangene Pakete.",
@@ -282,6 +299,7 @@
"qr": "QR-Code-Layouts",
"images": "Bildverwaltung",
"guests": "Gästeverwaltung",
"guestMessages": "Gästebenachrichtigungen",
"branding": "Branding & Design",
"photobooth": "Photobooth",
"recap": "Recap & Archiv"
@@ -1782,8 +1800,60 @@
},
"errors": {
"missingSlug": "Kein Event-Slug angegeben.",
"loadFailed": "Tasks konnten nicht geladen werden.",
"saveFailed": "Task konnte nicht gespeichert werden."
"missingType": "Event-Typ fehlt. Bitte speichere das Event erneut im Admin.",
"loadFailed": "Event-Daten konnten nicht geladen werden.",
"saveFailed": "Event konnte nicht gespeichert werden."
},
"branding": {
"titleShort": "Branding",
"previewTitle": "Guest-App-Vorschau",
"previewSubtitle": "Aktuelle Farben & Schriften",
"primary": "Primärfarbe",
"accent": "Akzentfarbe",
"colors": "Farben",
"primaryColor": "Primärfarbe",
"accentColor": "Akzentfarbe",
"fonts": "Schriften",
"headingFont": "Überschrift-Schrift",
"bodyFont": "Fließtext-Schrift",
"logo": "Logo",
"replaceLogo": "Logo ersetzen",
"removeLogo": "Entfernen",
"logoHint": "Lade ein Logo hoch, um Einladungen und QR-Poster zu branden.",
"uploadLogo": "Logo hochladen (max. 1 MB)",
"logoTooLarge": "Logo muss unter 1 MB sein.",
"save": "Branding speichern",
"saving": "Speichere...",
"saveSuccess": "Branding gespeichert.",
"reset": "Zurücksetzen",
"fontPicker": "Schrift auswählen",
"noFonts": "Keine Schriftarten gefunden."
},
"watermark": {
"tab": "Wasserzeichen",
"title": "Wasserzeichen",
"previewTitle": "Wasserzeichen-Vorschau",
"mode": "Modus",
"modeBase": "Standard-Wasserzeichen",
"modeCustom": "Eigenes Wasserzeichen",
"modeOff": "Aus",
"upload": "Wasserzeichen hochladen",
"uploadCta": "PNG/SVG/JPG (max. 3 MB)",
"replace": "Wasserzeichen ersetzen",
"uploadHint": "PNG mit Transparenz empfohlen.",
"placement": "Position & Größe",
"size": "Größe",
"opacity": "Transparenz",
"padding": "Abstand",
"offset": "Feinjustierung X",
"offsetX": "X-Achse",
"offsetY": "Y-Achse",
"lockedBranding": "Eigenes Wasserzeichen ist in diesem Paket gesperrt. Standard wird genutzt.",
"lockedDisabled": "Wasserzeichen sind in diesem Paket deaktiviert.",
"errors": {
"noAsset": "Bitte zuerst ein Wasserzeichen hochladen.",
"fileTooLarge": "Wasserzeichen muss kleiner als 3 MB sein."
}
},
"tasks": {
"disabledTitle": "Task-Modus ist für dieses Event aus",
@@ -1932,6 +2002,98 @@
"pref": {}
},
"events": {
"detail": {
"kpi": {
"tasks": "Aktive Aufgaben",
"guests": "Registrierte Gäste",
"photos": "Hochgeladene Bilder"
},
"pickEvent": "Event auswählen",
"active": "Aktiv",
"managementTitle": "Event-Verwaltung",
"dateTbd": "Datum folgt",
"locationPlaceholder": "Ort"
},
"quick": {
"tasks": "Aufgaben & Checklisten",
"qr": "QR-Code-Layouts",
"images": "Bildverwaltung",
"guests": "Gästeverwaltung",
"guestMessages": "Gästebenachrichtigungen",
"branding": "Branding & Design",
"photobooth": "Photobooth",
"recap": "Recap & Archiv"
},
"status": {
"published": "Live",
"draft": "Entwurf",
"archived": "Archiviert"
},
"errors": {
"missingSlug": "Kein Event-Slug angegeben.",
"missingType": "Event-Typ fehlt. Bitte speichere das Event erneut im Admin.",
"loadFailed": "Event-Daten konnten nicht geladen werden.",
"saveFailed": "Event konnte nicht gespeichert werden.",
"notFoundTitle": "Event nicht gefunden",
"notFoundBody": "Ohne gültige Kennung können wir keine Daten laden. Kehre zur Eventliste zurück und wähle dort ein Event aus.",
"toggleFailed": "Status konnte nicht angepasst werden.",
"checkoutMissing": "Checkout konnte nicht gestartet werden.",
"checkoutFailed": "Add-on Checkout fehlgeschlagen."
},
"placeholders": {
"untitled": "Unbenanntes Event"
},
"branding": {
"titleShort": "Branding",
"previewTitle": "Guest-App-Vorschau",
"previewSubtitle": "Aktuelle Farben & Schriften",
"primary": "Primärfarbe",
"accent": "Akzentfarbe",
"colors": "Farben",
"primaryColor": "Primärfarbe",
"accentColor": "Akzentfarbe",
"fonts": "Schriften",
"headingFont": "Überschrift-Schrift",
"bodyFont": "Fließtext-Schrift",
"logo": "Logo",
"replaceLogo": "Logo ersetzen",
"removeLogo": "Entfernen",
"logoHint": "Lade ein Logo hoch, um Einladungen und QR-Poster zu branden.",
"uploadLogo": "Logo hochladen (max. 1 MB)",
"logoTooLarge": "Logo muss unter 1 MB sein.",
"save": "Branding speichern",
"saving": "Speichere...",
"saveSuccess": "Branding gespeichert.",
"reset": "Zurücksetzen",
"fontPicker": "Schrift auswählen",
"noFonts": "Keine Schriftarten gefunden."
},
"watermark": {
"tab": "Wasserzeichen",
"title": "Wasserzeichen",
"previewTitle": "Wasserzeichen-Vorschau",
"mode": "Modus",
"modeBase": "Standard-Wasserzeichen",
"modeCustom": "Eigenes Wasserzeichen",
"modeOff": "Aus",
"upload": "Wasserzeichen hochladen",
"uploadCta": "PNG/SVG/JPG (max. 3 MB)",
"replace": "Wasserzeichen ersetzen",
"uploadHint": "PNG mit Transparenz empfohlen.",
"placement": "Position & Größe",
"size": "Größe",
"opacity": "Transparenz",
"padding": "Abstand",
"offset": "Feinjustierung X",
"offsetX": "X-Achse",
"offsetY": "Y-Achse",
"lockedBranding": "Eigenes Wasserzeichen ist in diesem Paket gesperrt. Standard wird genutzt.",
"lockedDisabled": "Wasserzeichen sind in diesem Paket deaktiviert.",
"errors": {
"noAsset": "Bitte zuerst ein Wasserzeichen hochladen.",
"fileTooLarge": "Wasserzeichen muss kleiner als 3 MB sein."
}
},
"qr": {
"title": "QR-Code & Druck-Layouts",
"heroTitle": "Einlass-QR-Code",
@@ -2043,5 +2205,57 @@
"empty": "Keine Benachrichtigungen vorhanden.",
"filterByEvent": "Nach Event filtern",
"unknownEvent": "Event"
},
"guestMessages": {
"title": "Gästebenachrichtigungen",
"subtitle": "Schicke Push-Hinweise an Teilnehmende",
"composeTitle": "Nachricht senden",
"errorLoad": "Nachrichten konnten nicht geladen werden.",
"errorSend": "Nachricht konnte nicht gesendet werden.",
"sendSuccess": "Benachrichtigung an Gäste gesendet.",
"historyTitle": "Neueste Nachrichten",
"empty": "Noch keine Gästebenachrichtigungen.",
"status": {
"active": "Aktiv",
"draft": "Entwurf",
"archived": "Archiviert"
},
"audience": {
"all": "Alle Gäste",
"guest": "Einzelner Gast"
},
"type": {
"broadcast": "Broadcast",
"support_tip": "Support-Hinweis",
"upload_alert": "Upload-Status",
"achievement_major": "Achievement",
"photo_activity": "Foto-Aktivität",
"feedback_request": "Feedback-Anfrage"
},
"history": {
"untitled": "Ohne Titel",
"noBody": "Kein Nachrichtentext."
},
"form": {
"title": "Titel",
"titlePlaceholder": "Galerie-Erinnerung, Upload-Nudge ...",
"message": "Nachricht",
"messagePlaceholder": "Schreibe eine kurze Notiz an deine Gäste.",
"audience": "Zielgruppe",
"audienceAll": "Alle Gäste",
"audienceGuest": "Einzelner Gast (Name oder Gerät)",
"guestIdentifier": "Gastname oder Geräte-ID",
"guestPlaceholder": "z. B. Alex oder Gerätetoken",
"cta": "CTA (optional)",
"ctaLabel": "Button-Label",
"ctaUrl": "Button-Link",
"ctaHint": "Beide Felder werden benötigt, um einen Button zu senden.",
"ctaError": "CTA-Label und Link müssen zusammen ausgefüllt werden.",
"expiresIn": "Läuft ab in (Minuten)",
"priority": "Priorität",
"priorityValue": "Priorität {{value}}",
"send": "Benachrichtigung senden",
"validation": "Füge Titel, Nachricht und ggf. einen Ziel-Gast hinzu."
}
}
}

View File

@@ -30,6 +30,14 @@
"more": "Unable to load more entries."
},
"sections": {
"invoices": {
"title": "Invoices & payments",
"empty": "No payments found."
},
"addOns": {
"title": "Add-ons",
"empty": "No add-ons booked."
},
"overview": {
"title": "Package overview",
"description": "Your active package and the most important metrics.",
@@ -132,6 +140,15 @@
"loadMore": "Load more add-ons",
"loadingMore": "Loading add-ons…"
},
"features": {
"branding": "Branding",
"watermark": "Watermark",
"maxPhotos": "Max photos",
"maxGuests": "Max guests",
"galleryDays": "Gallery days",
"maxTasks": "Max tasks",
"featureList": "Included features"
},
"packages": {
"title": "Package history",
"description": "Overview of current and past packages.",
@@ -277,6 +294,7 @@
"qr": "QR code layouts",
"images": "Image management",
"guests": "Guest management",
"guestMessages": "Guest messages",
"branding": "Branding & theme",
"photobooth": "Photobooth",
"recap": "Recap & archive"
@@ -1802,8 +1820,60 @@
},
"errors": {
"missingSlug": "No event slug provided.",
"loadFailed": "Tasks could not be loaded.",
"saveFailed": "Task could not be saved."
"missingType": "Event type is missing. Please save the event again in the admin.",
"loadFailed": "Event data could not be loaded.",
"saveFailed": "Event could not be saved."
},
"branding": {
"titleShort": "Branding",
"previewTitle": "Guest app preview",
"previewSubtitle": "Current colors & fonts",
"primary": "Primary",
"accent": "Accent",
"colors": "Colors",
"primaryColor": "Primary color",
"accentColor": "Accent color",
"fonts": "Fonts",
"headingFont": "Headline font",
"bodyFont": "Body font",
"logo": "Logo",
"replaceLogo": "Replace logo",
"removeLogo": "Remove",
"logoHint": "Upload a logo to brand guest invites and QR posters.",
"uploadLogo": "Upload logo (max. 1 MB)",
"logoTooLarge": "Logo must be under 1 MB.",
"save": "Save branding",
"saving": "Saving...",
"saveSuccess": "Branding saved.",
"reset": "Reset to defaults",
"fontPicker": "Select font",
"noFonts": "No fonts found."
},
"watermark": {
"tab": "Watermark",
"title": "Watermark",
"previewTitle": "Watermark Preview",
"mode": "Mode",
"modeBase": "Base watermark",
"modeCustom": "Custom watermark",
"modeOff": "Off",
"upload": "Upload watermark",
"uploadCta": "PNG/SVG/JPG (max. 3 MB)",
"replace": "Replace watermark",
"uploadHint": "PNG with transparency recommended.",
"placement": "Placement & size",
"size": "Size",
"opacity": "Opacity",
"padding": "Padding",
"offset": "Offset X",
"offsetX": "X-axis",
"offsetY": "Y-axis",
"lockedBranding": "Custom watermark locked by this package. Using base watermark.",
"lockedDisabled": "Watermarks are disabled for this package.",
"errors": {
"noAsset": "Please upload a watermark image first.",
"fileTooLarge": "Watermark must be under 3 MB."
}
},
"tasks": {
"disabledTitle": "Task mode is off for this event",
@@ -1952,6 +2022,98 @@
"pref": {}
},
"events": {
"detail": {
"kpi": {
"tasks": "Active tasks",
"guests": "Guests registered",
"photos": "Images uploaded"
},
"pickEvent": "Select event",
"active": "Active",
"managementTitle": "Event management",
"dateTbd": "Date tbd",
"locationPlaceholder": "Location"
},
"quick": {
"tasks": "Tasks & checklists",
"qr": "QR code layouts",
"images": "Image management",
"guests": "Guest management",
"guestMessages": "Guest messages",
"branding": "Branding & theme",
"photobooth": "Photobooth",
"recap": "Recap & archive"
},
"status": {
"published": "Live",
"draft": "Draft",
"archived": "Archived"
},
"errors": {
"missingSlug": "No event slug provided.",
"missingType": "Event type is missing. Please save the event again in the admin.",
"loadFailed": "Event data could not be loaded.",
"saveFailed": "Event could not be saved.",
"notFoundTitle": "Event not found",
"notFoundBody": "Without a valid identifier we cannot load data. Return to the event list and pick an event there.",
"toggleFailed": "Status could not be updated.",
"checkoutMissing": "Checkout could not be started.",
"checkoutFailed": "Add-on checkout failed."
},
"placeholders": {
"untitled": "Untitled event"
},
"branding": {
"titleShort": "Branding",
"previewTitle": "Guest app preview",
"previewSubtitle": "Current colors & fonts",
"primary": "Primary",
"accent": "Accent",
"colors": "Colors",
"primaryColor": "Primary color",
"accentColor": "Accent color",
"fonts": "Fonts",
"headingFont": "Headline font",
"bodyFont": "Body font",
"logo": "Logo",
"replaceLogo": "Replace logo",
"removeLogo": "Remove",
"logoHint": "Upload a logo to brand guest invites and QR posters.",
"uploadLogo": "Upload logo (max. 1 MB)",
"logoTooLarge": "Logo must be under 1 MB.",
"save": "Save branding",
"saving": "Saving...",
"saveSuccess": "Branding saved.",
"reset": "Reset to defaults",
"fontPicker": "Select font",
"noFonts": "No fonts found."
},
"watermark": {
"tab": "Watermark",
"title": "Watermark",
"previewTitle": "Watermark Preview",
"mode": "Mode",
"modeBase": "Base watermark",
"modeCustom": "Custom watermark",
"modeOff": "Off",
"upload": "Upload watermark",
"uploadCta": "PNG/SVG/JPG (max. 3 MB)",
"replace": "Replace watermark",
"uploadHint": "PNG with transparency recommended.",
"placement": "Placement & size",
"size": "Size",
"opacity": "Opacity",
"padding": "Padding",
"offset": "Offset X",
"offsetX": "X-axis",
"offsetY": "Y-axis",
"lockedBranding": "Custom watermark locked by this package. Using base watermark.",
"lockedDisabled": "Watermarks are disabled for this package.",
"errors": {
"noAsset": "Please upload a watermark image first.",
"fileTooLarge": "Watermark must be under 3 MB."
}
},
"qr": {
"title": "QR Code & Print Layouts",
"heroTitle": "Entrance QR Code",
@@ -2063,5 +2225,57 @@
"empty": "No notifications yet.",
"filterByEvent": "Filter by event",
"unknownEvent": "Event"
},
"guestMessages": {
"title": "Guest messages",
"subtitle": "Send push updates to attendees",
"composeTitle": "Send a message",
"errorLoad": "Messages could not be loaded.",
"errorSend": "Message could not be sent.",
"sendSuccess": "Notification sent to guests.",
"historyTitle": "Recent messages",
"empty": "No guest messages yet.",
"status": {
"active": "Active",
"draft": "Draft",
"archived": "Archived"
},
"audience": {
"all": "All guests",
"guest": "Specific guest"
},
"type": {
"broadcast": "Broadcast",
"support_tip": "Support tip",
"upload_alert": "Upload alert",
"achievement_major": "Achievement",
"photo_activity": "Photo activity",
"feedback_request": "Feedback request"
},
"history": {
"untitled": "Untitled",
"noBody": "No body provided."
},
"form": {
"title": "Title",
"titlePlaceholder": "Gallery reminder, upload nudge, ...",
"message": "Message",
"messagePlaceholder": "Write a short note for your guests.",
"audience": "Audience",
"audienceAll": "All guests",
"audienceGuest": "Specific guest (name or device)",
"guestIdentifier": "Guest name or device ID",
"guestPlaceholder": "e.g., Alex or device token",
"cta": "CTA (optional)",
"ctaLabel": "Button label",
"ctaUrl": "Button link",
"ctaHint": "Both fields are required to add a button.",
"ctaError": "CTA label and link are required together.",
"expiresIn": "Expires in (minutes)",
"priority": "Priority",
"priorityValue": "Priority {{value}}",
"send": "Send notification",
"validation": "Add a title, message, and target guest when needed."
}
}
}