From 209a765154124d4e66254c28c47c23f258f8c02a Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 5 Jun 2026 13:49:02 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20translation-coverage=20z=C3=A4hlt=20nur?= =?UTF-8?q?=20=C3=BCbersetzbare=20Zeilen=20als=20fehlend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Leere Hüllen-Zeilen (in allen Sprachen leer, z.B. word-Typ-Statements ohne Satztext) wurden als fehlend gezählt, obwohl translate-missing sie mangels Quelltext nie anrührt. Dadurch zeigte die UI viele offene Übersetzungen, der Button meldete aber 'Fertig: 0 übersetzt'. total/missing basieren jetzt auf dem übersetzbaren Bestand (Text in mind. einer Sprache). Co-Authored-By: Claude Opus 4.8 --- src/routes/claude.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/routes/claude.js b/src/routes/claude.js index 6580b53..e93b2ff 100644 --- a/src/routes/claude.js +++ b/src/routes/claude.js @@ -360,10 +360,18 @@ router.get('/translation-coverage', async (req, res, next) => { // Eine Zeile zählt als "in Sprache vorhanden", wenn ALLE konfigurierten Felder gefüllt sind. // (für statements: pos+neg — wir nehmen einfach pos als Haupt-Indikator, neg ist optional) const mainField = cfg.fields[0]; + const filled = (l) => `(${mainField}_${l} IS NOT NULL AND ${mainField}_${l} <> '')`; for (const lang of LANGS) { - const totalRow = (await query(`SELECT COUNT(*)::int AS c FROM ${table}`)).rows[0]; + // total = nur Zeilen mit Text in mind. EINER Sprache (übersetzbarer Bestand). + // Leere Hüllen-Zeilen (in allen Sprachen leer) zählen nicht als "fehlend", + // weil sie keine Quelle zum Übersetzen haben (sonst zeigt die UI Zeilen an, + // die translate-missing niemals anrühren kann → "0 übersetzt" bei "viele offen"). + const sourceCond = LANGS.map(filled).join(' OR '); + const totalRow = (await query( + `SELECT COUNT(*)::int AS c FROM ${table} WHERE ${sourceCond}` + )).rows[0]; const haveRow = (await query( - `SELECT COUNT(*)::int AS c FROM ${table} WHERE ${mainField}_${lang} IS NOT NULL AND ${mainField}_${lang} <> ''` + `SELECT COUNT(*)::int AS c FROM ${table} WHERE ${filled(lang)}` )).rows[0]; coverage.push({ source_table: table, language: lang, total: totalRow.c, have: haveRow.c, missing: totalRow.c - haveRow.c }); }