orca/config/scripts/repair-locale-catalog.mjs

77 lines
2.5 KiB
JavaScript

import fs from 'node:fs/promises'
import path from 'node:path'
import process from 'node:process'
import { pathToFileURL } from 'node:url'
import { repairCacheMap, repairCatalog } from './locale-translation-policy.mjs'
const LOCALES_DIR = path.join('src', 'renderer', 'src', 'i18n', 'locales')
const LOCALE_CACHE_FILES = {
ko: '.ko-catalog-cache.json',
zh: '.zh-catalog-cache.json',
ja: '.ja-catalog-cache.json',
es: '.es-catalog-cache.json'
}
function parseLocaleArg(argv) {
const localeFlagIndex = argv.indexOf('--locale')
if (localeFlagIndex !== -1 && argv[localeFlagIndex + 1]) {
return argv[localeFlagIndex + 1]
}
return undefined
}
async function loadCache(cachePath) {
try {
const raw = JSON.parse(await fs.readFile(cachePath, 'utf8'))
return new Map(Object.entries(raw))
} catch {
return new Map()
}
}
async function saveCache(cachePath, cache) {
const raw = Object.fromEntries([...cache.entries()].sort(([a], [b]) => a.localeCompare(b)))
await fs.writeFile(cachePath, `${JSON.stringify(raw, null, 2)}\n`, 'utf8')
}
export async function repairLocale(root, locale) {
const enPath = path.join(root, LOCALES_DIR, 'en.json')
const localePath = path.join(root, LOCALES_DIR, `${locale}.json`)
const cachePath = path.join(root, LOCALES_DIR, LOCALE_CACHE_FILES[locale])
const enCatalog = JSON.parse(await fs.readFile(enPath, 'utf8'))
const localeCatalog = JSON.parse(await fs.readFile(localePath, 'utf8'))
const cache = await loadCache(cachePath)
const catalogRepairs = repairCatalog(enCatalog, localeCatalog, locale)
const cacheRepairs = repairCacheMap(cache, locale)
await fs.writeFile(localePath, `${JSON.stringify(localeCatalog, null, 2)}\n`, 'utf8')
await saveCache(cachePath, cache)
console.log(`Repaired ${locale}.json (${catalogRepairs} leaf updates)`)
console.log(`Repaired ${LOCALE_CACHE_FILES[locale]} (${cacheRepairs} cache updates)`)
return { catalogRepairs, cacheRepairs }
}
export async function main(root = process.cwd(), locale = parseLocaleArg(process.argv)) {
const locales = locale ? [locale] : ['ko', 'zh', 'ja', 'es']
const unsupported = locales.filter((code) => !LOCALE_CACHE_FILES[code])
if (unsupported.length > 0) {
console.error(`Unsupported locale(s): ${unsupported.join(', ')}`)
return 1
}
for (const code of locales) {
await repairLocale(root, code)
}
return 0
}
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
process.exit(await main())
}