/** * umlaut-dictionary — single source of truth for the ae/oe/ue/ss umlaut * correction in `de.json` and for the `umlaut-guard.spec.ts` regression * guard. * * Why an explicit token list instead of a character rule (`ue` -> `ü`, * `oe` -> `ö`, `ae` -> `ä`): a blanket character substitution destroys * correct German. `Quelle` would become `Qülle`, `manuell` would become * `manüll`, `neuen` would become `nün`, `Erzeugnisse` would become * `Erzügnisse`. Replacement therefore only ever targets a whole token * that is an exact key in `UMLAUT_REPLACEMENTS`. * * `UMLAUT_ALLOWLIST` lists every token that legitimately contains * `ae`/`oe`/`ue`/`ss` and is already correct German — it must never be * replaced. `empfaenger` sits on this list purely because it is part of * the example placeholder address `empfaenger@example.com` * (key `testToPlaceholder`): an umlaut inside a placeholder email address * would wrongly suggest umlaut addresses are the expected format, so that * value is skipped entirely (any string containing `@`) rather than * "corrected". */ /** Wrong substitute spelling -> correct German spelling, exact token match only. */ export const UMLAUT_REPLACEMENTS: Record = { loeschen: 'löschen', Loeschen: 'Löschen', geloescht: 'gelöscht', hinzufuegen: 'hinzufügen', Hinzufuegen: 'Hinzufügen', hinzuzufuegen: 'hinzuzufügen', einfuegen: 'einfügen', fuege: 'füge', Fuege: 'Füge', Fuegen: 'Fügen', fuer: 'für', pruefen: 'prüfen', Pruefen: 'Prüfen', Pruefe: 'Prüfe', Pruefung: 'Prüfung', geprueft: 'geprüft', ueberpruefen: 'überprüfen', Ueberpruefe: 'Überprüfe', Zertifikatspruefung: 'Zertifikatsprüfung', aendern: 'ändern', // Nachtrag 2026-09-07: die grossgeschriebenen Formen fehlten. Der Waechter // hat sie nicht gemeldet, weil sein Verdachtsmuster case-sensitiv war und // "Ae"/"Oe" deshalb durchrutschten — mitbehoben in umlaut-guard.spec.ts. Aenderung: 'Änderung', Aenderungen: 'Änderungen', Oeffnen: 'Öffnen', geaendert: 'geändert', Moechten: 'Möchten', moeglich: 'möglich', moegliche: 'mögliche', koennen: 'können', verfuegbar: 'verfügbar', Verfuegbar: 'Verfügbar', Verfuegbare: 'Verfügbare', Verfuegbarkeit: 'Verfügbarkeit', Zurueck: 'Zurück', Zuruecksetzen: 'Zurücksetzen', zuruecksetzen: 'zurücksetzen', zurueckgesetzt: 'zurückgesetzt', rueckgaengig: 'rückgängig', Zusammenfuehren: 'Zusammenführen', zusammenfuehren: 'zusammenführen', bestaetigen: 'bestätigen', Bestaetigen: 'Bestätigen', Passwoerter: 'Passwörter', spaeter: 'später', ueberein: 'überein', uebersprungen: 'übersprungen', ueber: 'über', ungueltig: 'ungültig', Verschluesselung: 'Verschlüsselung', entschluesselt: 'entschlüsselt', ausgewaehlt: 'ausgewählt', Ausgewaehlt: 'Ausgewählt', ausgewaehlte: 'ausgewählte', Ausgewaehlte: 'Ausgewählte', waehle: 'wähle', benoetigt: 'benötigt', noetig: 'nötig', muessen: 'müssen', Domaene: 'Domäne', Einschraenkung: 'Einschränkung', Empfaenger: 'Empfänger', Oberflaeche: 'Oberfläche', Postfaecher: 'Postfächer', Praefix: 'Präfix', Sicherheitsgruenden: 'Sicherheitsgründen', unterstuetzt: 'unterstützt', vertrauenswuerdigen: 'vertrauenswürdigen', zusaetzlich: 'zusätzlich', zusaetzliche: 'zusätzliche', Groesse: 'Größe', Schliessen: 'Schließen', ausschliessen: 'ausschließen', }; /** * Tokens containing `ae`/`oe`/`ue`/`ss` that are already correct German * and must never be touched by the replacement or flagged by the guard. */ export const UMLAUT_ALLOWLIST: readonly string[] = [ // quick-261008-dts: Modul Domains (korrektes Deutsch) 'verschlüsselt', // quick-261003-387: Kategorienverwaltung (korrektes Deutsch) 'Neuer', // quick-261002-k67: Nextcloud-Status (korrektes Deutsch) 'Neueste', 'ausstehend', 'aktuell', 'Statusseite', 'Bildadresse', // quick-261008-j9f: Bildadresse per http (korrektes Deutsch) 'Adressen', // quick-261002-kxc: Fehlerhinweise der Kachel (korrektes Deutsch) 'passt', 'vertrauenswürdig', // quick-261001-l4q: Zertifikatsmodul, Übersicht (korrektes Deutsch) 'Aussteller', 'Betriebssystemen', 'Neuausstellung', 'passwortgeschützten', 'Schlüssel', 'Zertifizierungsstelle', // quick-260929-if2: „lässt“ (Erinnerung „lässt sich nicht mehr bearbeiten“) 'lässt', 'manuell', 'Manuell', 'Quelle', 'Quellen', 'Quell', 'Quellportal', 'Kalenderquelle', 'Kalenderquellen', 'Energiequellen', 'neue', 'neuen', 'neueren', 'neuere', 'Neue', 'Neues', 'aktuelle', 'Aktuell', 'Aktuelle', 'Aktuelles', 'zuerst', 'dauerhaft', 'Schauen', 'Taktfrequenz', 'Feuerlösch', 'Bergbauerzeugnisse', 'true', 'guest', 'Passwort', 'Adresse', // Bilderrahmen-Widget (quick-260921-pi9): korrektes Deutsch mit „ss“ 'Webadresse', 'Bildausschnitt', // XFrame-Widget (quick-260921-qd3): „In neuem Tab öffnen“, korrektes Deutsch wie neuen 'neuem', // quick-261002-fm5: Handelsware („Ein neues Konto wird gespeichert“), korrektes Deutsch 'neues', // XFrame-Ausschnitt (quick-260922-ge2): korrektes Deutsch mit „ss“ 'Ausschnitt', 'Absenderadresse', 'muss', 'musste', 'müssen', 'lassen', 'vergessen', 'stattdessen', 'Wasser', 'Abwasser', 'Hessen', 'Erzeugnisse', 'Druckerzeugnisse', 'Gummierzeugnisse', 'Mineralölerzeugnisse', 'Ausschreibung', 'Ausschreibungen', 'Ausschreibungs', 'Ausschreibungsdetails', 'erfasst', 'erfasster', 'Erfassung', 'Ergebnisse', 'gedrosselt', 'ausgeschlossen', 'Ausgeschlossen', 'Ausschlussliste', 'Informationssysteme', 'Zeitmessung', 'Tessera', 'Passen', 'Passt', 'Fasst', 'Verschlüsselung', 'empfaenger', 'Passwörter', 'vertrauenswürdigen', 'ausschließen', 'entschlüsselt', // Nachtrag 2026-09-07: Abkuerzungen mit doppeltem S. Sie tauchen erst auf, // seit das Verdachtsmuster case-insensitiv prueft — vorher fiel jedes // grossgeschriebene "SS" durch dasselbe Loch wie "Aenderungen". 'RSS', 'RSSGenerator', 'SSL', // 260914-m97: Fehler-melden-Knopf, Pflichtlabel "Was ist passiert?" 'passiert', // quick-260923-dhh: Proxmox-Modul — korrektes Deutsch mit „ss“ 'bewusst', 'gemessene', 'Messung', 'Prozessorlast', // quick-260924-h7x: Proxmox-Seite neu gestaltet — korrektes Deutsch mit „ss“ 'Prozessor', 'Arbeitsspeicher', // quick-260925-bow: „Was ist neu“-Fenster, Gruppe „Verbessert“ — korrektes Deutsch mit „ss“ 'Verbessert', // Administrator → Willkommensmail (eigene Vorlage) — korrektes Deutsch mit „ss“/„ue“/„ae“ 'anpassen', 'Abschlusstext', 'aktuellen', 'Passworts', 'tessera', // quick-261008-dts: Modul Domains, Kunden und Kontakte — korrektes Deutsch mit „ss“ 'Adresszeile', 'fassen', // quick-261008-dts (Aufgabe 3): Registrieren und Aufträge — korrektes Deutsch mit „ss“ 'Zusammenfassung', 'passender', 'dass', // quick-261008-mzu: Modul Dateien (Nextcloud) — korrektes Deutsch mit „ss“ 'zuverlässig', // quick-261008-mzu (Aufgabe 2): Verbinden und Abmelden — korrektes Deutsch mit „ss“ 'ausstellen', 'vergisst', // quick-261009-dkv: Teilen — korrektes Deutsch mit „ss“ 'Suchergebnisse', // quick-261009-dkv (Aufgabe 2): Links und Übersichten — korrektes Deutsch mit „ss“ 'verlassen', // quick-261009-ikt: Zertifikat-Manager — korrektes Deutsch mit „ss“ 'Schlüsseltyp', 'passende', 'passenden', 'passendes', 'Ausstellers', ];