You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:20:32