fix(messages): PR #769 nits — server-side search, bare-email recipient, DE i18n

- Search now hits the backend (debounced) so results aren't truncated to the
  first loaded page: /received gains a `q` filter (sender/subject); the frontend
  passes the debounced term to every list query. The instant client-side filter
  stays for responsiveness.
- Reply/compose recipient extracts the bare address from a "Name <addr>" From
  header (extractEmail) — also used for the customer-lookup key.
- Added the full de + en `messages.*` and `email.customerMailbox.*` translation
  namespaces (were English inline-fallbacks only). Swiss-German spelling.
This commit is contained in:
Luca
2026-07-07 18:39:04 +02:00
parent bb235e72e5
commit 1e08a4fb15
5 changed files with 237 additions and 15 deletions
+101
View File
@@ -3136,6 +3136,24 @@
"backup": "Backup & Wiederherstellung",
"system": "System-Updates",
"other": "Sonstige"
},
"customerMailbox": {
"title": "Kunden-Postfach (hello@)",
"subtitle": "Ein zweites Eingangspostfach für Kundenkommunikation. Die E-Mails erscheinen unter Nachrichten → Kunden; Anhänge werden nicht an die Buchhaltung weitergeleitet.",
"enabled": "Dieses Postfach jede Minute abrufen",
"outgoing": "Ausgang (SMTP)",
"outgoingHint": "Antworten aus diesem Postfach werden von hier gesendet. Leer lassen, um die globale Absenderadresse zu verwenden.",
"fromEmail": "Absenderadresse",
"smtpHost": "SMTP-Host",
"smtpUser": "SMTP-Benutzername",
"smtpPass": "SMTP-Passwort",
"smtpSsl": "SSL (465)",
"smtpStarttls": "STARTTLS (587)",
"save": "Kunden-Postfach speichern",
"savedToast": "Kunden-Postfach gespeichert.",
"requiredFields": "Host, Port und Benutzername sind erforderlich.",
"testOk": "Verbunden mit {{folder}} — {{messages}} Nachrichten, {{unseen}} ungelesen.",
"testFailed": "Verbindung fehlgeschlagen."
}
},
"cms": {
@@ -5534,5 +5552,88 @@
"titlePlaceholder": "z. B. Hochzeitsvertrag Doe / Müller",
"validUntil": "Unterzeichnen bis (optional)"
}
},
"messages": {
"title": "Nachrichten",
"subtitle": "Gesendete, automatische und eingehende E-Mails — an einem Ort.",
"sync": "Abrufen",
"newMessage": "Neue Nachricht",
"searchPlaceholder": "In diesem Ordner suchen…",
"account": {
"all": "Alle E-Mails",
"customers": "Kunden",
"accounting": "Buchhaltung",
"automated": "Automatisch"
},
"folder": {
"inbox": "Posteingang",
"sent": "Gesendet",
"archived": "Archiviert",
"deleted": "Gelöscht"
},
"unified": "Konten übergreifend",
"systemGenerated": "Systemgeneriert",
"acrossAccounts": "Über alle Konten",
"selectPrompt": "Nachricht zum Lesen auswählen",
"noMessages": "Keine Nachrichten",
"noSearchResults": "Keine Treffer",
"noSubject": "(kein Betreff)",
"from": "von",
"to": "An",
"reply": "Antworten",
"replyAll": "Allen antworten",
"forward": "Weiterleiten",
"archive": "Archivieren",
"delete": "Löschen",
"deleteForever": "Endgültig löschen",
"restore": "Wiederherstellen",
"bookExpense": "Als Ausgabe buchen",
"rebill": "An Kunden weiterverrechnen",
"createQuote": "Angebot",
"createContract": "Vertrag",
"createGallery": "Galerie",
"createInvoice": "Rechnung",
"doc": {
"quote": "Angebot",
"contract": "Vertrag",
"invoice": "Rechnung",
"gallery": "Galerie"
},
"soon": "In einer späteren Phase verfügbar",
"viewDocument": "Dokument ansehen",
"openInAccounting": "Im Buchhaltungs-Posteingang öffnen",
"noInboundBody": "Für diese E-Mail wurde kein Nachrichtentext erfasst.",
"noBody": "Diese Nachricht wurde gesendet, bevor die Textspeicherung eingeführt wurde — keine Vorschau verfügbar.",
"loadError": "Diese Nachricht konnte nicht geladen werden.",
"attachments": "Anhang/Anhänge",
"notArchived": "noch nicht archiviert",
"sentAttachHint": "Gesendete Anhänge werden noch nicht archiviert — Phase 2.",
"document": "Dokument",
"previewUnavailable": "Vorschau nicht verfügbar",
"rasterNote": "Serverseitig gerenderte Vorschau — die Originaldatei erreicht den Browser nie.",
"close": "Schliessen",
"compose": "Nachricht verfassen",
"cancel": "Abbrechen",
"send": "Senden",
"subject": "Betreff",
"optional": "optional",
"bodyHint": "Bearbeite die Nachricht frei — füge vor dem Senden an beliebiger Stelle eine Notiz ein.",
"sendsFromHint": "Wird von deiner konfigurierten Absenderadresse gesendet.",
"sentToast": "Nachricht gesendet.",
"sendFailed": "Nachricht konnte nicht gesendet werden.",
"onWrote": "Am",
"customer": "Kunde",
"resolvingCustomer": "Absender wird einem Kunden zugeordnet…",
"noCustomerMatch": "Kein Kunde zu diesem Absender gefunden — oben suchen oder neuen Kunden anlegen.",
"createNewDoc": "Neues {{label}} erstellen",
"existingDocs": "Oder ein bestehendes referenzieren",
"noExistingDocs": "Für diesen Kunden gibt es noch keine Dokumente.",
"galleryCreateOnly": "Galerien sind event-basiert — dies öffnet den Event-Editor, wo du den Kunden zuweisen kannst.",
"syncOk": "Postfächer geprüft — {{count}} neu.",
"syncDisabled": "Eingehende E-Mails sind deaktiviert — unter Einstellungen → Funktionen aktivieren.",
"syncUnconfigured": "Zuerst ein Postfach unter Einstellungen → E-Mail konfigurieren.",
"syncBusy": "Es läuft bereits eine Synchronisierung.",
"syncFailed": "Synchronisierung fehlgeschlagen.",
"actionFailed": "Aktion fehlgeschlagen."
}
}
+101
View File
@@ -2698,6 +2698,24 @@
"backup": "Backup & restore",
"system": "System updates",
"other": "Other"
},
"customerMailbox": {
"title": "Customer mailbox (hello@)",
"subtitle": "A second inbound mailbox for customer conversations. Its mail appears under Messages → Customers; attachments are not routed to Accounting.",
"enabled": "Poll this mailbox every minute",
"outgoing": "Outgoing (SMTP)",
"outgoingHint": "Replies from this mailbox send from here. Leave blank to fall back to the global outgoing address.",
"fromEmail": "From address",
"smtpHost": "SMTP Host",
"smtpUser": "SMTP Username",
"smtpPass": "SMTP Password",
"smtpSsl": "SSL (465)",
"smtpStarttls": "STARTTLS (587)",
"save": "Save Customer Mailbox",
"savedToast": "Customer mailbox saved.",
"requiredFields": "Host, port and username are required.",
"testOk": "Connected to {{folder}} — {{messages}} messages, {{unseen}} unread.",
"testFailed": "Connection failed."
}
},
"cms": {
@@ -5532,5 +5550,88 @@
"titlePlaceholder": "e.g. Wedding contract Doe / Müller",
"validUntil": "Sign by (optional)"
}
},
"messages": {
"title": "Messages",
"subtitle": "Sent, automated and incoming mail — one place.",
"sync": "Sync",
"newMessage": "New message",
"searchPlaceholder": "Search this folder…",
"account": {
"all": "All mail",
"customers": "Customers",
"accounting": "Accounting",
"automated": "Automated"
},
"folder": {
"inbox": "Inbox",
"sent": "Sent",
"archived": "Archived",
"deleted": "Deleted"
},
"unified": "Unified across accounts",
"systemGenerated": "System-generated",
"acrossAccounts": "Across all accounts",
"selectPrompt": "Select a message to read",
"noMessages": "No messages",
"noSearchResults": "No matches",
"noSubject": "(no subject)",
"from": "from",
"to": "To",
"reply": "Reply",
"replyAll": "Reply all",
"forward": "Forward",
"archive": "Archive",
"delete": "Delete",
"deleteForever": "Delete permanently",
"restore": "Restore",
"bookExpense": "Book as expense",
"rebill": "Re-bill to client",
"createQuote": "Quote",
"createContract": "Contract",
"createGallery": "Gallery",
"createInvoice": "Invoice",
"doc": {
"quote": "Quote",
"contract": "Contract",
"invoice": "Invoice",
"gallery": "Gallery"
},
"soon": "Available in a later phase",
"viewDocument": "View document",
"openInAccounting": "Open in Accounting inbox",
"noInboundBody": "No message body was captured for this email.",
"noBody": "This message was sent before body capture was added, so no preview is available.",
"loadError": "Could not load this message.",
"attachments": "attachment(s)",
"notArchived": "not archived yet",
"sentAttachHint": "Sent attachments are not archived yet — Phase 2.",
"document": "Document",
"previewUnavailable": "Preview unavailable",
"rasterNote": "Server-rendered preview — the raw file never reaches the browser.",
"close": "Close",
"compose": "Compose message",
"cancel": "Cancel",
"send": "Send",
"subject": "Subject",
"optional": "optional",
"bodyHint": "Edit the message freely — add a note anywhere before sending.",
"sendsFromHint": "Sends from your configured outgoing address.",
"sentToast": "Message sent.",
"sendFailed": "Failed to send message.",
"onWrote": "On",
"customer": "Customer",
"resolvingCustomer": "Matching the sender to a customer…",
"noCustomerMatch": "No customer matched this sender — search for one or create a new customer above.",
"createNewDoc": "Create new {{label}}",
"existingDocs": "Or reference an existing one",
"noExistingDocs": "No existing documents for this customer yet.",
"galleryCreateOnly": "Galleries are event-based — this opens the event editor, where you can assign the customer.",
"syncOk": "Checked mailboxes — {{count}} new.",
"syncDisabled": "Incoming mail is off — enable it under Settings → Features.",
"syncUnconfigured": "Configure a mailbox under Settings → Email first.",
"syncBusy": "A sync is already running.",
"syncFailed": "Sync failed.",
"actionFailed": "Action failed."
}
}