50 lines
2.2 KiB
JavaScript
50 lines
2.2 KiB
JavaScript
// Final check: every t('key') / i18n.t('key') reference in src must exist in locale.
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
function load(p) {
|
|
let s = fs.readFileSync(p, 'utf8');
|
|
s = s.replace(/const\s+\w+\s*=\s*\{/, 'var obj = {');
|
|
s = s.replace(/export\s+default\s+\w+;?/, '');
|
|
s = s.replace(/\bconst\b/g, 'var');
|
|
return new Function(s + '\nreturn obj;')();
|
|
}
|
|
function flat(o, p, r) { p = p || ''; r = r || {}; for (const k of Object.keys(o)) { const key = p ? p + '.' + k : k; if (o[k] && typeof o[k] === 'object' && !Array.isArray(o[k])) flat(o[k], key, r); else r[key] = o[k]; } return r; }
|
|
const zh = flat(load('src/locales/zh/index.ts'));
|
|
const en = flat(load('src/locales/en/index.ts'));
|
|
const have = new Set([...Object.keys(zh), ...Object.keys(en)]);
|
|
|
|
const root = 'src';
|
|
const exts = ['.tsx', '.ts', '.jsx', '.js'];
|
|
function walk(dir) {
|
|
const out = [];
|
|
for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
const full = path.join(dir, e.name);
|
|
if (e.isDirectory()) { if (!['locales', 'node_modules'].includes(e.name)) out.push(...walk(full)); }
|
|
else if (exts.includes(path.extname(e.name))) out.push(full);
|
|
}
|
|
return out;
|
|
}
|
|
const rx = /[^A-Za-z]t\(\s*['"`]([^'"`]+)['"`]\s*\)/g;
|
|
const missing = {}; // key -> [files]
|
|
let total = 0;
|
|
for (const f of walk(root)) {
|
|
const s = fs.readFileSync(f, 'utf8');
|
|
let m; rx.lastIndex = 0;
|
|
while ((m = rx.exec(s))) {
|
|
const k = m[1];
|
|
if (k.startsWith('_')) continue; // i18n internal
|
|
total++;
|
|
if (!have.has(k)) (missing[k] = missing[k] || []).push(f.replace(root + '\\', ''));
|
|
}
|
|
}
|
|
const keys = Object.keys(missing);
|
|
console.log('Total t() references scanned:', total);
|
|
console.log('Distinct missing keys:', keys.length);
|
|
if (keys.length) {
|
|
for (const k of keys.slice(0, 60)) console.log(' MISSING ' + k + ' <- ' + [...new Set(missing[k])].join(', '));
|
|
}
|
|
// also report keys whose zh value is itself a raw key-like (english) — quality check
|
|
let rawLike = 0;
|
|
for (const k of Object.keys(zh)) { const v = zh[k]; if (typeof v === 'string' && /^[a-z][a-zA-Z0-9]*\.[a-zA-Z0-9.]+$/.test(v)) rawLike++; }
|
|
console.log('zh entries whose value looks like a key (possible untranslated):', rawLike);
|