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 }); }