1. 项目概述:用AI自动化你的国际化翻译工作流

如果你正在开发一个需要支持多语言的Web应用、Chrome扩展或者任何Node.js项目,那么对“国际化”(i18n)这个词一定不会陌生。手动维护多份语言文件,或者依赖传统的翻译服务,不仅流程繁琐、成本高昂,而且在面对快速迭代的产品需求时,翻译更新往往成为拖慢进度的瓶颈。今天要聊的Transmart,正是为了解决这个痛点而生。

Transmart是一个开源开发者工具,它的核心思路非常直接:利用ChatGPT(OpenAI API)的能力,自动化完成从一种基础语言到多种目标语言的翻译工作。你只需要提供一份基准语言(比如英文)的JSON文件,并指定需要翻译成的语言列表,运行一条命令,它就能自动为你生成所有对应的国际化语言文件。这听起来像是魔法,但背后是一套设计精巧的工程实现。它由CLI(命令行工具)和Core(核心库)两部分组成,对于绝大多数开发者来说,我们直接使用封装好的CLI工具就足够了。

我最初接触这个项目,是因为手头一个需要快速支持中、英、日、法四国语言的SaaS后台项目。传统方式下,要么需要协调多个翻译人员,要么使用付费的翻译API并自己处理文件合并,流程非常割裂。Transmart将“翻译”这个动作直接集成到了开发工作流中,变成了一个像 npm run build 一样的常规步骤,这极大地提升了效率,也保证了翻译上下文的一致性。

2. 核心设计思路与方案选型解析

2.1 为什么选择AI驱动而非传统API?

在i18n自动化领域,方案其实不少。有基于Google Translate、DeepL等成熟翻译API的脚本,也有像 i18next-parser 这样专注于提取源代码中待翻译词条的工具。Transmart选择基于OpenAI的ChatGPT模型,我认为主要基于以下几点考量:

首先是上下文理解能力 。传统的机器翻译API通常是“词对词”或“句对句”的翻译,它们很难理解一个词条在特定应用场景下的确切含义。例如,一个单词“Submit”,在表单按钮上是“提交”,在文章标题里可能是“呈递”,在数据库操作中又可能是“提交事务”。ChatGPT凭借其强大的上下文学习和指令跟随能力,可以通过我们提供的“上下文”( context 配置项)来做出更准确的判断,翻译结果更接近人类译员的水平。

其次是处理非结构化与复杂JSON的能力 。国际化语言文件通常是嵌套的JSON结构,键(key)是开发标识,值(value)才是需要翻译的文本。Transmart需要智能地识别并只翻译“值”部分,同时保持JSON结构完全不变。ChatGPT在理解并处理这种结构化数据方面表现优异,能够可靠地输出格式正确的JSON。

最后是灵活性与成本平衡 。虽然OpenAI API有调用成本,但对于开发阶段和中小型项目而言,其按token计费的模式远比雇佣专业翻译或使用某些按字符数高价收费的商业API要灵活和经济。特别是它支持流式、分批处理大文件,避免了单次请求的token限制问题,使得一次性翻译整个项目的语言包成为可能。

2.2 架构拆解:CLI与Core的分层设计

Transmart采用了清晰的分层架构,这体现了良好的工程实践。

  • Core ( @transmart/core ) :这是项目的“发动机”。它包含了所有核心逻辑:读取配置文件、加载和解析基准语言文件、与OpenAI API通信、处理翻译请求、拆分大文件以适配模型上下文窗口、合并结果、处理覆盖项( overrides )以及最终写入目标语言文件。Core被设计为一个纯Node.js库,理论上可以被任何Node.js环境集成。
  • CLI ( @transmart/cli ) :这是面向开发者的“方向盘”。它封装了Core,提供了一个简单的命令行接口。我们通过 npx @transmart/cli 或配置npm script来调用它。CLI负责处理命令行参数、寻找用户项目中的配置文件( transmart.config.js 等)、并以更友好的方式报告进度和错误。

这种设计的好处是职责分离。Core专注于业务逻辑,保持稳定;CLI专注于用户体验和交互。未来如果社区需要,可以基于Core轻松开发出VS Code插件、Web界面或其他构建工具的集成。

2.3 支持的生态与未来路线图

Transmart目前对主流i18n库的支持度是其一大亮点。它原生支持:

  • i18next :这是React和通用JavaScript生态中最流行的i18n框架之一。Transmart生成的JSON文件结构完全兼容i18next的命名空间(namespace)约定。
  • Chrome Extensions i18n :专门为Chrome扩展的 _locales 目录结构做了适配,这对于浏览器插件开发者来说是个福音。
  • 通用JSON结构 :即使你不使用上述框架,任何遵循 {namespace: {key: value}} 结构的JSON文件都能被很好地处理。

从它的路线图来看,团队正在积极扩展其生态位,计划支持 vue-i18n (Vue.js生态)、iOS的 .strings 文件和Android的 strings.xml 文件。这意味着Transmart的愿景是成为一个跨平台、跨框架的通用i18n自动化解决方案。选择现在切入,你可以随着项目的发展一起享受到这些未来特性。

3. 从零开始:详细配置与实操指南

3.1 环境准备与安装

首先,确保你的Node.js版本在13或以上。我推荐使用Node 16 LTS或18 LTS,以获得最好的兼容性和性能。

安装非常简单,和大多数前端工具一样,作为开发依赖( devDependencies )安装:

# 使用 npm
npm install @transmart/cli --save-dev

# 使用 yarn
yarn add @transmart/cli --dev

# 使用 pnpm
pnpm add @transmart/cli -D

安装完成后,你可以在 node_modules/.bin/ 目录下找到 transmart 可执行文件,或者通过 npx 直接调用。

3.2 配置文件深度解析 ( transmart.config.js )

配置文件是Transmart的核心。在项目根目录创建一个 transmart.config.js 文件(也支持 .transmartrc package.json 中的 transmart 字段等,基于cosmiconfig)。下面我们逐项拆解每个配置的含义和最佳实践。

// transmart.config.js
module.exports = {
  // 1. 基准语言
  baseLocale: 'en',
  // 2. 目标语言列表
  locales: ['zh-CN', 'ja', 'fr', 'de'],
  // 3. 语言文件存放路径
  localePath: './public/locales',
  // 4. OpenAI API 密钥 (安全警告:切勿提交至仓库!)
  openAIApiKey: process.env.OPENAI_API_KEY, // 强烈推荐从环境变量读取
  // 5. 翻译上下文(可选但强烈推荐)
  context: '这是一个React后台管理系统,包含用户管理、数据仪表盘和系统设置等功能。UI界面中的文本需要简洁、专业。',
  // 6. 覆盖AI翻译结果(手动修正)
  overrides: {
    'zh-CN': {
      'common': {
        'create_app': '创建应用',
        'dashboard': '控制台'
      },
      'validation': {
        'email_invalid': '邮箱格式不正确'
      }
    }
  },
  // 7. 指定处理的命名空间文件(可选)
  namespaceGlob: './public/locales/en/*.json',
  // 8. 自定义OpenAI模型(可选)
  openAIApiModel: 'gpt-4',
  // 9. 单文件模式(适用于简单项目)
  // singleFileMode: false
};

关键配置项详解与避坑指南:

  1. baseLocale locales

    • baseLocale 必须是你的源语言文件存在的语言代码,且 localePath 下必须有对应的文件夹(如 /en )或文件。
    • locales 中的语言代码需符合 BCP 47 标准,如 zh-CN (简体中文)、 zh-TW (繁体中文)、 ja (日语)、 de-DE (德语)。Transmart会利用 Intl.DisplayNames 来验证和格式化这些代码。
  2. localePath 与目录结构

    • Transmart默认期望一种常见的多文件结构: <localePath>/<locale>/<namespace>.json
    • 例如,以上配置会期望存在 ./public/locales/en/common.json 作为基准文件。运行后,它会生成 ./public/locales/zh-CN/common.json ./public/locales/ja/common.json 等。
    • 确保你的基准语言文件已经就位,并且结构正确。
  3. openAIApiKey - 安全第一!

    • 绝对不要 将真实的API密钥硬编码在配置文件中并提交到Git仓库。这会导致密钥泄露,产生巨额费用。
    • 正确做法 :使用环境变量。在配置文件中通过 process.env.OPENAI_API_KEY 读取。然后在运行命令前设置环境变量。
      • Linux/macOS: OPENAI_API_KEY=sk-xxx npm run translate
      • 或者使用 .env 文件配合 dotenv 等工具。
    • 在CI/CD环境中,请在流水线配置中设置机密环境变量。
  4. context - 提升翻译质量的秘诀

    • 这个选项被很多人忽略,但它至关重要。提供一段关于你项目类型、领域、目标用户和语言风格的描述。
    • 好的 context 能让AI理解术语。例如,对于金融科技应用,可以写:“这是一个投资理财App,涉及‘资产’、‘持仓’、‘收益率’、‘风险等级’等专业术语,翻译需准确、正式。”
    • 对于游戏,可以写:“这是一个奇幻角色扮演游戏,文本风格需要生动、富有想象力,符合游戏世界观。”
  5. overrides - 人工校准的入口

    • AI翻译并非完美,尤其是对于品牌名、特定缩写或具有双重含义的词汇。 overrides 选项允许你指定任何语言、任何命名空间下的任何键,用你认为正确的翻译覆盖AI的结果。
    • 格式是: {‘locale’: {‘namespace’: {‘key’: ‘correct-value’}}} 。你可以先运行一次翻译,检查结果,然后将需要修正的条目添加到 overrides 中,下次运行时会自动应用。

3.3 首次运行与工作流集成

配置好后,你可以通过 npx 直接运行:

npx transmart

但更推荐的做法是将其集成到你的项目脚本中,在 package.json 里添加:

{
  "scripts": {
    "translate": "transmart",
    "dev": "next dev",
    "build": "next build && npm run translate" // 构建后自动翻译
  }
}

然后使用 npm run translate yarn translate

首次运行时,Transmart会:

  1. 读取配置,验证 localePath 和基准文件。
  2. 开始按命名空间处理基准语言(如 en )下的每个JSON文件。
  3. 对于每个文件,它会将内容发送给OpenAI API,请求翻译成所有目标语言。
  4. 将返回的翻译结果写入对应的目标语言目录和文件中。
  5. 如果目标文件已存在, 默认行为是合并 (新增或修改键),而不会删除原有文件中AI未处理的键。这是一个安全的设计。

注意 :翻译过程需要调用外部API,耗时取决于文件大小和语言数量。对于大型语言包,可能需要几分钟。请保持网络通畅。

4. 高级用法与性能调优

4.1 处理大文件与Token限制

OpenAI模型有上下文窗口(Context Window)限制,例如 gpt-3.5-turbo 通常是4096个token。一个token大约相当于0.75个英文单词。如果你的一个 namespace.json 文件非常大,直接发送可能会超限。

Transmart的核心优势之一就是内置了“大文件处理”机制。它会:

  1. 自动估算Token数 :根据基准文件内容计算所需的大致token数量(包含你的 context 和系统指令)。
  2. 智能分块 :如果估算值超过你设定的 modelContextLimit (默认4096),它会将JSON文件按层级智能地拆分成多个更小的、逻辑上独立的翻译任务。
  3. 并发请求与重组 :并发执行这些小块翻译(注意受限于API速率限制),最后将所有结果精准地合并回原始的JSON结构。

你通常不需要手动干预这个过程。但如果你使用更大的模型(如 gpt-4-32k ,上下文窗口为32768),可以通过设置 modelContextLimit: 32768 来告诉Transmart,从而减少分块,可能提升效率。

4.2 自定义提示词与系统指令

对于高级用户,Transmart提供了 systemPromptTemplate 选项,允许你完全自定义发送给ChatGPT的“系统指令”。这让你能更精细地控制翻译风格。

// transmart.config.js
module.exports = {
  // ... 其他配置
  systemPromptTemplate: (baseLocale, locale, context, count) => {
    return `你是一位专业的本地化翻译专家。请将以下JSON对象中的值从${baseLocale}翻译成${locale}。保持所有键(key)不变,只翻译字符串值(value)。${context ? `上下文信息:${context}` : ''} 翻译要求:用语专业、简洁,符合技术文档风格。直接返回完整的JSON对象,不要任何额外解释。`;
  }
};

通过自定义模板,你可以要求AI使用特定的语气(如友好、严肃)、遵循特定的术语表,或者处理一些特殊格式(如包含变量的 {{placeholder}} )。

4.3 使用代理或自托管模型

如果你的网络环境需要,或者你想使用其他兼容OpenAI API格式的模型(如本地部署的Llama、ChatGLM等),可以通过 openAIApiUrl openAIApiUrlPath 配置项来指定API端点。

// 使用第三方代理或中转服务
module.exports = {
  // ... 其他配置
  openAIApiUrl: 'https://your-proxy.com',
  openAIApiUrlPath: '/v1/chat/completions'
};

// 使用本地部署的模型(例如使用 llama.cpp 的 server)
module.exports = {
  // ... 其他配置
  openAIApiUrl: 'http://localhost:8080',
  openAIApiModel: 'gpt-3.5-turbo', // 模型名称需与你的服务匹配
  additionalReqBodyParams: {
    temperature: 0.1, // 更低的温度,输出更确定
    top_p: 0.9,
    // 其他你的服务支持的参数
  }
};

additionalReqBodyParams 选项非常强大,它允许你将任意参数传递给API请求体,这对于调优自托管模型的行为至关重要。

5. 实战案例与常见问题排查

5.1 案例一:为Next.js应用添加多语言支持

假设你有一个使用 next-i18next 的Next.js项目,结构如下:

public/
  locales/
    en/
      common.json
      footer.json
    zh-CN/ (目前为空或不全)

你的 transmart.config.js 配置如下:

module.exports = {
  baseLocale: 'en',
  locales: ['zh-CN', 'es', 'ko'],
  localePath: './public/locales',
  openAIApiKey: process.env.OPENAI_API_KEY,
  context: '这是一个现代企业官网,提供云服务解决方案。语言风格需专业、清晰、有说服力。',
  namespaceGlob: './public/locales/en/*.json' // 明确指定源文件位置
};

运行 npm run translate 后, zh-CN es ko 目录下会自动生成与 en 目录结构完全一致的 common.json footer.json 文件,内容已完成翻译。

5.2 案例二:翻译Chrome扩展的 _locales 文件

Chrome扩展的i18n文件结构是固定的: _locales/<locale>/messages.json 。Transmart对此有特殊支持。

假设你的项目结构是:

extension/
  _locales/
    en/
      messages.json
    zh_CN/ (待生成)

你需要调整配置,让 localePath 指向 _locales 的父目录,并注意语言代码的格式(Chrome使用 zh_CN 而非 zh-CN ):

module.exports = {
  baseLocale: 'en',
  locales: ['zh_CN', 'ja'], // Chrome扩展使用下划线
  localePath: './extension/_locales', // 指向 _locales 的父目录
  openAIApiKey: process.env.OPENAI_API_KEY,
  singleFileMode: true // Chrome扩展每个语言只有一个messages.json文件
};

设置 singleFileMode: true 后,Transmart会认为每个语言目录下只有一个文件( messages.json ),并忽略命名空间的概念。

5.3 常见问题与解决方案速查表

在实际使用中,你可能会遇到以下问题。这里是我总结的排查清单:

问题现象 可能原因 解决方案
运行命令后无任何输出或立即退出 1. 配置文件未找到或格式错误。
2. baseLocale 对应的源文件目录不存在。
1. 检查 transmart.config.js 是否存在且语法正确。
2. 确认 localePath/<baseLocale>/ 目录存在且包含JSON文件。
报错 Error: Failed to load config 配置文件模块导出错误或包含未定义的变量。 检查配置文件,确保 module.exports 正确,且如果使用环境变量,已通过 dotenv 等方式加载。
报错 Error: OpenAI API Error: ... 1. API密钥无效或过期。
2. 网络问题或API服务不可用。
3. 账户余额不足。
1. 在OpenAI平台检查API密钥有效性。
2. 检查网络连接,尝试使用代理配置( openAIApiUrl )。
3. 登录OpenAI查看账户额度。
生成的JSON文件格式错误或键丢失 1. AI返回的内容不是纯JSON。
2. 源文件JSON格式有误(如尾随逗号)。
3. 分块翻译后合并出错。
1. 尝试增强 context 或自定义 systemPromptTemplate ,明确要求“只返回JSON”。
2. 使用JSON验证工具检查你的源文件。
3. 这是一个罕见bug,可尝试简化源文件内容或到项目GitHub提交issue。
翻译结果不符合预期(太生硬、术语错误) context 描述不足或不准。 context 中提供更详细的项目背景、领域术语和目标用户描述。对于关键术语,使用 overrides 进行手动校正。
翻译速度很慢 1. 文件很大,分块过多。
2. OpenAI API响应慢或达到速率限制。
1. 考虑是否可以将大命名空间拆分成多个小文件。
2. 这是正常现象,大型翻译任务需要耐心等待。API有每分钟请求数(RPM)和令牌数(TPM)限制,Transmart内部会做简单排队,但无法绕过平台限制。
如何仅翻译新增或修改的键? Transmart默认是合并模式,已存在的目标文件键不会被删除。 如果你希望“增量翻译”,这本身就是默认行为。Transmart会读取现有的目标文件,只翻译基准文件中有而目标文件中没有的键,或基准文件中值已更新的键。

5.4 我的实操心得与建议

  1. 迭代式翻译,而非一次性完成 :不要试图在项目初期就准备好所有语言的完美翻译。先完成核心功能的基准语言(如英文)文案,然后用Transmart生成初版翻译。在后续的UI测试和用户反馈中,通过 overrides 配置项不断修正和优化翻译结果。将 overrides 部分视为你的“翻译记忆库”,它会越来越完善。

  2. 善用 context ,它是你的“产品经理” :花时间认真编写 context 。把它想象成你在向一位新入职的翻译人员介绍你的产品。产品类型、目标用户、品牌调性、关键术语都需要交代清楚。一个好的 context 能减少70%以上的后期修正工作。

  3. 版本控制策略 :建议将基准语言文件(如 en/ )和 transmart.config.js (不含API密钥)纳入版本控制。对于AI生成的目标语言文件,你可以选择是否提交。我的做法是提交,因为这样保证了所有开发者环境的一致性。但需要在 .gitignore 中确保忽略包含API密钥的环境变量文件(如 .env.local )。

  4. 在CI/CD中运行 :你可以在CI流水线(如GitHub Actions)中设置一个定时任务或在与 main 分支合并时触发自动翻译。这样能确保你的国际化文件始终与最新的源语言文案同步。记得将 OPENAI_API_KEY 设置为仓库的Secret。

  5. 成本监控 :OpenAI API调用有成本。虽然翻译文本的成本相对较低( gpt-3.5-turbo 每百万tokens输入约0.5美元,输出约1.5美元),但对于超大型项目或频繁运行,仍需关注。你可以在OpenAI后台设置用量限制和监控。Transmart本身是离线的,只有调用API时才产生费用。

Transmart将AI能力无缝地编织到了开发者的本地化工作流中,它解决的不是“翻译”这个点的问题,而是“国际化同步”这个面的效率问题。经过几个项目的实践,我发现它最大的价值在于消除了开发过程中等待翻译的“空窗期”,让前端和国际化可以近乎同步进行。当然,它不能完全替代专业的人工校对,尤其是对于营销文案或文化敏感内容。但在工程效率上,它无疑是一个强大的加速器。如果你正在为多语言项目的维护而头疼,不妨花十分钟配置一下,体验一下AI自动化带来的流畅感。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐