Files
OpenFlare/frontend/scripts/merge-i18n-fragments.mjs
T
ryan 497edfd564 refactor(i18n): fragments 为唯一源,主包改为生成物
- 一次性回灌:主包最新内容(含 565 个未同步键)全量写回 6 个 fragment 文件,fragments 成为完整唯一源;新增 core fragment(common/docs/home 等 9 个此前仅存在于主包的命名空间)
- merge-i18n-fragments.mjs 改为从零重建主包(不再以主包为基础),重建结果与原主包语义零差异
- 主包 messages/{zh-CN,en}.json 移出跟踪并加入 .gitignore
- 生成接入入口:predev/prebuild/prebuild:embed/precheck:i18n 钩子 + Makefile code-check 与 checks.sh vitest 前置生成
- 修复既有漂移:configVersions.title 现以 fragments(Config versions)为准
2026-08-16 22:38:50 +08:00

43 lines
1.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { readFileSync, writeFileSync, readdirSync } from 'node:fs';
import { resolve, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
const root = resolve(dirname(fileURLToPath(import.meta.url)), '..');
const fragmentsDir = resolve(root, 'messages/fragments');
function deepMerge(target, source) {
for (const [key, value] of Object.entries(source)) {
if (
value &&
typeof value === 'object' &&
!Array.isArray(value) &&
target[key] &&
typeof target[key] === 'object' &&
!Array.isArray(target[key])
) {
deepMerge(target[key], value);
} else {
target[key] = value;
}
}
return target;
}
function mergeLocale(locale) {
const mainPath = resolve(root, `messages/${locale}.json`);
// 主包是纯生成物:从空对象开始合并全部 fragment(fragments 为唯一源)
const data = {};
const suffix = `.${locale}.json`;
for (const name of readdirSync(fragmentsDir).sort()) {
if (!name.endsWith(suffix)) continue;
const frag = JSON.parse(readFileSync(resolve(fragmentsDir, name), 'utf8'));
deepMerge(data, frag);
console.log(`merged ${name}`);
}
writeFileSync(mainPath, `${JSON.stringify(data, null, 2)}\n`);
}
mergeLocale('zh-CN');
mergeLocale('en');
console.log('fragments merged');