# General Translation Knowledge Base: General Translation 与 i18n-tasks：应该选择哪一个？
URL: https://generaltranslation.com/zh/kb/general-translation-vs-i18n-tasks.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: i18n-tasks 是一个 Ruby gem，用于查找缺失和未使用的 Rails I18n 键、整理区域设置文件，还能借助 Google Translate、DeepL、OpenAI、Yandex 或 watsonx 补全缺失的键。General Translation 则结合你的词汇表、自定义提示词和仪表板审校，翻译完整的区域设置文件。两者分工不同，许多团队完全可以搭配使用。
Category: 工作流工具
Last updated: 2026-10-16
Authors: Kevin Wu, Jackie Chen
Published: 2026-10-16

i18n-tasks 是一款命令行工具，面向使用 i18n gem 的 Ruby 应用 (所有 Rails 应用都在此列) 。它会扫描代码中 `t(".title")` 这类调用，与区域设置文件进行比对，并报告缺失或未使用的键；其 `translate-missing` 命令还能调用机器翻译服务 (需自备密钥) 补全空缺。它擅长检查译文，也能对缺失的键进行机器翻译，但英文内容变更时，它无法让译文随之同步更新。General Translation 则专注于翻译本身：其 CLI 会基于你的英文源内容，结合词汇表和自定义提示词生成全部区域设置文件。因此，这两款工具与其说是竞争关系，不如说是相辅相成。

## i18n-tasks 的优势

* **从代码中查找缺失和未使用的键。** [AST 扫描器会读取 `.rb` 和 `.html.erb` 文件](https://github.com/glebm/i18n-tasks#features--limitations) (HAML 等格式则由正则表达式扫描器处理) ，能够解析 `t(".title")` 这类相对键，并报告两类问题：代码中用到但某个区域设置里缺失的键，以及已存在却从未使用的键。
* **支持复数检查。** 借助 rails-i18n 的复数规则，[`missing` 会报告缺少某个 CLDR 复数形式的区域设置](https://github.com/glebm/i18n-tasks/blob/main/CHANGES.md)，例如波兰语的 `few` 和 `many`。
* **便于集成 CI。** `missing`、`unused` 等检查在发现问题时会以状态码 1 退出；该 gem 还自带 [RSpec 和 Minitest 模板](https://github.com/glebm/i18n-tasks/tree/main/templates)，一旦存在缺失或未使用的键，测试套件就会失败。
* **文件整理。** [`normalize` 可对键排序](https://github.com/glebm/i18n-tasks#normalize) (加上 `-p` 时，还会把键移到配置中指定的文件里) ；`mv` 和 `rm` 可在所有区域设置中重命名或删除键；`find` 可查看某个键的使用位置；`check-consistent-interpolations` 则能揪出在翻译中被改名或漏掉的 `%{count}`。
* **五种翻译后端。** [`translate-missing` 支持 Google Translate、DeepL、Yandex、OpenAI 和 IBM watsonx](https://github.com/glebm/i18n-tasks#translation-backends)。你可以[设置 DeepL 词汇表 ID 和选项](https://github.com/glebm/i18n-tasks/blob/main/templates/config/i18n-tasks.yml)，也可以配置 OpenAI 模型 (默认为 `gpt-4o-mini`) 、系统提示词以及针对各区域设置的提示词。`%{...}` 占位符会在发送前替换为标记，返回后再还原。
* **免费。** 它采用 [MIT 许可证 (版本 1.1.2) ](https://rubygems.org/gems/i18n-tasks)；翻译费用直接支付给各翻译服务商，通常按字符数或词元数计费。

## i18n-tasks 留给你处理的部分

下面以一个小型 Rails 应用为例，运行 `missing` 和 `unused` 的结果如下。该应用包含英语、波兰语和西班牙语文件，其中 inbox 视图调用了一个从未定义的键：

```text title="bundle exec i18n-tasks missing (excerpt)"
| Locale | Key                 | Value in other locales or source  |
|  all   | inbox.show.empty    | app/views/inbox/show.html.erb:3   |
|   es   | inbox.show.title    | en Inbox                          |
|   es   | inbox.show.unread   | en {"one" => "You have %{count} unread message.", ...} |
|   pl   | flash.saved         | en Saved.                         |
|   pl   | inbox.show.unread   | few, many                         |
```

```text title="bundle exec i18n-tasks unused"
| Locale | Key                 | Value    |
|   en   | inbox.show.archived | Archived |
```

这份报告准确且有用，但填补这些缺口的工作仍需由你来完成：

* **Google 后端发送的只是字符串值。** 在一次将该后端网络调用替换为桩的运行中，`translate-missing es` 发送了下面这些值，占位符已被遮蔽，且不附带键、文件或视图信息。

  ```text
  ["Inbox", "You have X__0 unread message.", "You have X__0 unread messages.", "Archived"]
  ```

* **复数形式沿用英语的结构。** 对于一个完全缺失的波兰语键，它只写入了 `one` 和 `other`，下一次 `missing` 运行随即报告缺少 `few, many`。

* **修改后的英语文本不会被重新翻译。** [`translate-missing` 只填充某个区域设置中不存在的键](https://github.com/glebm/i18n-tasks#translate-missing-keys)。编辑英语字符串后，已有译文会保持不变。

* **Google 请求失败时仍可能写入文件。** 在未设置 Google API 密钥的情况下，`translate-missing --backend=google pl` 警告该批次失败，却报告有两个键已翻译，将英语值复制到 `pl.yml` 中，并以 0 退出。这些键随后便不再出现在 `missing` 中；只有 `eq-base` (与源文本相同的译文) 还能显示它们。

## General Translation 的定位

General Translation 负责生成翻译，i18n-tasks 则负责检查 Rails 消息目录。将 `gt` CLI 指向你的英文文件，并在 CI 中运行 [`npx gt translate`](/docs/cli/reference/commands/translate)。它会生成所有目标区域设置的文件；在后续运行中，未更改的条目会复用已有译文，英文内容有变化的条目则会重新翻译。每次运行都会使用项目的[词汇表和自定义提示词](/docs/platform/dashboard/guides/defining-context-for-translations)，确保所有文件中的术语和语气保持一致；你的团队还可以在仪表板中[审阅和编辑译文](/docs/platform/dashboard/guides/reviewing-translations)。

继续使用 i18n-tasks 扫描 Ruby 源代码并校验目录。使用 General Translation 的 Node.js CLI 生成翻译，再按照 [General Translation vs. Rails I18n](/kb/general-translation-vs-rails-i18n) 中的说明，将生成的 YAML 映射为 Rails 以区域设置为根的格式。该工作流适用于源和目标键结构一致的消息目录。

## i18n-tasks 与 General Translation 概览对比

| 功能    | i18n-tasks                        | General Translation                                          |
| ----- | --------------------------------- | ------------------------------------------------------------ |
| 定位    | 扫描 Ruby 代码，检查目录中缺失或未使用的键          | 生成译文，并在源文案变更时保持译文同步更新                                        |
| 复数校验  | 检查区域设置所需的复数类别                     | 生成译文后搭配 i18n-tasks 进行检查                                      |
| 机器翻译  | `translate-missing`，使用你选择的服务商     | [`npx gt translate`](/docs/cli/reference/commands/translate) |
| 翻译上下文 | 取决于后端；DeepL 支持词汇表 ID，OpenAI 支持提示词 | 文件的内容和元数据，以及已分配的词汇表和自定义提示词                                   |
| 英文变更时 | 现有译文保持不变                          | 已变更的条目会被重新翻译                                                 |
| 审阅    | Git 差异                            | 仪表板和 Git 差异                                                  |
| 费用    | 免费 gem；服务商按字符或词元计费                | [按用量计费的翻译](https://generaltranslation.com/pricing)           |

如果区域设置文件由译者编写，而你需要在 CI 中捕获缺失和未使用的键，或者只想为少量字符串快速生成机器翻译草稿，单独使用 i18n-tasks 即可。如果你希望译文随英文变更自动更新，同时保持术语一致并在仪表板中审阅，请使用 General Translation。Rails 源码扫描和目录检查仍可继续交给 i18n-tasks。

## 在 CI 中同时使用两者

沿用 [Rails 集成](/kb/general-translation-vs-rails-i18n)中的英语到西班牙语目录初始化设置。先运行翻译和区域设置映射，再使用 i18n-tasks 验证键的完整性、复数类别和占位符：

```bash
npx gt translate
ruby script/export_rails_locales.rb                     # 为 Rails 导出消息目录
bundle exec i18n-tasks missing                           # 代码中用到的键及复数形式
bundle exec i18n-tasks unused
bundle exec i18n-tasks check-consistent-interpolations   # %{name} 与源文本一致
```

每个 `i18n-tasks` 命令在发现问题时都会以状态码 1 退出，因此在损坏的文件被合并之前，任务就会失败。CLI 需要项目 ID 和 API 密钥，后者需具备 **文件 &gt; 写入** 和 **翻译队列 &gt; 已启用** 权限，二者分别通过 `GT_PROJECT_ID` 和 `GT_API_KEY` 设置。 (参见[配置 CLI](/docs/cli/guides/configuring#credentials)。)

## 要点总结

* i18n-tasks 可检查 Rails 应用中缺失、未使用以及复数形式不完整的键。
* `translate-missing` 只会补全缺失的键；修改英文源文本后，已有的译文不会随之更新。
* General Translation 会结合你的词汇表和自定义提示词翻译整个区域设置文件，并随英文内容的变化保持同步更新；请在同一个 CI 任务中先运行它，再执行 i18n-tasks 检查。

## Related questions

- [General Translation 与 Rails I18n：两者都需要吗？](https://generaltranslation.com/zh/kb/general-translation-vs-rails-i18n.mdx): Rails I18n 负责查找消息并格式化日期和数字。General Translation 负责生成译文，在英文内容变更时让译文保持同步，并为团队提供用于审校的仪表板。两者搭配使用，即可在每次发布时交付已翻译的 Rails 目录。
- [General Translation 与 Mobility：该选哪一个？](https://generaltranslation.com/zh/kb/general-translation-vs-mobility.mdx): Mobility 将翻译后的模型属性存储在您的数据库中。General Translation 则通过其 API，结合您的词汇表和自定义提示词生成这些译文。两者搭配使用，即可在保留现有 Rails 模型的同时，翻译商品列表、文章及其他数据库内容。
- [Google Translate 替代方案：General Translation 与 Google Translate 对比](https://generaltranslation.com/zh/kb/general-translation-vs-google-translate.mdx): Google Translate 适合快速翻译一次性文本，但要以另一种语言发布产品，还需要结合上下文翻译每个字符串、保持术语一致、正确处理变量和复数形式、进行审校，并建立发布流程。General Translation 能理解代码中每个字符串的上下文，将从代码、审校到每一次发布的整个本地化工作流全面自动化。
- [为什么选择 General Translation 而不是 TMS（Smartling、Lokalise、Phrase、Crowdin 或 Transifex）？](https://generaltranslation.com/zh/kb/general-translation-vs-tms.mdx): Smartling、Lokalise、Phrase、Crowdin 或 Transifex 等翻译管理系统（TMS）负责协调译员，但工程师仍需提取字符串、发送出去、等待译文，再把译文接回产品中。General Translation 结合上下文直接翻译代码中的内容，每次发布都同步交付所有语言，并基于开源库运行，不存在供应商锁定。
- [对开发者来说，最好的本地化软件是什么？](https://generaltranslation.com/zh/kb/best-localization-software.mdx): 选择一套能覆盖整条流水线的系统——从代码中的国际化库，到翻译和投递——而不是把独立的库、翻译管理系统和翻译供应商拼凑在一起。

## Previous and next questions

- Previous question: [General Translation 与 GNU gettext：两者都需要吗？](https://generaltranslation.com/zh/kb/general-translation-vs-gettext.mdx)
- Next question: [General Translation 与 i18next、react-intl 和 next-intl 对比：应该选择哪个国际化库？](https://generaltranslation.com/zh/kb/general-translation-vs-i18n-libraries.mdx)

## Sitemap

See the [Knowledge Base sitemap](https://generaltranslation.com/zh/kb/sitemap.md) for every article.
