mcpField
I
i18n-LE

i18n-LE

本地服务
letools.dev开发工具1今天更新

关于 i18n-LE

i18n-LE 将翻译目录与源语言对照,检查键、占位符、结构以及空值或未翻译值,且不会返回翻译字符串。它面向审查本地化内容的开发者,并针对 i18next、next-intl、VS Code bundles 和 Flutter ARB 使用相应解析规则。

主要功能

  1. 01将目录与源语言对照
  2. 02检测缺失键和多余键
  3. 03检查占位符名称与样式
  4. 04查找重复键和结构不匹配
  5. 05识别支持的目录库

适用场景

  1. 01发布前检查语言目录是否完整
  2. 02审查机器翻译后的占位符
  3. 03审核译者提交的目录变更

MCP 相关

MCP 服务提供 `check_catalogues`,接收目录内容和库名称并返回审查结果。它不访问文件,也不发起网络请求。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"nolindnaidoo-i18n-le": {
"command": "npx",
"args": [
"-y",
"i18n-le-mcp"
]
}
}
}
启动命令npx -y i18n-le-mcp

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

安装包
npmi18n-le-mcp1.1.0

工具

1

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

参数类型必填说明
filesarray是要审查的翻译目录。支持 JSON,可嵌套或扁平结构。
sourcestring否指定作为契约的目录 — 可使用路径或语言标签。若未指定,则必须恰好存在一个英文候选项,否则拒绝审查而不进行猜测。
libraryenum是指定编写这些翻译目录的 i18n 库。它决定占位符语法、复数规则模型,以及哪些键属于元数据。i18next | next-intl | vscode-l10n | flutter-arb
maxResultsinteger否返回的问题数上限(默认 500)。meta.truncated 报告是否有结果被省略。
keysAreSourceboolean否键本身就是英文字符串,例如 VS Code 的 bundle.l10n.json。

详细介绍

i18n-LE 徽标

i18n-LE:看起来完成了的语言区域

只需按一下按键,即可根据源语言区域审查翻译目录
i18next、next-intl、VS Code 语言包和 Flutter ARB——检查键和令牌,绝不显示翻译字符串

从 VS Code Marketplace 安装 Open VSX 下载量 npm 上的 i18n-le-mcp npm 上的 i18n-le crates.io 上的 i18n-le LE Tools


VS Code 中的 i18n-LE

觉得有用? 点赞或评分能帮助其他开发者找到它 — ★ GitHub · ★ Open VSX · ★ Marketplace

它的功能

西班牙语版本上周发布了,从那以后,指标页面对每位用户都显示着 {{periodo}}。目录里的键一个不缺,也能通过解析。占位符经过机器翻译后,名称也被翻译了;代码编译毫无问题,页面却显示了字面文本。

打开目录,运行 i18n-LE: Audit Catalogues,它所属的目录集便会根据源语言区域进行审查:缺少键或多出键的语言区域、翻译中被删掉或改名的占位符、其他库约定中的结构、空值、重复定义的键,以及在一个语言区域中是对象、在另一个语言区域中却是字符串的路径。报告会在编辑器旁打开。也可以在资源管理器中对任意文件夹运行。支持 VS Code 以及 Cursor 和 VSCodium 等基于 VS Code 的编辑器(可从 Open VSX 安装)。

  • 发布前 — 这个语言区域可以发布了吗,还是只是看起来可以?
  • 机器翻译后 — 通过令牌名称捕获从 {{timeframe}} 变成 {{periodo}} 的情况
  • 审查译者的拉取请求时 — 无需阅读译文,即可查看结构发生变化的键

报告中绝不会包含翻译字符串。 报告只列出键、占位符令牌、计数和结构;通过证明某个字符串与源字符串逐字节相同来识别未翻译的字符串,而不会显示该字符串。它不会改写任何内容。

安装

位置可获得的内容安装方式
VS Code在编辑器中通过按键触发审计Marketplace
Cursor、VSCodium、Windsurf同一扩展Open VSX
终端或 CI 步骤同一审计,并返回退出码cargo install i18n-le · crates.io
通过 Node 使用终端同一命令行,与 Rust 版本逐字节保持一致npx i18n-le · npm
通过 Node 使用任意 MCP Agent通过标准输入输出调用 check_cataloguesnpx i18n-le-mcp · npm

首先判断你使用的是哪个库

{name} 在 next-intl 中是占位符,在 i18next 中则是字面文本;{{ name }} 在 i18next 中是变量,在 ICU 中则是包住单词的字面花括号。光看字节无法判断这一点,因此读取目录前会先识别库,占位符语法、复数模型以及哪些键属于元数据,都由识别结果决定。

共有五种判断依据,任意两种一致即可识别:清单依赖项(package.json、pubspec.yaml)、配置文件、目录布局、目录自身的语法,以及源代码中的调用位置。ARB 文件中,@@locale 与 @key 元数据并列时,仅凭这一点就足以判断。如果没有任何依据一致,或有两个库同时匹配,工具会拒绝判断并列出发现的内容,而不是擅自选择一个。设置 i18n-le.library 可跳过识别。

库占位符复数布局
i18next{{name}}、$t(key) 嵌套key_one / key_other 后缀locales/<locale>.json、locales/<locale>/<namespace>.json
next-intlICU {name}、{count, plural, …}在消息内部messages/<locale>.json
vscode-l10n{0}无l10n/bundle.l10n.<locale>.json、package.nls.<locale>.json
flutter-arbICU,带有 @key 元数据在消息内部<prefix>_<locale>.arb

VS Code 扩展的 package.nls.json 位于根目录,而其翻译则位于其他位置;这两部分会作为一个整体读取。读取源文件仅用于判断所用的库,绝不会据此生成问题报告。

检查内容

类型严重级别说明
missing-keyerror源目录中存在,目标目录中缺失
extra-keyerror目标目录中存在,源目录中缺失
placeholder-count-mismatcherror占位符被删减或添加
placeholder-name-mismatcherror数量相同但名称不同——{{timeframe}} 被改成了 {{periodo}}
placeholder-style-mismatcherror使用了此库无法读取的格式,而源目录中对应位置有真实占位符
convention-mismatcherror出现其他约定中的结构——ICU、Fluent、printf、${…}、$t()——加载器会将其原样呈现
duplicate-key-within-fileerror同一键定义了两次;每个加载器都会保留最后一个定义
structure-mismatcherror一种语言环境中是对象,另一种中是字符串——这是扁平化后比较的测试会遗漏的问题
empty-valuewarning值为空或仅包含空白字符
untranslatedinfo与源内容逐字节相同

一个目录就是基准,绝不会合并所有目录——合并会让一位译者的拼写错误变成其他所有人的缺失键。基准是唯一的英文目录,或 i18n-le.source 指定的目录。复数类别会折叠到其基础键,因此波兰语中的合法 _few 不会被视为多余键;本工具有意不检查复数类别是否完整。

在 AI Agent 中使用

同一引擎也可作为 MCP 服务运行,因此 Agent 可以直接调用它,而不必拿到 25 份目录后自行逐一比对。

编辑器用法
VS Code 1.101+无需安装任何内容 — 扩展会在 Agent 模式下注册 check_catalogues
Claude Codeclaude mcp add i18n-le -- npx -y i18n-le-mcp
Cursor、Windsurf 及其他工具将其指向 npx i18n-le-mcp

Claude Code 中的 Agent 调用 i18n-le MCP 服务

check_catalogues(library, files, source?, keysAreSource?, maxResults?)

工具接收目录内容和库名称 — 它无法查看项目,因此无法识别库,也不会猜测。它会以数据形式返回与编辑器中显示的相同报告,默认最多包含 500 条发现,并通过 meta.truncated 标记是否截断。它不会读取文件,也不会发起网络请求。该工具以 i18n-le-mcp 的名称发布在 npm 上,并以 io.github.nolindnaidoo/i18n-le 的名称发布在 MCP 注册表 中。它的响应与 Rust CLI 服务完全一致:两者使用同一套语料运行,差异测试会向两者输入数千组生成的目录集(包括损坏的目录,此时两者都会报告解析器自身的错误信息和位置),并比较每一条响应。

手动配置 — 适用于任何带有 MCP 配置文件的宿主
{
  "mcpServers": {
    "i18n-le": {
      "command": "npx",
      "args": ["-y", "i18n-le-mcp"]
    }
  }
}

也可以通过 npm install -g i18n-le-mcp 一次性安装,然后将其指向 i18n-le-mcp。它不需要环境变量、API 密钥或任何自有配置。检查方法如下:

echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | npx -y i18n-le-mcp

CLI

同一项审计也可以在终端或 CI 步骤中运行:Rust CLI 位于 crate/,并与扩展共用一套语料 — crate/fixtures/ — 确保两者读取目录的方式完全一致。同一命令行也以 i18n-le 的名称发布在 npm 上,适用于装有 Node 但没有 Rust 的机器;CI 会在三种操作系统上逐字节验证其与 crate 的一致性。

终端中的 i18n-le

通过 npm(i18n-le)或 crates.io(i18n-le)**安装。**两者都会安装同一个 i18n-le 命令。

npm 上的 i18n-le crates.io 上的 i18n-le

npm install -g i18n-le   # or run it once: npx i18n-le
cargo install i18n-le
i18n-le locales/                       # the set in that directory; JSON on stdout when piped
i18n-le --system vscode-l10n l10n/     # name the library, skip identification
i18n-le --fail-on untranslated locales/
i18n-le mcp                            # the same audit over MCP on stdio

退出代码就是 API — 0 表示无问题,1 表示发现问题,2 表示问题本身格式错误(未识别到库、识别到两个库,或没有唯一来源)。完全没有找到目录时返回 0:没有需要检查的内容。

命令

命令描述
i18n-LE: Audit Catalogues审计当前目录所属的目录集,或在资源管理器中选定的文件夹
i18n-LE: Open Settings打开 i18n-LE 设置
i18n-LE: Help & Troubleshooting内置文档

默认情况下,没有命令绑定快捷键。可在编辑器的 键盘快捷方式 中为任意命令设置快捷键。

设置

设置默认值描述
i18n-le.libraryauto编写目录文件的库;auto 会根据项目识别库
i18n-le.source""作为对照基准的目录文件,可填写文件名或语言标签;留空时使用唯一的英文目录文件
i18n-le.keysAreSourcefalse键是英文字符串,如 VS Code 的 bundle.l10n.json;通常由布局决定
i18n-le.openResultsSideBySidetrue在当前编辑器旁打开报告
i18n-le.copyToClipboardEnabledfalse同时将报告复制到剪贴板
i18n-le.notificationsLevelsilentall = 所有通知,important = 警告 + 错误,silent = 仅错误
i18n-le.statusBar.enabledtrue显示状态栏项
i18n-le.telemetryEnabledfalse仅限本地的事件日志(参见“隐私”)

语言

除英语外,支持 12 种语言:

德语 · 西班牙语 · 法语 · 印度尼西亚语 · 意大利语 · 日语 · 韩语 · 葡萄牙语(巴西)· 俄语 · 乌克兰语 · 越南语 · 简体中文

两部分内容均已覆盖:清单(命令标题、设置名称和描述),以及扩展运行时显示的所有内容(通知、状态栏和报告标题)。拒绝请求时给出的理由使用引擎的英文,与 CLI 中的相同。

隐私与安全

  • 不访问网络。 扩展绝不会向任何地方发送数据。telemetryEnabled 设置只会将事件写入可供检查的本地输出通道(i18n-LE)。
  • 报告、通知或 MCP 边界中绝不会出现翻译后的值。 键是有意设定的例外;如果布局将英文句子用作键,就会显示该英文。
  • MCP 服务同样遵守这一原则。 它将内容作为参数接收并返回数据:不访问文件系统、不进行网络调用,也不收集遥测数据。如果翻译内容进入标准输出,check:mcp-bundle 会导致构建失败。
  • 错误通知会隐去主目录和类似凭据的片段。
  • 评分提示最多出现两次。 第 3 次成功使用时,扩展会询问一次你是否愿意为其评分;如果你选择 稍后 或关闭提示,则会在第 20 次使用时再询问一次。选择 不再询问 后将不再显示提示。自行将 notificationsLevel 设置为 important 或 silent,也会关闭该提示。计数保存在 VS Code 的扩展存储中,不会发送到任何地方;选择 评分 后,会在浏览器中打开你安装扩展的平台页面——VS Code Marketplace 或 Open VSX。

文档

内容位置
工具允许说明的内容——检查、识别、拒绝、隐私边界crate/SPEC.md
扩展的构建与组成方式——架构、不变量、工具链、发布AGENTS.md
CLI 的构建与组成方式crate/AGENTS.md
更改内容CHANGELOG.md · crate/CHANGELOG.md
工具页面及另外 15 个工具letools.dev/tools/i18n-le

性能

输入大小找到条目数耗时速率扫描速度
i18next,25 种语言环境2.83 MB48,00092.53 ms518,733/sec30.6 MB/s
next-intl ICU,2 种语言环境3.59 MB20,00047.75 ms418,877/sec75.2 MB/s
VS Code bundle,12 种语言环境0.91 MB2,00419.3 ms103,839/sec46.9 MB/s

在 Apple M5 Pro、24 GB RAM、Node 24.3.0 上预热后运行 7 次,取中位数。输入由 scripts/benchmark.ts 生成,而非检入仓库,因此上面的大小正是实测值。运行 bun run benchmark 即可复现。

这些数据因机器而异,不会作为 CI 的断言——以基准测试作为构建门槛,只能反映运行器当时有多忙。

测试

指标覆盖率
语句88.08%
分支80.20%
函数93.33%
行90.59%

18 个文件中共有 266 个测试用例,此外还有一个在真实 VS Code 扩展宿主中运行的集成测试套件,以及一个将构建好的 .vsix 安装到干净配置文件中的端到端测试。

数据由 scripts/coverage-readme.js 根据一次真实运行生成:coverage/coverage-summary.json 和 coverage/test-results.json;如果本节内容发生偏差,CI 会失败。运行 bun run test:coverage 可复现,测试用例数以 vitest 打印的为准。

LE 系列的更多工具

十六款单一用途工具,助力每个模型完成眼前的工作。每款工具都提供 Rust CLI 和 MCP 服务。访问一个页面即可了解全部:letools.dev

提取内容

  • String-LE — 提取代码库中的所有字符串,方便人们阅读
  • Numbers-LE — 提取代码库中所有硬编码数字,方便人们检查
  • Units-LE — 提取所有带单位的量并进行标准化,并明确拒绝无法消除歧义的项目
  • Dates-LE — 提取所有日期和时间戳,以及每个日期和时间戳解析出的确切时刻
  • IDs-LE — 提取所有 UUID、ULID、NanoID、ObjectId 和 Snowflake,并解码其中的时间
  • IPs-LE — 提取所有 IP 地址、CIDR 块和 MAC 地址,进行标准化并按范围分类
  • URLs-LE — 提取代码库中的所有 URL,并标明其协议和确切位置
  • Paths-LE — 提取代码库中的所有文件路径,并说明它们是否仍指向某个对象
  • Colors-LE — 提取代码库中的所有颜色,并指出哪些颜色不在你的调色板中

检查内容

  • Regex-LE — 查找代码库中的所有正则表达式,并报告哪些可能导致灾难性回溯
  • Versions-LE — 查找一个依赖项在仓库各清单文件中的约束差异
  • i18n-LE — 识别项目使用的 i18n 库,然后按照该库的规则审核其目录
  • Scrape-LE — 在编写抓取器之前检查页面是否可抓取,并说明何时无法判断

守护安全

  • Secrets-LE — 查找代码库中的硬编码凭据,并确保绝不将其打印到报告中
  • EnvSync-LE — 比较目录树中的 dotenv 文件,并指出哪些文件缺少哪些键
  • Unicode-LE — 查找会隐藏含义的 Unicode 字符——双向控制字符、不可见字符、同形异义字符、混合文字

每款工具都独立运行:没有共享 crate,也没有发布的核心库。两款工具得出相同结论时,只是因为同一个答案碰巧正确了两次。

联系 — nolindnaidoo.com · GitHub · LinkedIn

nolindnaidoo 的其他项目

Rust — pixelcoords 和 pixelactions 构成一个循环:pixelcoords 负责回答在哪里,pixelactions 则在该位置执行操作。它们各有自己的工具和风格,并不属于 LE 系列。

许可证

MIT © nolindnaidoo

评论

支持 Markdown

第一次接触 MCP?

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

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