const { readLocale } = require('./i18n-utils.cjs'); const localeFiles = [ ['en', 'en.ts', 'en'], ['zh-CN', 'zh-CN.ts', 'zhCN'], ['zh-TW', 'zh-TW.ts', 'zhTW'], ['ru', 'ru.ts', 'ru'], ]; const locales = Object.fromEntries( localeFiles.map(([locale, fileName, variableName]) => [locale, readLocale(fileName, variableName)]) ); const base = locales.en; const baseKeys = Object.keys(base).sort(); const placeholderRe = /\{\w+\}/g; const errors = []; for (const [locale, table] of Object.entries(locales)) { const keys = Object.keys(table).sort(); const missing = baseKeys.filter((key) => !(key in table)); const extra = keys.filter((key) => !baseKeys.includes(key)); if (missing.length || extra.length) { errors.push({ locale, missing, extra }); } for (const key of baseKeys) { const basePlaceholders = Array.from(String(base[key]).matchAll(placeholderRe), (match) => match[0]).sort().join('|'); const localePlaceholders = Array.from(String(table[key]).matchAll(placeholderRe), (match) => match[0]).sort().join('|'); if (basePlaceholders !== localePlaceholders) { errors.push({ locale, key, basePlaceholders, localePlaceholders }); } } } console.log(JSON.stringify({ counts: Object.fromEntries(Object.entries(locales).map(([locale, table]) => [locale, Object.keys(table).length])), errors, }, null, 2)); if (errors.length) { process.exit(1); }