如何将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, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/'/g, '''); 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格式:
- 先将你的自定义JSON调整为formatjs标准的消息格式
- 用formatjs官方CLI工具导出为XLiff格式文件
- 用OmegaT等开源CAT工具将XLiff文件导出为TMX格式
注意事项
- TMX存储时无需对ICU的大括号、plural等语法做额外处理,仅需做好基础XML转义即可
- 如果需要将生成的TMX交付给翻译供应商,可提前告知对方文件内包含ICU语法,避免CAT工具默认关闭ICU支持导致格式识别错误
内容的提问来源于stack exchange,提问作者paul
相关产品推荐
相关产品推荐

