/* Prüft für jede Webdesign-Seite: 1. jeder data-i18n-Schlüssel existiert im Wörterbuch 2. jeder Schlüssel hat ALLE fünf Sprachen 3. keine Überschrift h1-h4 ohne data-i18n (der dokumentierte Bug-Klassiker aus DogiHompage/CLAUDE.md) 4. keine unbenutzten Schlüssel (Hinweis, kein Fehler) Aufruf: node tmp-i18n-check.mjs */ import { readFileSync, existsSync, readdirSync } from "node:fs"; import { chdir } from "node:process"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; /* Immer vom Projektordner aus arbeiten, egal von wo aufgerufen. */ chdir(join(dirname(fileURLToPath(import.meta.url)), "..")); const SPRACHEN = ["de", "de-CH", "en", "fr", "pt"]; const KERN = "assets/js/wd-core.js"; /* Schlüssel, die wd-core.js selbst mitbringt (Navigation, Fußzeile, Fehlermeldungen) — die dürfen in jeder Seite benutzt werden. */ const kernQuelle = readFileSync(KERN, "utf8"); const kernSchluessel = new Set( [...kernQuelle.matchAll(/^\s{4}([a-z0-9_]+):\s*\{/gm)].map((m) => m[1]) ); let fehler = 0; const seiten = existsSync("webdesign") ? readdirSync("webdesign").filter((f) => f.endsWith(".html")) : []; for (const datei of seiten) { const name = datei.replace(/\.html$/, ""); const html = readFileSync(`webdesign/${datei}`, "utf8"); const i18nDatei = `assets/js/i18n-wd-${name}.js`; console.log(`\n--- ${datei} ---`); /* Bewusst einsprachige Seiten. Der öffentliche Teil läuft in fünf Sprachen, weil dort Kunden landen. In der Verwaltung landen ausschließlich Dogfather und VanVan — fünf Sprachen wären dort fünffache Pflege und fünffache Fehlerfläche ohne einen einzigen Nutzer, der sie braucht. Genau wie der bestehende interne Bereich des Universe, der ebenfalls nur Deutsch spricht. Die Tag-Balance wird trotzdem geprüft (siehe unten). */ /* NUR die Verwaltung ist einsprachig. Das Kundenportal stand hier zunaechst auch drin -- das war ein Denkfehler: die Verwaltung nutzen Dogfather und VanVan, das Portal nutzen KUNDEN. Und Kunden koennen Franzosen oder Portugiesen sein. Ein Portal, das die Sprachwahl der oeffentlichen Seite ignoriert, waere genau der Bruch, den ein Kunde sofort bemerkt. */ /* Zwei weitere Seiten kamen hinzu, beide aus eigenem Grund: "diagnose" ist ein Werkzeug fuer den Betrieb, bewusst ohne externe Dateien gebaut. Es landet dort niemand ausser Dogfather selbst. "rechtliches" ist der heiklere Fall und ausdruecklich eine ENTSCHEIDUNG, keine Luecke: Rechtstexte durch eine nicht gepruefte Uebersetzung zu schicken ist gefaehrlicher, als sie einsprachig zu lassen -- ein Uebersetzungsfehler in einer Widerrufsbelehrung oder in den Geschaeftsbedingungen wirkt gegen den Verfasser. Wenn die Seite mehrsprachig werden soll, gehoert die Uebersetzung von jemandem geprueft, der dafuer geradesteht, nicht aus einem Woerterbuch nebenbei erzeugt. Frueher meldete die Pruefung fuer beide schlicht "Datei fehlt". Das las sich wie ein Versehen und stand deshalb monatelang als Fehler in der Liste, ohne dass jemand etwas tat. */ /* "rechtliches" ist seit dem 25.08.2026 UEBERSETZT und steht deshalb nicht mehr hier. Die Rechtstexte gibt es jetzt in allen fuenf Sprachen, mit der Massgeblichkeitsklausel in jeder davon: Nur die deutsche Fassung ist verbindlich, die Uebersetzung dient dem Verstaendnis. Widerrufsbelehrung und Musterformular folgen dem amtlichen Wortlaut aus Anhang I der Richtlinie 2011/83/EU. */ const NUR_DEUTSCH = ["verwaltung", "diagnose"]; const einsprachig = NUR_DEUTSCH.includes(name); if (!existsSync(i18nDatei) && !einsprachig) { console.log(` FEHLER: ${i18nDatei} fehlt`); fehler++; continue; } if (einsprachig) { console.log(" bewusst nur Deutsch — nur Struktur geprueft"); /* NUR das echte Markup zaehlen, nicht die Skriptbloecke. Die Verwaltung baut ihre Listen im Browser zusammen. Im JavaScript stehen deshalb HTML-Schnipsel als Zeichenketten -- und dort steht ein oeffnendes