Files
web-Iot/tmp_inject2.cjs
2026-08-14 09:02:52 +08:00

76 lines
3.3 KiB
JavaScript

// Inject the hardcoded-Chinese keys (tmp_newkeys.json) into locale files,
// preserving formatting by inserting before each namespace's closing brace.
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 newKeys = JSON.parse(fs.readFileSync('tmp_newkeys.json', 'utf8'));
const zhFlat = flat(load('src/locales/zh/index.ts'));
const enFlat = flat(load('src/locales/en/index.ts'));
function esc(v) { return String(v).replace(/\\/g, '\\\\').replace(/'/g, "\\'"); }
function insertIntoNs(text, ns, entries, indentUnit) {
// entries: [[base, value], ...] for keys NOT already present
const re = new RegExp('(\\n[ \\t]*)' + ns + ':\\s*\\{');
const m = re.exec(text);
if (!m) return null;
let i = m.index + m[0].length;
let depth = 1, j = i;
while (j < text.length && depth > 0) { const c = text[j]; if (c === '{') depth++; else if (c === '}') depth--; j++; }
const closeIdx = j - 1;
const indent = m[1];
const childIndent = indent + indentUnit;
const qk = (k) => /^[0-9]/.test(k) ? "'" + k + "'" : k;
const block = entries.map(([k, v]) => childIndent + qk(k) + ": '" + esc(v) + "',").join('\n');
return text.slice(0, closeIdx) + block + '\n' + text.slice(closeIdx);
}
function addNamespace(text, ns, entries, indentUnit) {
// find top-level const X = { ... } closing brace
const m = /const\s+\w+\s*=\s*\{/.exec(text);
let i = m.index + m[0].length;
let depth = 1, j = i;
while (j < text.length && depth > 0) { const c = text[j]; if (c === '{') depth++; else if (c === '}') depth--; j++; }
const closeIdx = j - 1;
const indent = '\n' + indentUnit;
const childIndent = indent + indentUnit;
const qk = (k) => /^[0-9]/.test(k) ? "'" + k + "'" : k;
const block = entries.map(([k, v]) => childIndent + qk(k) + ": '" + esc(v) + "',").join('\n');
const nsBlock = indent + ns + ': {' + '\n' + block + '\n' + indent + '}';
return text.slice(0, closeIdx) + ',' + nsBlock + text.slice(closeIdx);
}
for (const file of ['src/locales/zh/index.ts', 'src/locales/en/index.ts']) {
let text = fs.readFileSync(file, 'utf8');
const flatMap = file.includes('zh') ? zhFlat : enFlat;
const src = file.includes('zh') ? newKeys.zh : newKeys.en;
let added = 0;
for (const ns of Object.keys(src)) {
const entries = [];
for (const base of Object.keys(src[ns])) {
const key = ns + '.' + base;
if (key in flatMap) continue; // already present
entries.push([base, src[ns][base]]);
}
if (!entries.length) continue;
const before = text;
let res = insertIntoNs(text, ns, entries, '\t');
if (res === null) {
// namespace missing (e.g., 'page') -> create it
res = addNamespace(text, ns, entries, '\t');
}
if (res !== null && res !== before) { text = res; added += entries.length; }
}
fs.writeFileSync(file, text, 'utf8');
console.log(file + ' -> added ' + added + ' keys');
}