/** * Vergleicht flache Schlüsselpfade zwischen zwei Locale-Ordnern (gleiche JSON-Dateinamen). * * Aufruf: node scripts/check-i18n-locale-parity.mjs de fr */ import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const BASE = path.join(__dirname, '../src/i18n/locales'); function flattenLeaves(obj, prefix = '', out = {}) { if (obj === null || typeof obj !== 'object' || Array.isArray(obj)) { out[prefix] = obj; return out; } const keys = Object.keys(obj); if (keys.length === 0) { out[prefix] = obj; return out; } for (const k of keys) { const p = prefix ? `${prefix}.${k}` : k; const v = obj[k]; if (v !== null && typeof v === 'object' && !Array.isArray(v)) { flattenLeaves(v, p, out); } else { out[p] = v; } } return out; } const [a, b] = process.argv.slice(2); if (!a || !b) { console.error('Usage: node scripts/check-i18n-locale-parity.mjs '); process.exit(2); } const dirA = path.join(BASE, a); const dirB = path.join(BASE, b); const files = fs.readdirSync(dirA).filter((f) => f.endsWith('.json')); let errors = 0; for (const f of files) { const pa = path.join(dirA, f); const pb = path.join(dirB, f); if (!fs.existsSync(pb)) { console.error(`Fehlt: ${b}/${f}`); errors++; continue; } const ja = JSON.parse(fs.readFileSync(pa, 'utf8')); const jb = JSON.parse(fs.readFileSync(pb, 'utf8')); const fa = flattenLeaves(ja); const fb = flattenLeaves(jb); const ka = new Set(Object.keys(fa)); const kb = new Set(Object.keys(fb)); for (const k of ka) { if (!kb.has(k)) { console.error(`[${f}] fehlt in ${b}: ${k}`); errors++; } } for (const k of kb) { if (!ka.has(k)) { console.error(`[${f}] extra in ${b}: ${k}`); errors++; } } } if (errors) { console.error(`\n${errors} Abweichung(en).`); process.exit(1); } console.log(`OK: Key-Parität ${a} ↔ ${b} für ${files.length} Dateien.`);