diff --git a/extension/locales/ru.json b/extension/locales/ru.json index 0bdc64e..880e6c7 100644 --- a/extension/locales/ru.json +++ b/extension/locales/ru.json @@ -189,7 +189,6 @@ "AUDIO_OPEN_SETTINGS": "Открыть", "NEW_FEATURE_AUDIO": "Новое: Обработка звука — попробуйте компрессор!", "AUDIO_BACK": "← Назад", - "AUDIO_BACK": "← Назад", "AUDIO_PAGE_TITLE": "Настройки звука", "AUDIO_MASTER_TOGGLE": "Обработка звука", "AUDIO_COMPRESSOR": "Компрессор", diff --git a/scripts/test-locales.js b/scripts/test-locales.js index 00317f1..e45069c 100644 --- a/scripts/test-locales.js +++ b/scripts/test-locales.js @@ -55,7 +55,26 @@ console.log(`Auditing i18n locales using ${enKeys.length} baseline keys from en. for (const file of localeFiles) { const filePath = path.join(localesDir, file); try { - const dict = JSON.parse(fs.readFileSync(filePath, 'utf8')); + const raw = fs.readFileSync(filePath, 'utf8'); + + // Check for duplicate keys in raw JSON before parsing + const keyRe = /"(\w+)"\s*:/g; + const seenKeys = {}; + let dupes = []; + let m; + while ((m = keyRe.exec(raw)) !== null) { + if (seenKeys[m[1]]) { + dupes.push(m[1]); + } + seenKeys[m[1]] = true; + } + if (dupes.length > 0) { + hasError = true; + console.error(`❌ ${file} has duplicate keys: ${[...new Set(dupes)].join(', ')}`); + continue; + } + + const dict = JSON.parse(raw); const keys = Object.keys(dict); const missingKeys = enKeys.filter(k => !keys.includes(k)); diff --git a/scripts/test-website-locales.mjs b/scripts/test-website-locales.mjs index 3b069bf..b4bd9b3 100644 --- a/scripts/test-website-locales.mjs +++ b/scripts/test-website-locales.mjs @@ -27,7 +27,26 @@ console.log(`Auditing website i18n locales using ${enKeys.length} baseline keys for (const file of localeFiles) { const filePath = path.join(localesDir, file); try { - const dict = JSON.parse(fs.readFileSync(filePath, 'utf8')); + const raw = fs.readFileSync(filePath, 'utf8'); + + // Check for duplicate keys in raw JSON before parsing + const keyRe = /"(\w+)"\s*:/g; + const seenKeys = {}; + let dupes = []; + let m; + while ((m = keyRe.exec(raw)) !== null) { + if (seenKeys[m[1]]) { + dupes.push(m[1]); + } + seenKeys[m[1]] = true; + } + if (dupes.length > 0) { + hasError = true; + console.error(`❌ ${file} has duplicate keys: ${[...new Set(dupes)].join(', ')}`); + continue; + } + + const dict = JSON.parse(raw); const keys = Object.keys(dict).sort(); const missingKeys = enKeys.filter(k => !keys.includes(k));