Files
nonograms/scripts/fill_language_labels.cjs

50 lines
1.6 KiB
JavaScript

const fs = require('fs');
const path = 'src/composables/useI18n.js';
let content = fs.readFileSync(path, 'utf8');
const messagesMatch = content.match(/const messages = ({[\s\S]*?});/);
if (!messagesMatch) {
console.error('Could not find messages object');
process.exit(1);
}
const messages = eval(`(${messagesMatch[1]})`);
const en = messages.en || {};
const allLangKeys = Object.keys(en).filter((k) => k.startsWith('language.'));
function injectMissingLanguageLabels(localeCode) {
const blockStartRegex = new RegExp(`\\s{2}['\"]?${localeCode}['\"]?\\s*:\\s*\\{`);
const startIndex = content.search(blockStartRegex);
if (startIndex === -1) return;
const braceStart = content.indexOf('{', startIndex);
let i = braceStart + 1;
let depth = 1;
while (i < content.length && depth > 0) {
if (content[i] === '{') depth++;
else if (content[i] === '}') depth--;
i++;
}
const block = content.slice(braceStart + 1, i - 1);
let updated = block;
let addedAny = false;
allLangKeys.forEach((key) => {
const keyRegex = new RegExp(`(['\"])${key}\\1\\s*:\\s*(['\"]).*?\\2`);
if (!keyRegex.test(updated)) {
const value = en[key];
updated = updated.trim().endsWith(',') ? updated + `\n '${key}': '${value}'` : updated + `,\n '${key}': '${value}'`;
addedAny = true;
}
});
if (addedAny) {
content = content.slice(0, braceStart + 1) + updated + content.slice(i - 1);
}
}
Object.keys(messages).forEach((locale) => {
if (locale === 'en') return;
injectMissingLanguageLabels(locale);
});
fs.writeFileSync(path, content);
console.log('Filled missing language.* labels for all locales.');