diff --git a/apps/mana/apps/web/src/lib/modules/broadcast/views/ComposeView.svelte b/apps/mana/apps/web/src/lib/modules/broadcast/views/ComposeView.svelte index 809e2d7bf..e4482d31c 100644 --- a/apps/mana/apps/web/src/lib/modules/broadcast/views/ComposeView.svelte +++ b/apps/mana/apps/web/src/lib/modules/broadcast/views/ComposeView.svelte @@ -19,6 +19,7 @@ import { sendCampaign } from '../api'; import { useAllContacts } from '$lib/modules/contacts/queries'; import type { Campaign, CampaignContent, AudienceDefinition, BroadcastSettings } from '../types'; + import { _ } from 'svelte-i18n'; interface Props { existing?: Campaign; @@ -34,7 +35,9 @@ let step = $state(1); // ─── Form state (captured once at mount) ─────────────────── - let name = $state(initial?.name ?? 'Neue Kampagne'); + let name = $state( + initial?.name ?? untrack(() => $_('broadcast.compose_view.default_name')) + ); let subject = $state(initial?.subject ?? ''); let preheader = $state(initial?.preheader ?? ''); let fromName = $state(initial?.fromName ?? ''); @@ -77,7 +80,7 @@ await broadcastCampaignsStore.updateContent(existing.id, content); savedAt = new Date().toLocaleTimeString(); } catch (e) { - error = e instanceof Error ? e.message : 'Speichern fehlgeschlagen'; + error = e instanceof Error ? e.message : $_('broadcast.compose_view.error_save_failed'); } finally { saving = false; } @@ -149,7 +152,7 @@ }; sendState = 'done'; } catch (e) { - error = e instanceof Error ? e.message : 'Versand fehlgeschlagen'; + error = e instanceof Error ? e.message : $_('broadcast.compose_view.error_send_failed'); sendState = 'idle'; } } @@ -160,17 +163,23 @@
{#if savedAt} - Gespeichert um {savedAt} + {$_('broadcast.compose_view.saved_at', { values: { time: savedAt } })} {/if} - +
@@ -184,7 +193,7 @@ onclick={() => goToStep(1)} > 1 - Empfänger + {$_('broadcast.compose_view.step_recipients')} @@ -230,55 +239,64 @@
- +
- +
{:else if step === 3}
-

Vor dem Versand

+

{$_('broadcast.compose_view.preflight_heading')}

  • 0} class:warn={!subject.trim()}> {subject.trim() ? '✓' : '!'} - Betreff {subject.trim() ? 'gesetzt' : 'fehlt'} + {$_('broadcast.compose_view.check_subject_line', { + values: { + state: subject.trim() + ? $_('broadcast.compose_view.check_subject_set') + : $_('broadcast.compose_view.check_subject_missing'), + }, + })} {#if subject.trim().length > 0} — {subject} {/if}
  • 0} class:warn={audience.estimatedCount === 0}> {audience.estimatedCount > 0 ? '✓' : '!'} - {audience.estimatedCount} Empfänger + {$_('broadcast.compose_view.check_recipients_line', { + values: { n: audience.estimatedCount }, + })} {#if audience.estimatedCount === 0} - — kein Empfänger matched die Filter + {$_('broadcast.compose_view.check_recipients_no_match')} {/if}
  • {fromEmail.includes('@') ? '✓' : '!'} - Absender + {$_('broadcast.compose_view.check_sender_label')} — {fromName} <{fromEmail || '—'}>
  • {settings?.legalAddress?.trim() ? '✓' : '!'} - Impressum + {$_('broadcast.compose_view.check_legal_label')} {#if !settings?.legalAddress?.trim()} — Pflicht laut DSGVO. - In Einstellungen ergänzen → + >{$_('broadcast.compose_view.check_legal_missing')} + {$_('broadcast.compose_view.check_legal_link')} {/if}
  • @@ -300,26 +318,25 @@ {#if settings} {:else} -

    Lade Einstellungen …

    +

    {$_('broadcast.compose_view.loading_settings')}

    {/if}
{:else if step === 4}
{#if sendState === 'idle'}
-

Jetzt senden

+

{$_('broadcast.compose_view.send_idle_heading')}

- {audience.estimatedCount} Empfänger erhalten die Kampagne - „{subject}" - von {fromName}. + {@html $_('broadcast.compose_view.send_idle_message_html', { + values: { n: audience.estimatedCount, subject, from: fromName }, + })}

- Der Versand läuft synchron und dauert je nach Liste 10–60 Sekunden. Du siehst jede Mail - in deinem „Gesendet"-Ordner (pro Empfänger ein Eintrag). + {$_('broadcast.compose_view.send_idle_hint')}

{:else if sendState === 'confirming'}
-

Sicher?

+

{$_('broadcast.compose_view.confirm_heading')}

- Die Kampagne geht an {audience.estimatedCount} Empfänger. Nach dem Versand - kannst du nichts mehr ändern — wenn dir ein Fehler auffällt, musst du eine neue Kampagne als - Korrektur schicken. + {@html $_('broadcast.compose_view.confirm_message_html', { + values: { n: audience.estimatedCount }, + })}

{:else if sendState === 'sending'}
-

Versand läuft …

+

{$_('broadcast.compose_view.sending_heading')}

- Wir schicken {audience.estimatedCount} Mails raus. Bitte Fenster offen lassen. + {$_('broadcast.compose_view.sending_message', { + values: { n: audience.estimatedCount }, + })}

{:else if sendState === 'done' && sendResult}
-

Versand abgeschlossen

+

{$_('broadcast.compose_view.done_heading')}

- {sendResult.delivered} Mails versendet + {@html $_('broadcast.compose_view.done_delivered_html', { + values: { n: sendResult.delivered }, + })} {#if sendResult.failed > 0} - · {sendResult.failed} Fehler + · {@html $_('broadcast.compose_view.done_failed_html', { + values: { n: sendResult.failed }, + })} {/if}

{#if sendResult.errors.length > 0}
- Fehler anzeigen ({sendResult.errors.length}) + {$_('broadcast.compose_view.done_error_summary', { + values: { n: sendResult.errors.length }, + })}
    {#each sendResult.errors as err (err.email)}
  • {err.email} — {err.reason}
  • @@ -378,7 +409,7 @@ {/if}
diff --git a/scripts/i18n-hardcoded-baseline.json b/scripts/i18n-hardcoded-baseline.json index 38abe617b..b921305e7 100644 --- a/scripts/i18n-hardcoded-baseline.json +++ b/scripts/i18n-hardcoded-baseline.json @@ -69,7 +69,6 @@ "apps/mana/apps/web/src/lib/modules/broadcast/components/SettingsForm.svelte": 3, "apps/mana/apps/web/src/lib/modules/broadcast/editor/Editor.svelte": 3, "apps/mana/apps/web/src/lib/modules/broadcast/ListView.svelte": 8, - "apps/mana/apps/web/src/lib/modules/broadcast/views/ComposeView.svelte": 11, "apps/mana/apps/web/src/lib/modules/broadcast/views/DetailView.svelte": 9, "apps/mana/apps/web/src/lib/modules/broadcast/widgets/BroadcastsWidget.svelte": 3, "apps/mana/apps/web/src/lib/modules/calc/ListView.svelte": 1,