#!/usr/bin/env node // scripts/i18n-add-keys.mjs // 번역 키를 ko/en(필요하면 다른 로케일) JSON 에 한 번에 병합한다. 파일 전체를 읽고-합치고-쓰는 동작이 한 프로세스 안에서 // 끝나므로, 여러 작업자가 같은 로케일 파일을 손으로 Edit 하다 서로 덮어쓰는 일을 막는다. // // 사용: node scripts/i18n-add-keys.mjs // keys.json 형식: { "ko": { "home.title": "오늘" }, "en": { "home.title": "Today" } } // 이미 있는 키는 값을 바꾼다(--no-overwrite 면 건너뛴다). 새 키는 파일 끝에 붙는다. import { readFileSync, writeFileSync, renameSync } from 'node:fs' import { dirname, join } from 'node:path' import { fileURLToPath } from 'node:url' const here = dirname(fileURLToPath(import.meta.url)) const localesDir = join(here, '..', 'packages', 'i18n', 'src', 'locales') const [input, flag] = process.argv.slice(2) if (!input) { process.stderr.write('usage: node scripts/i18n-add-keys.mjs [--no-overwrite]\n') process.exit(2) } const overwrite = flag !== '--no-overwrite' const patch = JSON.parse(readFileSync(input, 'utf8')) let changed = 0 for (const [locale, entries] of Object.entries(patch)) { const file = join(localesDir, `${locale}.json`) const current = JSON.parse(readFileSync(file, 'utf8')) for (const [key, value] of Object.entries(entries)) { if (typeof value !== 'string') throw new Error(`${locale}.${key}: value must be a string`) if (key in current && !overwrite) continue if (current[key] !== value) { current[key] = value changed++ } } const tmp = `${file}.tmp-${process.pid}` writeFileSync(tmp, `${JSON.stringify(current, null, 2)}\n`, 'utf8') renameSync(tmp, file) } process.stdout.write(`i18n: ${changed} key(s) written\n`)