/* ===================================================================== WAS DER SERVER SAGT, IN SÄTZEN — 19.09.2026 Filipe: „keine kryptischen oder technischen Fehlermeldungen, sondern klare Aussagen darüber, was passiert ist und wie man das Problem lösen kann." --------------------------------------------------------------------- DAS PROBLEM, NACHGEMESSEN Der Server antwortet im Fehlerfall mit `{ fehler: "…" }`. Darin stehen ZWEI verschiedene Dinge, und sie sehen von außen gleich aus: 1. MASCHINENKENNUNGEN — `nicht_verfuegbar`, `nicht_gefunden`, `ungueltig`. Sie sind fürs Protokoll gedacht, nicht für Augen. Gezählt am 19.09.2026: 43 verschiedene, an 1 300 Stellen. 2. FERTIGE SÄTZE — z. B. „Woran hast du das gemerkt? Ein Satz genügt – ohne ihn ist es beim Gespräch nur noch ein Gefühl." Die sind genau richtig so und sollen unverändert durch. An 75 Stellen in der Oberfläche stand `textContent = d.fehler` — ungefiltert. Wer beim Hochladen einer Datei Pech hatte, las also wörtlich `nicht_verfuegbar` auf dem Bildschirm. Ein Mensch ohne Vorwissen weiß dann nicht einmal, ob er selbst etwas falsch gemacht hat. --------------------------------------------------------------------- DREI AUSGÄNGE, NICHT ZWEI Das ist dieselbe Regel wie überall im Haus — eine Auskunft, die ihre Frage nicht beantworten kann, muss das SAGEN und darf nicht schweigen: BEKANNTE KENNUNG → ihr Satz aus der Tabelle unten. UNBEKANNTE KENNUNG → der Ersatzsatz des Aufrufers. Sie wird NIE angezeigt. Eine neue Kennung, die noch niemand übersetzt hat, ist ein Fehler im Haus — nicht etwas, das der Benutzer ausbaden soll. FERTIGER SATZ → unverändert durch. Woran „Kennung" erkannt wird: nur Kleinbuchstaben, Ziffern und Unterstriche, kein Leerzeichen. Ein deutscher Satz hat immer Leerzeichen und Großbuchstaben; eine Kennung nie. Die Unterscheidung ist damit nicht geraten, sondern entschieden. --------------------------------------------------------------------- UND WARUM DIE TABELLE NICHT ALTERN KANN Eine von Hand gepflegte Liste ist im Haus schon zweimal teuer geworden (die abgeschriebene Spaltenliste, die feste Umbruchschwelle). Deshalb steht daneben `pruef-meldungen.mjs`: Sie liest ALLE Kennungen aus dem Server und wird rot, sobald eine hier fehlt. Wer morgen eine neue erfindet, kann sie nicht vergessen. ===================================================================== */ (function () { 'use strict'; /* Zu jeder Kennung ein Satz, der zwei Dinge tut: sagen, WAS ist — und, wo es etwas zu tun gibt, was der nächste Schritt ist. KEIN „Fehler 400". Keine Zahl, kein englisches Wort, keine Entschuldigung ohne Inhalt. */ var SAETZE = { /* ---- Die drei häufigsten ------------------------------------- */ nicht_verfuegbar: 'Der Server antwortet gerade nicht. Nichts wurde gespeichert – ' + 'versuch es in einer Minute noch einmal.', nicht_gefunden: 'Das gibt es nicht mehr. Wahrscheinlich hat es jemand gelöscht – ' + 'lade die Seite neu.', ungueltig: 'Mit der Eingabe stimmt etwas nicht. Sieh die Felder noch einmal durch.', /* ---- Anmeldung und Zugang ------------------------------------ */ nicht_angemeldet: 'Du bist nicht mehr angemeldet. Melde dich noch einmal an.', zu_viele_versuche: 'Zu viele Versuche hintereinander. Warte einen Moment, dann geht es wieder.', /* Nicht „etwas Älteres ist offen" — es geht um die Bestätigung des eigenen ALTERS beim ersten Anmelden. Beim ersten Hinsehen hatte ich es falsch verstanden; der Blick in workspace.js:4864 hat es geklärt. */ alter_offen: 'Bitte bestätige zuerst dein Alter, dann geht es weiter.', eigener_code: 'Das ist dein eigener Zugang – den kannst du hier nicht neu vergeben.', fremde_herkunft: 'Das wurde aus Sicherheitsgründen abgelehnt. Lade die Seite neu ' + 'und versuch es noch einmal.', /* ---- Darf ich das? ------------------------------------------- */ nicht_erlaubt: 'Das darfst du hier nicht ändern.', nur_leitung: 'Das kann nur DogFather oder die rechte Hand.', nur_gruender: 'Das kann nur, wer das Gespräch angelegt hat.', hier_nicht: 'An dieser Stelle geht das nicht – abgestimmt wird auf der Wunschliste.', gesperrt: 'Dafür ist die Abstimmung zu.', geschlossen: 'Der Fall ist abgeschlossen. Hier kann nichts mehr dazukommen.', nicht_dran: 'Du bist gerade nicht dran – warte auf die Antwort.', leitung_meldet_nicht: 'Diesen Weg gibt es für das Team. Du liest die Meldungen, du schreibst sie nicht.', umgezogen: 'Diese Seite ist umgezogen. Lade sie neu, dann bist du am richtigen Ort.', /* ---- Da fehlt oder stimmt etwas ------------------------------ */ unvollstaendig: 'Da fehlt noch etwas. Die offenen Stellen sind markiert.', leer: 'Da steht noch nichts drin.', betreff_fehlt: 'Der Betreff fehlt noch.', text_zu_kurz: 'Der Text ist zu kurz – ein ganzer Satz genügt.', zu_lang: 'Das ist zu lang. Kürze es etwas.', unbrauchbar: 'Damit kann der Server nichts anfangen. Prüf die Eingabe.', unbekannte_stufe: 'Diese Auswahl kennt der Server nicht. Lade die Seite neu.', unbekanntes_zeichen: 'Dieses Zeichen gibt es nicht. Lade die Seite neu.', keine_datumsspalte: 'In der Datei fehlt eine Spalte mit dem Datum. Ohne sie lässt sich nichts zuordnen.', keine_zuordnung: 'Die Zeilen lassen sich niemandem zuordnen. Prüf die Überschriften in der Datei.', /* ---- Gab es schon / gibt es nicht ---------------------------- */ schon_da: 'Das gibt es schon.', schon_uebernommen: 'Das hat schon jemand übernommen.', schon_entschieden: 'Darüber wurde bereits entschieden.', zurueckgenommen: 'Die Nachricht wurde zurückgenommen.', nichts_zu_aendern: 'Es gab nichts zu ändern – es steht schon so da.', nichts_zu_speichern:'Es gab nichts zu speichern.', eintrag_nicht_gefunden: 'Den Eintrag gibt es nicht mehr. Lade die Seite neu.', aufgabe_nicht_gefunden: 'Die Aufgabe gibt es nicht mehr. Lade die Seite neu.', keine_fassung: 'Dazu gibt es noch keine gespeicherte Fassung.', keine_daten: 'Dazu gibt es noch keine Daten.', kein_protokoll: 'Dazu gibt es kein Protokoll.', kein_block: 'Diesen Bereich gibt es nicht mehr. Lade die Seite neu.', kein_hakt: 'Daraus lässt sich kein Schritt machen – dafür müsste der Punkt auf ' + '„Da hakt es" stehen.', /* ---- Erst das andere zu Ende -------------------------------- */ uebergang_offen: 'Es läuft schon ein Übergang. Schließ den erst ab.', zu_viele_offen: 'Du hast schon mehrere Meldungen offen. Warte, bis eine davon beantwortet ist.', nur_gruppe_oder_kanal: 'Das geht nur in einer Gruppe oder einem Kanal, nicht im Zweiergespräch.' }; /* Sieht das wie eine Maschinenkennung aus? Nur Kleinbuchstaben, Ziffern, Unterstriche — und kein Leerzeichen. Ein Satz aus dem Server hat immer beides nicht. */ function istKennung(t) { return typeof t === 'string' && t.length > 0 && /^[a-z0-9_]+$/.test(t); } /** Aus dem, was der Server schickt, einen Satz machen. * * @param {string|undefined} fehler was in `{ fehler: … }` stand * @param {string} [ersatz] Satz für den Fall, dass nichts * passt. Er soll zur Stelle * passen („Anlegen hat nicht * geklappt."), nicht allgemein * sein. * @returns {string} immer ein lesbarer Satz, nie eine Kennung. */ window.sagWas = function (fehler, ersatz) { var standard = ersatz || 'Das hat nicht geklappt. Versuch es noch einmal.'; if (!fehler || typeof fehler !== 'string') return standard; if (SAETZE[fehler]) return SAETZE[fehler]; /* UNBEKANNTE KENNUNG: der Ersatzsatz, niemals die Kennung selbst. Sie taucht dafür in der Konsole auf — damit sie jemandem auffällt, der sie beheben kann, statt dem, der sie nicht versteht. */ if (istKennung(fehler)) { try { console.warn('[meldung] Kennung ohne Satz:', fehler); } catch (e) { /* egal */ } return standard; } /* Ein fertiger Satz aus dem Server — unverändert durch. */ return fehler; }; /* Für die Prüfung, damit sie gegen DIESE Tabelle vergleicht und nicht gegen eine abgeschriebene zweite. */ window.sagWas.SAETZE = SAETZE; })();