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
+1 -1
View File
@@ -51,7 +51,7 @@ export async function apiRequest<T>(path: string, options: RequestInit = {}): Pr
try {
response = await fetch(`/api${path}`, { ...options, headers });
} catch {
throw new ApiError('Server nicht erreichbar. Bitte Verbindung pruefen.', 0);
throw new ApiError('Server nicht erreichbar. Bitte Verbindung prüfen.', 0);
}
if (response.status === 401) {
+1 -1
View File
@@ -115,7 +115,7 @@ export function useRecorder(
try {
const { text } = await transcribe(blob);
if (text) onText(text);
else onError('Es war nichts Verstaendliches zu hoeren.');
else onError('Es war nichts Verständliches zu hören.');
} catch (err) {
onError(err instanceof Error ? err.message : 'Die Erkennung ist fehlgeschlagen.');
} finally {
+1 -1
View File
@@ -56,7 +56,7 @@ function dataUrlBytes(dataUrl: string): number {
*/
export async function compressImage(file: File): Promise<CompressedImage> {
if (file.size > MAX_SOURCE_BYTES) {
throw new Error('Die Datei ist zu gross (max. 25 MB).');
throw new Error('Die Datei ist zu groß (max. 25 MB).');
}
const image = await loadImage(file);
+2 -2
View File
@@ -188,7 +188,7 @@ export const WhisperProvider: React.FC<{ children: React.ReactNode }> = ({ child
const adapter = await gpu.requestAdapter();
if (cancelled) return;
if (!adapter) {
setCapabilities((prev) => ({ ...prev, webgpu: false, adapter: 'kein Adapter verfuegbar' }));
setCapabilities((prev) => ({ ...prev, webgpu: false, adapter: 'kein Adapter verfügbar' }));
return;
}
const info = adapter.info ?? {};
@@ -298,7 +298,7 @@ export const WhisperProvider: React.FC<{ children: React.ReactNode }> = ({ child
};
worker.onerror = (event) => {
failLoad(event.message || 'Der Whisper-Worker ist abgestuerzt.');
failLoad(event.message || 'Der Whisper-Worker ist abgestürzt.');
};
workerRef.current = worker;
+1 -1
View File
@@ -104,7 +104,7 @@ function reportFatal(reason: unknown) {
post({
type: 'error',
message: isMemory
? `Der Speicher reicht fuer dieses Modell in dieser Genauigkeit nicht (${raw}). Bitte eine kleinere Genauigkeit wie q4 waehlen.`
? `Der Speicher reicht für dieses Modell in dieser Genauigkeit nicht (${raw}). Bitte eine kleinere Genauigkeit wie q4 wählen.`
: raw,
});
}