fix: translation-coverage zählt nur übersetzbare Zeilen als fehlend

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 <noreply@anthropic.com>
This commit is contained in:
2026-06-05 13:49:02 +02:00
parent 28435e89c3
commit 209a765154

View File

@@ -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. // 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) // (für statements: pos+neg — wir nehmen einfach pos als Haupt-Indikator, neg ist optional)
const mainField = cfg.fields[0]; const mainField = cfg.fields[0];
const filled = (l) => `(${mainField}_${l} IS NOT NULL AND ${mainField}_${l} <> '')`;
for (const lang of LANGS) { 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( 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]; )).rows[0];
coverage.push({ source_table: table, language: lang, total: totalRow.c, have: haveRow.c, missing: totalRow.c - haveRow.c }); coverage.push({ source_table: table, language: lang, total: totalRow.c, have: haveRow.c, missing: totalRow.c - haveRow.c });
} }