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

如何将ICU格式字符串转换为TMX(翻译记忆交换)文件

解决方案

方案1:自行编写脚本转换(成本最低、可控性最高)

你已经将所有多语言内容规整为结构化JSON,直接按TMX的标准XML格式生成即可,TMX本身支持存储带ICU语法的原始翻译单元,无需修改ICU内容,只要做好基础XML转义就不会出现格式错误。
核心TMX结构逻辑如下:

  • 根节点<tmx>指定版本为1.4b
  • <header>节点填写源语言、创建工具等元数据
  • <body>节点下每一个<tu>对应你JSON里的一个字符串ID,每个<tu>下对应多个<tuv>节点,分别标注不同语言,<seg>节点内放对应语言的ICU字符串即可。

可直接运行的Node.js示例脚本如下:

const fs = require('fs');
// 替换为你的多语言JSON文件路径
const langData = require('./lang-data.json');

const tmxHeader = `<?xml version="1.0" encoding="UTF-8"?>
<tmx version="1.4b">
  <header creationtool="custom-script" creationtoolversion="1.0" segtype="sentence" adminlang="en" srclang="en" datatype="plaintext"/>
  <body>
`;
const tmxFooter = `  </body>
</tmx>`;

let tuContent = '';
Object.keys(langData).forEach(id => {
  tuContent += `    <tu tuid="${id}">\n`;
  const langObj = langData[id];
  Object.keys(langObj).forEach(lang => {
    // 仅做XML必要转义,ICU语法完全保留
    const escapedSeg = langObj[lang]
      .replace(/&/g, '&amp;')
      .replace(/</g, '&lt;')
      .replace(/>/g, '&gt;')
      .replace(/"/g, '&quot;')
      .replace(/'/g, '&apos;');
    tuContent += `      <tuv xml:lang="${lang}">\n        <seg>${escapedSeg}</seg>\n      </tuv>\n`;
  })
  tuContent += `    </tu>\n`;
});

fs.writeFileSync('./output.tmx', tmxHeader + tuContent + tmxFooter, 'utf8');

生成的TMX可以被所有支持ICU语法的主流CAT工具正常识别。

方案2:借助现有工具链转换

如果你不想自行开发脚本,可通过以下步骤完成转换,同样可以完整保留ICU格式:

  1. 先将你的自定义JSON调整为formatjs标准的消息格式
  2. 用formatjs官方CLI工具导出为XLiff格式文件
  3. 用OmegaT等开源CAT工具将XLiff文件导出为TMX格式

注意事项

  • TMX存储时无需对ICU的大括号、plural等语法做额外处理,仅需做好基础XML转义即可
  • 如果需要将生成的TMX交付给翻译供应商,可提前告知对方文件内包含ICU语法,避免CAT工具默认关闭ICU支持导致格式识别错误

内容的提问来源于stack exchange,提问作者paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:06:02