feat: implement AI styling foundation and billing scope rework
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled

This commit is contained in:
Codex Agent
2026-02-06 20:01:58 +01:00
parent df00deb0df
commit 36bed12ff9
80 changed files with 8944 additions and 49 deletions

View File

@@ -85,15 +85,28 @@
"lemonsqueezy_voided": "Die PayPal-Zahlung wurde storniert."
},
"sections": {
"currentEvent": {
"title": "Aktuelles Event",
"hint": "Hier siehst du, was für dein aktuell ausgewähltes Event aktiv ist.",
"empty": "Wähle ein Event aus, um eventbezogene Pakete und Add-ons zu sehen.",
"eventLabel": "Ausgewähltes Event",
"packageActive": "Für dieses Event aktiv",
"packageExpires": "Galerie aktiv bis {{date}}",
"noPackage": "Für dieses Event ist derzeit kein Paket zugewiesen.",
"addonsLabel": "Add-ons für dieses Event",
"noAddons": "Für dieses Event wurden noch keine Add-ons gekauft.",
"eventAddonSource": "Quelle: Event-Paket"
},
"invoices": {
"title": "Rechnungen & Zahlungen",
"hint": "Zahlungen prüfen und Belege herunterladen.",
"empty": "Keine Zahlungen gefunden."
},
"addOns": {
"title": "Zusatzpakete",
"hint": "Zusatzkontingente je Event im Blick behalten.",
"empty": "Keine Zusatzpakete gebucht."
"title": "Add-on-Kaufverlauf",
"hint": "Verlauf aller Add-on-Käufe über alle Events. Ein Eintrag hier ist nicht automatisch für das aktuell ausgewählte Event aktiv.",
"empty": "Keine Add-ons gebucht.",
"otherEventNotice": "Für ein anderes Event gekauft"
},
"overview": {
"title": "Paketübersicht",
@@ -125,12 +138,13 @@
}
},
"packages": {
"title": "Pakete",
"hint": "Aktives Paket, Limits und Historie auf einen Blick.",
"title": "Paketverlauf (alle Events)",
"hint": "Alle gekauften Pakete über alle Events hinweg.",
"description": "Übersicht über aktive und vergangene Pakete.",
"empty": "Noch keine Pakete gebucht.",
"card": {
"statusActive": "Aktiv",
"statusActiveTenant": "Derzeit aktiv",
"statusInactive": "Inaktiv",
"used": "Genutzte Events",
"available": "Verfügbar",
@@ -2392,6 +2406,7 @@
"photo_likes_enabled": "Foto-Likes",
"event_checklist": "Event-Checkliste",
"advanced_analytics": "Erweiterte Statistiken",
"ai_styling": "AI-Styling",
"branding_allowed": "Branding",
"watermark_allowed": "Wasserzeichen",
"watermark_base": "Fotospiel-Wasserzeichen",
@@ -2586,7 +2601,47 @@
"saveFailed": "Automatik-Einstellungen konnten nicht gespeichert werden."
},
"emptyModeration": "Keine Uploads passen zu diesem Filter.",
"emptyLive": "Keine Fotos für die Live-Show in der Warteschlange."
"emptyLive": "Keine Fotos für die Live-Show in der Warteschlange.",
"aiAddon": {
"title": "AI Magic Edits",
"body": "AI-Styling bleibt verborgen, bis dieses Event berechtigt ist. Schalte es per Add-on frei oder nutze Premium.",
"buyAction": "AI-Styling-Add-on kaufen",
"upgradeAction": "Premium-Paket ansehen"
},
"aiSettings": {
"title": "AI-Styling-Steuerung",
"subtitle": "Aktiviere AI-Edits pro Event, steuere erlaubte Presets und überwache Nutzung/Fehler.",
"loadFailed": "AI-Einstellungen konnten nicht geladen werden.",
"saveFailed": "AI-Einstellungen konnten nicht gespeichert werden.",
"saved": "AI-Einstellungen gespeichert.",
"enabled": {
"label": "AI-Edits für dieses Event aktivieren",
"hint": "Wenn deaktiviert, werden Guest- und Admin-AI-Anfragen für dieses Event blockiert."
},
"customPrompt": {
"label": "Freie Prompts erlauben",
"hint": "Wenn deaktiviert, müssen Nutzer ein erlaubtes Preset wählen."
},
"policyMessage": {
"label": "Policy-Hinweis",
"hint": "Wird Nutzern angezeigt, wenn AI-Edits deaktiviert sind oder ein Stil blockiert ist.",
"placeholder": "Optionaler Hinweis für Gäste/Admins"
},
"styles": {
"label": "Erlaubte AI-Stile",
"hint": "Keine Auswahl bedeutet: alle aktiven Stile sind erlaubt.",
"empty": "Keine aktiven AI-Stile gefunden.",
"clear": "Alle Stile erlauben"
},
"usage": {
"title": "Nutzungsübersicht",
"total": "Gesamt",
"succeeded": "Erfolgreich",
"failed": "Fehlgeschlagen",
"lastRequest": "Letzte Anfrage: {{date}}"
},
"save": "AI-Einstellungen speichern"
}
},
"liveShowSettings": {
"title": "Live-Show-Einstellungen",
@@ -3001,6 +3056,7 @@
},
"features": {
"advanced_analytics": "Erweiterte Statistiken",
"ai_styling": "AI-Styling",
"basic_uploads": "Basis-Uploads",
"custom_branding": "Eigenes Branding",
"custom_tasks": "Benutzerdefinierte Fotoaufgaben",

View File

@@ -85,15 +85,28 @@
"lemonsqueezy_voided": "The PayPal payment was voided."
},
"sections": {
"currentEvent": {
"title": "Current event",
"hint": "This section shows what is active for your currently selected event.",
"empty": "Select an event to view event-specific packages and add-ons.",
"eventLabel": "Selected event",
"packageActive": "Active for this event",
"packageExpires": "Gallery active until {{date}}",
"noPackage": "No package is currently assigned to this event.",
"addonsLabel": "Add-ons for this event",
"noAddons": "No add-ons purchased for this event.",
"eventAddonSource": "Source: event package"
},
"invoices": {
"title": "Invoices & payments",
"hint": "Review transactions and download receipts.",
"empty": "No payments found."
},
"addOns": {
"title": "Add-ons",
"hint": "Track extra photo, guest, or time bundles per event.",
"empty": "No add-ons booked."
"title": "Add-on purchase history",
"hint": "History of all add-on purchases across all events. An entry here is not automatically active for the currently selected event.",
"empty": "No add-ons booked.",
"otherEventNotice": "Purchased for another event"
},
"overview": {
"title": "Package overview",
@@ -125,12 +138,13 @@
}
},
"packages": {
"title": "Packages",
"hint": "Active package, limits, and history at a glance.",
"title": "Package history (all events)",
"hint": "All purchased packages across all events.",
"description": "Overview of active and past packages.",
"empty": "No packages purchased yet.",
"card": {
"statusActive": "Active",
"statusActiveTenant": "Currently active",
"statusInactive": "Inactive",
"used": "Events used",
"available": "Remaining",
@@ -2394,6 +2408,7 @@
"photo_likes_enabled": "Photo likes",
"event_checklist": "Event checklist",
"advanced_analytics": "Advanced analytics",
"ai_styling": "AI styling",
"branding_allowed": "Branding",
"watermark_allowed": "Watermarks",
"watermark_base": "Fotospiel watermark",
@@ -2588,7 +2603,47 @@
"saveFailed": "Automation settings could not be saved."
},
"emptyModeration": "No uploads match this filter.",
"emptyLive": "No photos waiting for Live Show."
"emptyLive": "No photos waiting for Live Show.",
"aiAddon": {
"title": "AI Magic Edits",
"body": "AI styling is hidden until this event is entitled. Unlock it via add-on or include it with Premium.",
"buyAction": "Buy AI styling add-on",
"upgradeAction": "View Premium package"
},
"aiSettings": {
"title": "AI Styling Controls",
"subtitle": "Enable AI edits per event, configure allowed presets, and monitor usage/failures.",
"loadFailed": "AI settings could not be loaded.",
"saveFailed": "AI settings could not be saved.",
"saved": "AI settings saved.",
"enabled": {
"label": "Enable AI edits for this event",
"hint": "When disabled, guest and admin AI requests are blocked for this event."
},
"customPrompt": {
"label": "Allow custom prompts",
"hint": "If disabled, users must choose one of the allowed presets."
},
"policyMessage": {
"label": "Policy message",
"hint": "Shown to users when AI edits are disabled or a style is blocked.",
"placeholder": "Optional message for guests/admins"
},
"styles": {
"label": "Allowed AI styles",
"hint": "No selection means all active styles are allowed.",
"empty": "No active AI styles found.",
"clear": "Allow all styles"
},
"usage": {
"title": "Usage overview",
"total": "Total",
"succeeded": "Succeeded",
"failed": "Failed",
"lastRequest": "Last request: {{date}}"
},
"save": "Save AI settings"
}
},
"liveShowSettings": {
"title": "Live Show settings",
@@ -3003,6 +3058,7 @@
},
"features": {
"advanced_analytics": "Advanced Analytics",
"ai_styling": "AI Styling",
"basic_uploads": "Basic uploads",
"custom_branding": "Custom Branding",
"custom_tasks": "Custom photo tasks",