Files
BarevClub/packages/i18n/scripts/import.ts
T
2026-10-25 22:55:29 +04:00

46 lines
2.0 KiB
TypeScript

/**
* Загрузка проверенных переводов: pnpm i18n:import -- i18n-review/hy.csv [i18n-review/zh.csv …]
* Язык берётся из имени файла. Строки с approved=yes помечаются проверенными для текущего русского текста.
*/
import { readFileSync } from 'node:fs';
import path from 'node:path';
import { isLocale } from '../src/index.ts';
import { parseCsv, placeholders, readLocale, readReview, sourceHash, writeLocale, writeReview } from './lib.ts';
const files = process.argv.slice(2).filter((a) => !a.startsWith('--'));
if (!files.length) {
console.error('Укажите CSV-файлы: pnpm i18n:import -- i18n-review/hy.csv');
process.exit(1);
}
const ru = readLocale('ru');
const order = Object.keys(ru);
const review = readReview();
for (const file of files) {
const locale = path.basename(file, '.csv');
if (!isLocale(locale) || locale === 'ru') throw new Error(`Не понимаю язык файла ${file}`);
const [header, ...rows] = parseCsv(readFileSync(path.resolve(process.env.INIT_CWD ?? process.cwd(), file), 'utf8').replace(/^\uFEFF/, ''));
const col = (name: string) => header!.indexOf(name);
const msgs = readLocale(locale);
let updated = 0;
let approved = 0;
for (const r of rows) {
const key = r[col('key')]!;
const translation = r[col('translation')]?.trim();
if (!(key in ru) || !translation) continue;
if (placeholders(ru[key]!) !== placeholders(translation)) {
console.warn(`${locale}: пропущен ${key} — плейсхолдеры не совпадают с русским`);
continue;
}
if (msgs[key] !== translation) updated++;
msgs[key] = translation;
if (/^(yes|да|y|1|ok)$/i.test(r[col('approved')]?.trim() ?? '')) {
review[locale][key] = sourceHash(ru[key]!);
approved++;
}
}
writeLocale(locale, msgs, order);
console.log(`${locale}: обновлено ${updated}, проверено ${approved}`);
}
writeReview(review);