fix(ui): echte Umlaute in allen sichtbaren Texten

Menüs, Dialoge, Schaltflächen, Platzhalter, Hinweise und die
Fehlermeldungen der API standen in Ersatzschreibweise (oe/ae/ue). Sie
erscheinen als Toast oder Beschriftung direkt in der Oberfläche und
gehören damit richtig geschrieben; sechs sichtbare Texte mit ss statt ß
sind gleich mit erledigt ("Schließen", "Straße", "zu groß").

Unangetastet bleibt bewusst:

- Kommentare im Quelltext - die sind durchgängig ASCII, und der Diff wäre
  dreimal so groß ohne Nutzen für den Benutzer
- Protokollzeilen (console.*) - die landen im journal, nicht in der App
- Datenbankwerte und interne Kennungen: 'uebernommen', 'empfaenger',
  'vorschlaege', 'laeuft-bereits' stecken in Enums, SQL und
  Zustandsvergleichen. Ein Umlaut darin hätte still falsche Ergebnisse
  geliefert
- server/src/mail/extract.js - die Muster decken absichtlich beide
  Schreibweisen ab: /gr(ü|ue)(ß|ss)e/
- scanner/utils/crypto.js - der Ersatzschlüssel darf sich nicht ändern,
  sonst sind gespeicherte Portal-Passwörter nicht mehr lesbar

Geprüft mit einem Rundgang durch die Ansichten und Dialoge: sichtbarer
Text plus title/aria-label/placeholder enthalten keine
Ersatzschreibweisen mehr.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sascha Wolf
2026-08-11 09:37:24 +02:00
co-authored by Claude Opus 5
parent ea55acdb5c
commit 8b7ce448a6
42 changed files with 168 additions and 168 deletions
+7 -7
View File
@@ -131,7 +131,7 @@ export const LeadModal: React.FC<LeadModalProps> = ({
return;
}
if (form.linkedin && !form.linkedin.includes('linkedin.com/')) {
addToast('Bitte eine gueltige LinkedIn-URL angeben.', 'error');
addToast('Bitte eine gültige LinkedIn-URL angeben.', 'error');
return;
}
@@ -311,7 +311,7 @@ export const LeadModal: React.FC<LeadModalProps> = ({
<h3 className="mb-4 text-[11px] font-extrabold uppercase tracking-[0.18em] text-ink-400">Adresse</h3>
<div className="grid grid-cols-1 gap-4 sm:grid-cols-6">
<div className="sm:col-span-6">
<label className={labelClass}>Strasse und Hausnummer</label>
<label className={labelClass}>Straße und Hausnummer</label>
<input value={form.street} onChange={(e) => set('street', e.target.value)} className={inputClass} />
</div>
<div className="sm:col-span-1">
@@ -345,7 +345,7 @@ export const LeadModal: React.FC<LeadModalProps> = ({
/>
</div>
<div>
<label className={labelClass}>Zustaendig</label>
<label className={labelClass}>Zuständig</label>
<select value={form.owner_id} onChange={(e) => set('owner_id', e.target.value)} className={inputClass}>
<option value="">Niemand</option>
{users.map((user) => (
@@ -399,7 +399,7 @@ export const LeadModal: React.FC<LeadModalProps> = ({
onClick={addTags}
className="shrink-0 rounded-xl border border-ink-200 px-4 text-sm font-bold text-ink-600 transition hover:border-brand-300 hover:text-brand-700"
>
Hinzufuegen
Hinzufügen
</button>
</div>
</div>
@@ -410,7 +410,7 @@ export const LeadModal: React.FC<LeadModalProps> = ({
rows={4}
value={form.notes}
onChange={(e) => set('notes', e.target.value)}
placeholder="Gespraechsnotizen, naechste Schritte, Hintergrund..."
placeholder="Gesprächsnotizen, nächste Schritte, Hintergrund..."
className={`${inputClass} resize-none`}
/>
</div>
@@ -427,7 +427,7 @@ export const LeadModal: React.FC<LeadModalProps> = ({
{!lead ? (
<div className="rounded-xl border border-dashed border-ink-200 px-4 py-6 text-center text-xs font-semibold text-ink-400">
Verbindungen koennen gepflegt werden, sobald der Kontakt gespeichert ist.
Verbindungen können gepflegt werden, sobald der Kontakt gespeichert ist.
</div>
) : (
<div className="space-y-3">
@@ -471,7 +471,7 @@ export const LeadModal: React.FC<LeadModalProps> = ({
onChange={(e) => setNewConnectionId(e.target.value)}
className={`${inputClass} sm:flex-[2]`}
>
<option value="">Kontakt auswaehlen...</option>
<option value="">Kontakt auswählen...</option>
{linkableLeads.map((candidate) => (
<option key={candidate.id} value={candidate.id}>
{leadFullName(candidate)}