NX Monorepo中ngx-translate翻译文件拆分与合并方案咨询
实现方案
1. 编写Node.js合并脚本
创建通用合并脚本,按语言聚合指定应用及关联库的翻译文件,输出到应用的assets/i18n目录。
在项目根目录下创建tools/scripts/merge-i18n.js,代码如下:
const fs = require('fs').promises; const path = require('path'); const { glob } = require('glob'); // 配置:每个应用对应的关联库列表 const APP_LIB_MAP = { 'app1': ['lib1', 'lib2'], 'app2': ['lib3', 'lib1'], 'app3': ['lib2', 'lib3'] }; async function mergeI18n(appName) { const libs = APP_LIB_MAP[appName] || []; const targetDir = path.join(__dirname, '../../apps', appName, 'assets/i18n'); // 确保目标目录存在 await fs.mkdir(targetDir, { recursive: true }); // 获取所有涉及的语言文件路径 const patterns = [ path.join(__dirname, '../../apps', appName, 'i18n/*.json'), ...libs.map(lib => path.join(__dirname, '../../libs', lib, 'i18n/*.json')) ]; const files = await glob(patterns); // 按语言分组合并,应用翻译优先级高于库翻译 const langMap = {}; for (const file of files) { const lang = path.basename(file, '.json'); const content = JSON.parse(await fs.readFile(file, 'utf8')); langMap[lang] = { ...langMap[lang], ...content }; } // 写入合并后的文件 for (const [lang, translations] of Object.entries(langMap)) { await fs.writeFile( path.join(targetDir, `${lang}.json`), JSON.stringify(translations, null, 2), 'utf8' ); console.log(`✅ 已合并 ${lang} 翻译文件到 ${appName}/assets/i18n`); } } // 从命令行参数获取应用名称 const appName = process.argv[2]; if (!appName) { console.error('❌ 请指定应用名称,例如:node tools/scripts/merge-i18n.js app1'); process.exit(1); } mergeI18n(appName).catch(err => { console.error('❌ 合并翻译文件失败:', err); process.exit(1); });
执行npm install glob --save-dev安装依赖。
2. 集成到NX构建/开发流程
修改每个应用的project.json,将合并脚本绑定到构建和开发命令的前置步骤:
配置构建命令
在apps/[app-name]/project.json的targets.build中添加依赖:
{ "targets": { "build": { "dependsOn": ["merge-i18n"], // 原有build配置... }, "merge-i18n": { "executor": "nx:run-commands", "options": { "command": "node tools/scripts/merge-i18n.js [app-name]" } } } }
配置开发服务
在targets.serve中添加依赖,确保启动服务时先执行合并:
{ "targets": { "serve": { "dependsOn": ["merge-i18n"], // 原有serve配置... } } }
3. 实现文件监听自动更新
创建监听脚本,实时检测翻译文件变化并自动重新合并:
创建tools/scripts/watch-i18n.js:
const chokidar = require('chokidar'); const { spawn } = require('child_process'); const appName = process.argv[2]; if (!appName) { console.error('❌ 请指定应用名称,例如:node tools/scripts/watch-i18n.js app1'); process.exit(1); } // 监听目标路径 const watchPaths = [ `apps/${appName}/i18n/*.json`, `libs/**/i18n/*.json` ]; console.log(`🔍 开始监听 ${appName} 相关翻译文件变化...`); chokidar.watch(watchPaths, { ignoreInitial: true }).on('all', () => { console.log('📝 检测到翻译文件变化,重新合并...'); const child = spawn('node', ['tools/scripts/merge-i18n.js', appName]); child.stdout.pipe(process.stdout); child.stderr.pipe(process.stderr); });
执行npm install chokidar --save-dev安装依赖。
修改project.json的serve目标,让监听进程后台运行:
{ "targets": { "serve": { "dependsOn": ["merge-i18n", "watch-i18n"], // 原有serve配置... }, "watch-i18n": { "executor": "nx:run-commands", "options": { "command": "node tools/scripts/watch-i18n.js [app-name]", "background": true } } } }
验证
- 执行
nx build [app-name]:构建前自动合并翻译文件到assets/i18n - 执行
nx serve [app-name]:启动服务时完成初始合并,后续修改任意i18n/*.json文件会自动重新合并
内容的提问来源于stack exchange,提问作者pop
相关产品推荐
相关产品推荐

