Files
OpenFlare/frontend/scripts/merge-i18n-fragments.mjs
T
ryan 5a8722ff07 feat(frontend): 控制台 next-intl 中英双语
接入无 URL 前缀的 zh-CN/en,顶栏与外观设置可切换语言;选择写入 cookie 后刷新生效。
2026-08-16 16:49:16 +08:00

44 lines
1.2 KiB
JavaScript

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`);
const data = JSON.parse(readFileSync(mainPath, 'utf8'));
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');