@@ -300,7 +300,7 @@ export const WebhooksTab: React.FC = () => {
{wh.name}
{wh.url}
- {Array.isArray(wh.events) ? wh.events.length : 0} subscribed
+ {t('settings.webhooks.eventsSubscribed', { count: Array.isArray(wh.events) ? wh.events.length : 0 })}
{lastEither === 'success' && lastSuccess && (
@@ -325,9 +325,9 @@ export const WebhooksTab: React.FC = () => {
? 'bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300'
: 'bg-neutral-200 dark:bg-neutral-700 text-neutral-600 dark:text-neutral-400'
}`}
- title={wh.active ? 'Click to disable' : 'Click to enable'}
+ title={wh.active ? t('settings.webhooks.toggleToDisable', 'Click to disable') : t('settings.webhooks.toggleToEnable', 'Click to enable')}
>
- {wh.active ? 'Active' : 'Disabled'}
+ {wh.active ? t('settings.webhooks.statusActive', 'Active') : t('settings.webhooks.statusDisabled', 'Disabled')}
@@ -337,19 +337,19 @@ export const WebhooksTab: React.FC = () => {
className="inline-flex items-center gap-1 px-2 py-1 text-xs text-neutral-600 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-neutral-100"
>
- Deliveries
+ {t('settings.webhooks.deliveriesLink', 'Deliveries')}
}
onClick={() => {
- if (confirm(`Delete "${wh.name}"? Pending deliveries are also removed.`)) {
+ if (confirm(t('settings.webhooks.confirmDelete', { name: wh.name, defaultValue: `Delete "${wh.name}"? Pending deliveries are also removed.` }))) {
deleteMutation.mutate(wh.id);
}
}}
>
- Delete
+ {t('settings.webhooks.delete', 'Delete')}
diff --git a/frontend/src/i18n/locales/de.json b/frontend/src/i18n/locales/de.json
index 73b997d7..29f3531a 100644
--- a/frontend/src/i18n/locales/de.json
+++ b/frontend/src/i18n/locales/de.json
@@ -1312,7 +1312,9 @@
"showGalleryFilterBar": "Filterleiste in Galerien anzeigen",
"showGalleryFilterBarHelp": "Dateiname-Suche und Sortiersteuerungen über Raster-Galerien anzeigen. Deaktivieren für ein übersichtlicheres Layout.",
"enablePhoneField": "Telefonnummer-Feld aktivieren",
- "enablePhoneFieldHelp": "Fügt ein optionales Telefonnummer-Eingabefeld zum Veranstaltungsformular hinzu. Nützlich für Folgeautomatisierungen wie WhatsApp-Zustellung via n8n. Immer optional, auch wenn aktiviert."
+ "enablePhoneFieldHelp": "Fügt ein optionales Telefonnummer-Eingabefeld zum Veranstaltungsformular hinzu. Nützlich für Folgeautomatisierungen wie WhatsApp-Zustellung via n8n. Immer optional, auch wenn aktiviert.",
+ "defaultFeedbackEnabled": "Gäste-Feedback standardmäßig aktivieren",
+ "defaultFeedbackEnabledHelp": "Vorbelegt \"Gäste-Feedback\" beim Erstellen neuer Events. Einzelne Feedback-Optionen (Likes, Bewertungen, Kommentare) bleiben pro Event anpassbar."
},
"imageSecurity": {
"title": "Bildschutz",
@@ -1562,7 +1564,8 @@
"statusActive": "Aktiv",
"confirmRevoke": "Diesen Token wirklich widerrufen?",
"revoke": "Widerrufen",
- "empty": "Noch keine Tokens. Generieren Sie oben einen, um zu beginnen."
+ "empty": "Noch keine Tokens. Generieren Sie oben einen, um zu beginnen.",
+ "preview": "Vorschau"
},
"webhooks": {
"title": "Webhooks",
@@ -1576,7 +1579,38 @@
"template": "Vorlage (optional)",
"create": "Webhook erstellen",
"existing": "Vorhandene Webhooks",
- "empty": "Noch keine Webhooks. Erstellen Sie oben einen, um Ereignisbenachrichtigungen zu erhalten."
+ "empty": "Noch keine Webhooks. Erstellen Sie oben einen, um Ereignisbenachrichtigungen zu erhalten.",
+ "namePlaceholder": "z. B. n8n WhatsApp",
+ "urlPlaceholder": "https://n8n.example.com/webhook/picpeak",
+ "showAdvanced": "+ Erweitert (Filter, Vorlage)",
+ "hideAdvanced": "− Erweitert ausblenden (Filter, Vorlage)",
+ "filterHelp": "Dot-Pfad → erwarteter Wert. Alle Schlüssel müssen übereinstimmen (AND). Array für \"eines aus\".",
+ "filterError": "Filter muss gültiges JSON sein",
+ "templatePlaceholder": "Neue Galerie: ${data.event.event_name} → ${data.event.share_url}",
+ "templateHelp": "Ersetzt den Standard-JSON-Umschlag als Request-Body. Nur ${dot.path}-Substitution aus der Payload — keine Logik, keine Ausdrücke.",
+ "copyButton": "Kopieren",
+ "dismiss": "Schließen",
+ "copied": "Kopiert",
+ "copyFailed": "Kopieren fehlgeschlagen",
+ "colName": "Name",
+ "colUrl": "URL",
+ "colEvents": "Events",
+ "colLastDelivery": "Letzte Zustellung",
+ "colStatus": "Status",
+ "colActions": "Aktionen",
+ "eventsSubscribed_one": "{{count}} abonniert",
+ "eventsSubscribed_other": "{{count}} abonniert",
+ "statusActive": "Aktiv",
+ "statusDisabled": "Deaktiviert",
+ "toggleToDisable": "Klicken zum Deaktivieren",
+ "toggleToEnable": "Klicken zum Aktivieren",
+ "deliveriesLink": "Zustellungen",
+ "delete": "Löschen",
+ "confirmDelete": "\"{{name}}\" löschen? Ausstehende Zustellungen werden ebenfalls entfernt.",
+ "createError": "Webhook konnte nicht erstellt werden",
+ "updateError": "Webhook konnte nicht aktualisiert werden",
+ "deletedToast": "Webhook gelöscht",
+ "deleteError": "Webhook konnte nicht gelöscht werden"
},
"sectionLabel": "Einstellungsbereich",
"navAriaLabel": "Einstellungsnavigation",
diff --git a/frontend/src/i18n/locales/en.json b/frontend/src/i18n/locales/en.json
index 5be78430..093c9d6e 100644
--- a/frontend/src/i18n/locales/en.json
+++ b/frontend/src/i18n/locales/en.json
@@ -933,7 +933,9 @@
"showGalleryFilterBar": "Show filter bar in galleries",
"showGalleryFilterBarHelp": "Display the search-by-filename and sort controls above grid-layout galleries. Disable for a cleaner layout.",
"enablePhoneField": "Enable phone number field",
- "enablePhoneFieldHelp": "Adds an optional phone number input to the event form. Useful for downstream automations like WhatsApp delivery via n8n. Always optional even when enabled."
+ "enablePhoneFieldHelp": "Adds an optional phone number input to the event form. Useful for downstream automations like WhatsApp delivery via n8n. Always optional even when enabled.",
+ "defaultFeedbackEnabled": "Enable Guest Feedback by default",
+ "defaultFeedbackEnabledHelp": "Pre-check \"Guest Feedback\" when creating new events. Individual feedback options (likes, ratings, comments) can still be customised per event."
},
"imageSecurity": {
"title": "Image Protection",
@@ -1120,7 +1122,8 @@
"statusActive": "Active",
"confirmRevoke": "Do you want to revoke this token? This action cannot be undone.",
"revoke": "Revoke",
- "empty": "No tokens yet. Generate one above to get started."
+ "empty": "No tokens yet. Generate one above to get started.",
+ "preview": "Preview"
},
"webhooks": {
"title": "Webhooks",
@@ -1134,7 +1137,38 @@
"template": "Template (optional)",
"create": "Create Webhook",
"existing": "Existing webhooks",
- "empty": "No webhooks yet. Create one above to start receiving event notifications."
+ "empty": "No webhooks yet. Create one above to start receiving event notifications.",
+ "namePlaceholder": "e.g. n8n WhatsApp",
+ "urlPlaceholder": "https://n8n.example.com/webhook/picpeak",
+ "showAdvanced": "+ Advanced (filter, template)",
+ "hideAdvanced": "− Hide advanced (filter, template)",
+ "filterHelp": "Dot-path → expected value. All keys must match (AND). Use an array for \"any of\".",
+ "filterError": "Filter must be valid JSON",
+ "templatePlaceholder": "New gallery: ${data.event.event_name} → ${data.event.share_url}",
+ "templateHelp": "Replaces the default JSON envelope as the request body. ${dot.path} substitution from the payload only — no logic, no expressions.",
+ "copyButton": "Copy",
+ "dismiss": "Dismiss",
+ "copied": "Copied",
+ "copyFailed": "Copy failed",
+ "colName": "Name",
+ "colUrl": "URL",
+ "colEvents": "Events",
+ "colLastDelivery": "Last delivery",
+ "colStatus": "Status",
+ "colActions": "Actions",
+ "eventsSubscribed_one": "{{count}} subscribed",
+ "eventsSubscribed_other": "{{count}} subscribed",
+ "statusActive": "Active",
+ "statusDisabled": "Disabled",
+ "toggleToDisable": "Click to disable",
+ "toggleToEnable": "Click to enable",
+ "deliveriesLink": "Deliveries",
+ "delete": "Delete",
+ "confirmDelete": "Delete \"{{name}}\"? Pending deliveries are also removed.",
+ "createError": "Failed to create webhook",
+ "updateError": "Failed to update webhook",
+ "deletedToast": "Webhook deleted",
+ "deleteError": "Failed to delete webhook"
},
"sectionLabel": "Settings section",
"navAriaLabel": "Settings navigation",