mcpField
S
shipi18n

shipi18n

本地服务
shipi18n.com开发工具02 周前更新

关于 shipi18n

Shipi18n 是面向开发者和团队的本地化文件离线校验工具,可在 CI 或编辑器中检查翻译。无需 API 密钥即可发现结构问题,也可使用自备密钥进行可选的 LLM 语义检查。

主要功能

  1. 01校验键与占位符
  2. 02检查复数形式和 ICU 语法
  3. 03支持常见本地化文件格式
  4. 04生成 SARIF 和 JUnit 报告
  5. 05可选 LLM 语义审查

适用场景

  1. 01在 CI 中发现翻译问题
  2. 02通过 MCP 客户端检查本地化文件
  3. 03使用服务商密钥检查翻译含义

MCP 相关

@shipi18n/mcp 服务向 MCP 客户端提供检查、比较和审查本地化文件的工具。校验无需 API 密钥。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"shipi18n-shipi18n": {
"command": "npx",
"args": [
"-y",
"@shipi18n/mcp"
],
"env": {
"ANTHROPIC_API_KEY": "<ANTHROPIC_API_KEY>",
"OPENAI_API_KEY": "<OPENAI_API_KEY>"
}
}
}
}
启动命令npx -y @shipi18n/mcp
需要配置的环境变量
ANTHROPIC_API_KEY密钥Optional — used only by the translate tools; all validator tools run with no API key
OPENAI_API_KEY密钥Optional — alternative provider key for the translate tools

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@shipi18n/mcp2.3.2

工具

8

收录的工具列表 · 更新于 3 周前

参数类型必填说明
pathstring是本地化文件夹或文件的路径:JSON(扁平或嵌套,i18next/vue-i18n/next-intl)、YAML(含 Rails config/locales)、Flutter .arb 文件夹、Apple .xcstrings 文件、Android res/ 文件夹、gettext .po/.pot 或 XLIFF .xlf 文件
sourcestring否源语言代码
ignoreKeysstring否以逗号分隔的 '*' 键通配模式,用于忽略指定键
glossaryPathstring否词汇表 JSON 文件的路径

详细介绍

Shipi18n

CI npm MCP downloads License OpenSSF Scorecard Smithery

在发布前捕获有问题的翻译。 Shipi18n 是一款用于检查区域设置文件的开源工具:当人工、TMS 或 AI Agent 提供的翻译遗漏或破坏占位符、复数形式或键时,它会让 CI 失败,并指出确切的修复方法。

  • 检测内容: 遗漏或重命名的占位符({name}、{{count}}、%{name}、%s、%1$s、%@);分隔符丢失或缺少该语言所需形式的复数(波兰语的 few/many、阿拉伯语的 two,适用于 ICU、i18next 键、Rails、Android 和 .xcstrings);无效的 ICU MessageFormat;缺失和孤立的键;同一个 JSON 对象中重复书写的键;空字符串和未翻译字符串。
  • 支持格式: JSON(i18next、vue-i18n、next-intl,扁平或嵌套)、YAML(包括 Rails)、Flutter ARB、Apple .xcstrings、Android strings.xml、gettext .po、XLIFF。
  • 会上传任何内容吗? 不会。检查在离线环境下运行,可以在你的机器或 CI 运行器上执行。
  • 需要密钥或账户吗? 不需要。只有可选的 --semantic 审查和 translate 功能会使用你自己的大模型密钥。
npx @shipi18n/cli check ./locales -s en

退出码 0 表示干净无问题,1 表示发现问题(每项都附带一行 fix),2 表示用法错误。输出格式包括文本、JSON、SARIF(GitHub PR 注释)或 JUnit。

shipi18n 检查发现遗漏的占位符,随后由大模型捕捉到一条译文写着“将保存”,而英文原文写的是“删除”

实际运行,并非样例 — docs/check-demo.tape 可重现此过程。

选择你的任务
我想要……使用
在本地或任何 CI 中检查区域设置文件npx @shipi18n/cli check ./locales -s en
为 GitHub 拉取请求添加注释Shipi18n/shipi18n-github-action@v3 (设置)
不使用 Node 运行Docker ghcr.io/shipi18n/cli,或 pre-commit 钩子
不使用 npm 运行从 GitHub releases 获取单文件 shipi18n.mjs,附带 SHA-256 和构建来源证明
在 Python、Ruby、Go 或 Java 项目中使用通过 Docker、pre-commit 或单文件使用同一个 CLI。没有可导入的 Python 或 Ruby 包
让我的 AI 编码 Agent 检查自己的翻译npx @shipi18n/cli init --agents,或使用 MCP 服务 @shipi18n/mcp
检查含义,而不只是结构使用你自己的 Anthropic 或 OpenAI 密钥运行 check --semantic
翻译(可选)使用你自己的密钥运行 shipi18n translate
它不做什么
  • 它不是托管服务或 TMS:没有账户、控制面板或定价。(早期的托管翻译 API 已停止服务。)
  • 它不是可从 Python 或 Ruby 导入的库;它是可在任何 CI 中运行的 CLI。
  • 不使用 --semantic 时,它检查的是结构,而不是译文读起来是否通顺。

真实项目中的发现。 在真实项目中运行同一条命令——Hoppscotch 当时的南非语区域设置(仅检查结构;关闭缺失键提示,让占位符问题更醒目):

$ npx @shipi18n/cli check packages/hoppscotch-common/locales -s en \
    --severity 'missing-key=off,untranslated=off,orphan-key=off'

✗ af  coverage 100.0%  7 error(s), 5 warning(s)
    error  import.file_size_limit_exceeded_warning_multiple_files  placeholder-missing — dropped {sizeLimit}
    error  import.file_size_limit_exceeded_warning_single_file  placeholder-missing — dropped {sizeLimit}
    error  state.connected_to  placeholder-missing — dropped {name}
    warning  state.connected_to  placeholder-added — unexpected {naam}
    error  team.invited_to_team  placeholder-missing — dropped {workspace}
    warning  team.invited_to_team  placeholder-added — unexpected {team}
    …

{naam} 是 {name} 的译文;vue-i18n 永远不会替换它。我们扫描公开仓库,逐条对照源语言手动核实每项发现,并向上游提交修复。持续统计,每个仓库一行: shipi18n.com/oss — 已扫描 95 个仓库 · 23 个仓库存在已核实的损坏字符串 · 已手动核实 402 个字符串 · 已在 8 个仓库中向上游提交修复。

仓库发生了什么
Soliduspt-BR 中有 13 处 %{…} 插值被删掉——PR 当天合并,获三位核心成员批准
Plane捷克语提示消息丢失了 {templateName}/{templateType}——PR 在 3 小时内合并
nocodb我们提交的问题 → 维护者提交 PR,修复全部 39 个区域设置;之后又发现13 个区域设置中的 182 处复数形式,其 | 被机器翻译转换成了 <unk>,并在当天修复
Excalidraw我们提交的问题 → 贡献者修复问题并添加占位符一致性测试套件
Hoppscotch上面的 af 运行结果——PR 已合并,共 7 个字符串
24pullrequests在两个 PR 中修复了 20 处被删掉的插值,随后在其自己的测试套件中添加了插值检查
devise_invitable修复了 %{email) 拼写错误,随后将检查添加到其 CI 中

扫描暴露出的每个我们自有检查器的误报,都会先成为 evals/placeholders/corpus.jsonl 中的测试样例。

如果这项检查在你的项目中发现了问题,不妨给仓库点个星——有星标,遇到损坏的 es.json 的下一个人才能找到它。

接下来,当你想检查含义时,请自备密钥。除了 CLI,评审器还需要一个提供商 SDK:

npm i -D @shipi18n/cli @anthropic-ai/sdk       # or `openai`
export ANTHROPIC_API_KEY=sk-ant-...            # or OPENAI_API_KEY
npx @shipi18n/cli check ./locales -s en --semantic

大模型会读取每一对文本,并报告误译、遗漏和增译:

⚠ es  coverage 100.0%  0 error(s), 1 warning(s)
    warning  delete  semantic-mistranslation — Translation says 'will save' (guardará)
                     instead of 'will delete' (eliminará/borrará)

每个占位符都完好无损,每个键也都存在,因此这个文件通过了结构检查。只有阅读内容才能发现这个错误。默认情况下仅提供建议——它会发出警告,不会导致构建失败。

有实测数据,而非空口断言。 在编写评审器之前提交的 228 对语料上(60d699b),并且预先固定了阈值: 54/54 个植入错误均被发现(100%),168 对无误译文本中有 12 对误报(7.1%),并发现了 6/6 处术语表违规。在两次独立运行中复现(2026-08-16 和 2026-08-17),使用 claude-haiku-4-5,运行 3 轮,约消耗 59k 个 token,耗时 156s。标签准确率在两次运行间有所波动(100% → 98.1%)——它是一个模型,因此请将这些结果视为一个范围,而非固定值。 测试框架位于 evals/semantic/。你可以用自己的模型运行测试。

所有请求都不会经过我们的服务器,因为我们没有服务器。唯一的网络请求是从你的机器发送到你选择的提供商。

软件包

软件包描述
@shipi18n/core引擎:翻译检查、语义评审、占位符验证,以及与提供商无关、保留结构的增量翻译。
@shipi18n/cli在 CI 中运行 shipi18n check ./locales,用 --semantic 检查含义,用 lock 保护手动编辑,需要时用 translate。
@shipi18n/mcpMCP 服务——在 Claude Desktop、Cursor 或任何 MCP 客户端中检查、比较和审阅语言区域文件。验证无需 API 密钥。
vite-plugin-shipi18nVite 插件,使用你自己的大模型密钥在构建时翻译语言区域文件,并提供缓存。
shipi18n-github-action在每个 PR 中检查语言区域文件(无需密钥,提供 SARIF 注释);也可选用自带密钥重新翻译。

为什么

生成翻译的问题已经解决。有不少优秀工具可以填充语言区域文件,Agent 也能免费完成这件事。但没有任何工具会检查结果。 你的 CI 会检查 JavaScript 代码、进行类型检查并运行测试,最后却发布一个没人审阅、由未经审核的模型生成的 de.json。

现有检查大多只关注结构:比较键集合,然后就此打住。这样能发现缺失的键,却无法发现这样的翻译:所有键和占位符都齐全,却仍然把你原本的意思反过来告诉德语用户。

Shipi18n 正是缺失的这一道关卡,分为两层:

  • 确定性、离线、无需密钥。 检查缺失键和孤立键、丢失或格式错误的占位符({{name}}、{count}、%s、%d、%1$s、$t(...)、%{name}、HTML)、被合并的复数形式、空值、未翻译文案,以及各语言的覆盖率。
  • 语义检查,使用你自己的密钥。 仅针对已更改的键运行 LLM-as-judge 检查,并通过多轮多数表决来应对单轮评审分数不稳定的问题。报告误译、遗漏和增译。默认仅供参考——会导致构建失败的 QA 工具最终只会被卸载。

此外,还有一些功能让它适合日常使用:

  • 支持 JSON 以外的格式。 YAML(.yaml/.yml)、Flutter .arb、Apple .xcstrings、Android strings.xml、gettext .po/.pot 和 XLIFF 1.2/2.0——包括 %@/%lld 格式说明符。
  • 原生支持 CI。 提供正确的退出代码、--fail-on、--min-coverage、用于 PR 注释的 SARIF,以及 JUnit。
  • 可用于杂乱的目录。 --baseline 接受当前待处理问题,只对新增问题报错(Stylelint/RuboCop 模式);--severity 可调整或关闭任意规则(error|warning|info|off)。
  • 随处运行,无论是否有 Node。 可使用 GitHub Action、pre-commit 钩子,或 Docker 镜像 ghcr.io/shipi18n/cli,用于 GitLab / Bitbucket / Jenkins / 本地环境——无需 Node 工具链。请参阅 CLI README。
  • WordPress .po ↔ JED 同步。 shipi18n wp-sync 可发现 JS 翻译 JSON 是否与 .po 文件不一致,因为没人重新运行 wp i18n make-json——这是其他工具都不会检查的隐蔽错误。
  • 隐私预检。 --semantic 将任何内容发送给大模型之前,会先扫描并阻止包含机密或个人身份信息(PII)的字符串(密钥、银行卡号、电子邮件);--detect-secrets 可独立运行此扫描,无需大模型。
  • 保护手动编辑。 shipi18n lock 会记录人工确认过的翻译,并在有内容覆盖这些翻译或源文本发生变化时发出警告。
  • 在编辑器中无需密钥。 MCP 服务的验证器完全不会调用模型。
  • 它也能翻译。 与提供商无关、保留结构、支持增量翻译——内置 Anthropic 和 OpenAI 支持,任何具有 complete(prompt) 方法的对象都可用作适配器。

在编辑器中检查 — 无需 API 密钥

@shipi18n/mcp 可将检查功能带到任何 MCP 客户端。验证工具不会调用模型,因此完全不需要密钥。

Claude Code — 一行配置:

claude mcp add shipi18n -- npx -y @shipi18n/mcp

Claude Desktop / 任何 MCP 客户端 — 粘贴配置:

// claude_desktop_config.json
{
  "mcpServers": {
    "shipi18n": { "command": "npx", "args": ["-y", "@shipi18n/mcp"] }
  }
}

“检查 ./locales,与英语对比,并告诉我西班牙语中有哪些问题。”

review_locales 还能做得更多,同样不需要密钥:它会将翻译对和审核标准交给你的 Agent,由你的 Agent 使用现有模型推理含义。

在 CI 中检查 — 无需密钥

这些检查适用于来自任何来源的翻译——TMS、其他工具、Agent 或人工翻译。每次推送时运行:

npx @shipi18n/cli check ./locales -s en

缺失的键、丢失的占位符、被折叠的复数形式、空值和未翻译的文本——均可通过人类可读输出、JSON、SARIF(GitHub PR 注释)或 JUnit 报告。支持普通 JSON 树、YAML、Flutter .arb、Apple .xcstrings、Android strings.xml、gettext .po/.pot 和 XLIFF(1.2/2.0)。确定性离线运行:无需 LLM,也无需 API 密钥。

保护手动编辑的翻译

手动修正字符串并锁定后,如果有任何内容覆盖它,或者英语原文发生变化,check 都会发出警告:

npx @shipi18n/cli lock ./locales --keys 'legal.*'

.shipi18n/locks.json 只存储哈希值,可以安全提交。这些发现属于警告——保护人工成果绝不能阻塞流水线。详情请参阅 CLI README。

也能翻译

检查适用于来自任何来源的翻译,但如果你也希望 Shipi18n 生成翻译,它也能做到——使用你的密钥和模型,中间没有其他环节。

npm i -D @shipi18n/cli @anthropic-ai/sdk       # or `openai`
export ANTHROPIC_API_KEY=sk-ant-...            # or OPENAI_API_KEY
npx @shipi18n/cli translate locales/en.json -t es,fr,de
✔ es → locales/es.json (2 translated, 0 reused)

也可以从 Node 调用(SDK 要求相同):

import { translateJSON } from '@shipi18n/core'

const { result, stats } = await translateJSON({
  content: { greeting: 'Hello {{name}}' },
  from: 'en',
  to: 'es',
  provider: 'anthropic',        // 'anthropic' | 'openai' | custom { complete } adapter
})
// result → { greeting: 'Hola {{name}}' }

保留结构、保障占位符安全并增量处理——只有新增或变更的键才会发送给模型。然后使用同一工具检查结果。

示例

examples/ 中提供了可运行的项目——react(Vite + react-i18next)、nextjs(App Router)、vue(vue-i18n)和 nodejs(@shipi18n/core)。进入其中一个目录,安装依赖,然后运行其检查/翻译脚本。

开发

这是一个 pnpm + turbo 单体仓库。

pnpm install
pnpm test          # all packages
pnpm --filter @shipi18n/core test

使用 Changesets 管理版本:运行 pnpm changeset 添加一个变更集。

参与贡献

欢迎提交问题和拉取请求——请参阅 CONTRIBUTING.md。运行 pnpm install && pnpm test,即可使用模拟适配器运行 105 项测试,因此开发时无需 API 密钥。

许可证

Apache-2.0 © Shipi18n。请参阅 NOTICE。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。