i18n-LE について
i18n-LE は翻訳カタログをソースロケールと照合し、キー、プレースホルダー、構造、空または未翻訳の値を検査します。翻訳文字列自体は返しません。ローカライズを確認する開発者向けで、i18next、next-intl、VS Code bundles、Flutter ARB に応じて解析します。
主な機能
- 01カタログをソースロケールと照合
- 02キーの不足と過剰を検出
- 03プレースホルダー名と形式を確認
- 04重複キーと構造の不一致を検出
- 05対応カタログライブラリを識別
活用シーン
- 01リリース前にロケールを確認
- 02機械翻訳後のプレースホルダーを点検
- 03翻訳者のカタログ変更を監査
MCP 対応
MCP サーバーは `check_catalogues` を公開し、カタログ内容とライブラリ名を受け取って監査結果を返します。ファイルへのアクセスやネットワーク要求は行いません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
1掲載時のツール一覧 · 3 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| files | array | はい | 監査する翻訳カタログ。JSON 形式で、ネスト形式またはフラット形式に対応します。 |
| source | string | いいえ | 契約となるカタログを指定します。パスまたは言語タグを指定できます。指定がない場合、英語の候補がちょうど 1 つ存在しなければ、推測せずに監査を拒否します。 |
| library | enum | はい | これらの翻訳カタログを生成した i18n ライブラリを指定します。プレースホルダー構文、複数形モデル、メタデータに該当するキーを判定します。i18next | next-intl | vscode-l10n | flutter-arb |
| maxResults | integer | いいえ | 返される指摘数の上限(デフォルトは 500)。meta.truncated は省略された結果があるかどうかを示します。 |
| keysAreSource | boolean | いいえ | キー自体が英語の文字列です。VS Code の bundle.l10n.json のような形式です。 |
詳細
i18n-LE:完成したように見えるだけのロケール
キーを1回押すだけで、翻訳カタログをソースロケールと照合して監査
i18next、next-intl、VS Code バンドル、Flutter ARB — 翻訳済み文字列ではなく、キーとトークンを対象にします
役に立ちましたか? 星や評価を付けると、ほかの開発者にも見つけてもらいやすくなります — ★ 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 エージェント | stdio 経由の check_catalogues | npx i18n-le-mcp · npm |
まず使用しているライブラリを特定します
{name} は next-intl ではプレースホルダーですが、i18next ではリテラルテキストです。{{ name }} は i18next の変数ですが、単語を囲む ICU のリテラル波括弧でもあります。バイト列をいくら調べても判別できないため、カタログを読み込む前にライブラリを特定し、プレースホルダーの文法、複数形のモデル、メタデータとして扱うキーを判定結果から決定します。
5 種類の根拠のうち、2 つが一致すれば特定できます。根拠は、マニフェストの依存関係(package.json、pubspec.yaml)、設定ファイル、ディレクトリ構成、カタログ自体の構文、ソース内の呼び出し箇所です。@key メタデータと並んだ ARB ファイルの @@locale だけで特定できる場合もあります。どれも一致しない場合や、2 つのライブラリが見つかった場合は、どちらかを選ぶのではなく、見つかった内容を示して処理を拒否します。特定を省略するには i18n-le.library を設定してください。
| ライブラリ | プレースホルダー | 複数形 | 構成 |
|---|---|---|---|
i18next | {{name}}、$t(key) によるネスト | key_one / key_other の接尾辞 | locales/<locale>.json、locales/<locale>/<namespace>.json |
next-intl | ICU {name}、{count, plural, …} | メッセージ内 | messages/<locale>.json |
vscode-l10n | {0} | なし | l10n/bundle.l10n.<locale>.json、package.nls.<locale>.json |
flutter-arb | @key メタデータ付きの ICU | メッセージ内 | <prefix>_<locale>.arb |
VS Code 拡張機能の package.nls.json はルートにあり、翻訳は別の場所にあります。この分割はひとまとまりとして読み取られます。ソースファイルを読むのはライブラリの特定に限られ、問題の検出には使用しません。
検出される内容
| 種類 | 重大度 | 内容 |
|---|---|---|
missing-key | error | ソースにはあるが、ターゲットにない |
extra-key | error | ターゲットにはあるが、ソースにない |
placeholder-count-mismatch | error | プレースホルダーが削除または追加されている |
placeholder-name-mismatch | error | 数は同じでも名前が異なる — {{timeframe}} が {{periodo}} になっている |
placeholder-style-mismatch | error | ソースに実際のプレースホルダーがある箇所で、このライブラリが読み取らない形式で記述されている |
convention-mismatch | error | ローダーがそのまま表示する、別の規約の構文 — ICU、Fluent、printf、${…}、$t() |
duplicate-key-within-file | error | キーが重複して定義されている。すべてのローダーが最後の定義を保持する |
structure-mismatch | error | あるロケールではオブジェクト、別のロケールでは文字列になっている — flatten-and-compare テストでは見逃される問題 |
empty-value | warning | 空、または空白のみ |
untranslated | info | ソースとバイト単位で同一 |
契約となるのはカタログ 1 つだけであり、すべてのカタログをまとめたものではありません。まとめてしまうと、ある翻訳者の誤字が、ほかのすべての翻訳者にとっての missing key になってしまいます。基準となるのは、1 つの英語カタログ、または i18n-le.source で指定されたカタログです。複数形のカテゴリは基底キーに集約されるため、ポーランド語の正当な _few が余分なキーになることはありません。複数形カテゴリがすべて揃っているかどうかは、意図的にチェックしません。
AI エージェントから使用する
同じエンジンはMCPサーバーとしても動作するため、エージェントに25個のカタログを渡して自力で差分を確認させる代わりに、直接呼び出せます。
| エディター | 方法 |
|---|---|
| VS Code 1.101+ | インストールは不要です。拡張機能がエージェントモードにcheck_cataloguesを登録します |
| Claude Code | claude mcp add i18n-le -- npx -y i18n-le-mcp |
| Cursor、Windsurf、その他すべて | npx i18n-le-mcpを指定します |
check_catalogues(library, files, source?, keysAreSource?, maxResults?)
このツールはカタログの内容とライブラリ名を受け取ります。プロジェクトを参照できないため、ライブラリを特定できず、推測もしません。エディターに表示されるものと同じレポートをデータとして返し、デフォルトでは最大500件の検出結果を返します。上限に達した場合はmeta.truncatedで示します。ファイルの読み取りやネットワークリクエストは行いません。npmではi18n-le-mcpとして、MCP レジストリではio.github.nolindnaidoo/i18n-leとして公開されています。Rust CLIのサーバーとまったく同じ結果を返します。1つのコーパスを両方で実行し、差分テストでは生成した何千ものカタログセットを両方に渡して比較します。壊れたカタログも対象で、その場合は両方がパーサー独自のメッセージと位置を報告し、すべての回答を照合します。
手動で設定する — 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/のコーパスを共有するため、2つがカタログを異なる方法で読み取ることはありません。同じコマンドラインツールは、RustがないNode環境向けにnpmでもi18n-leとして提供されており、CIでは3つのオペレーティングシステム上でcrate版とバイト単位で一致することを確認しています。
npm(i18n-le)またはcrates.io(i18n-le)からインストールできます。どちらをインストールしても、同じ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は質問の形式が正しくありません(ライブラリが特定されていない、2つ特定されている、または単一のソースがない)。カタログが1つも見つからない場合は0です。問題にできるものがないためです。
コマンド
| コマンド | 説明 |
|---|---|
i18n-LE: Audit Catalogues | アクティブなカタログが属するセット、またはExplorerで選択したフォルダーを監査します |
i18n-LE: Open Settings | i18n-LEの設定を開きます |
i18n-LE: Help & Troubleshooting | 組み込みドキュメント |
デフォルトでは、どのコマンドにもキーは割り当てられていません。エディターのキーボードショートカットで、任意のコマンドにキーを割り当ててください。
設定
| 設定 | デフォルト | 説明 |
|---|---|---|
i18n-le.library | auto | カタログを作成したライブラリです。auto はプロジェクトからライブラリを判定します |
i18n-le.source | "" | ほかのすべてのカタログが比較対象とするカタログです。ファイル名または言語タグを指定します。空の場合は、唯一の英語カタログを使用します |
i18n-le.keysAreSource | false | キーが英語の文字列です。VS Code の bundle.l10n.json のような形式で、通常はレイアウトに基づいて決まります |
i18n-le.openResultsSideBySide | true | 現在のエディターの横にレポートを開きます |
i18n-le.copyToClipboardEnabled | false | レポートをクリップボードにもコピーします |
i18n-le.notificationsLevel | silent | all = すべての通知、important = 警告とエラー、silent = エラーのみ |
i18n-le.statusBar.enabled | true | ステータスバー項目を表示します |
i18n-le.telemetryEnabled | false | ローカルのみのイベントログです(プライバシーを参照) |
対応言語
英語以外に12言語に対応しています。
ドイツ語 · スペイン語 · フランス語 · インドネシア語 · イタリア語 · 日本語 · 韓国語 · ポルトガル語(ブラジル) · ロシア語 · ウクライナ語 · ベトナム語 · 中国語(簡体字)
両方の部分に対応しています。マニフェスト(コマンドのタイトル、設定名と説明)と、拡張機能の実行中に表示されるすべての内容(通知、ステータスバー、レポートの見出し)です。拒否理由はエンジンの英語で、CLI と同一です。
プライバシーとセキュリティ
- ネットワークアクセスはありません。 拡張機能がデータを外部に送信することはありません。
telemetryEnabled設定は、確認できるローカルの出力チャンネル(i18n-LE)にイベントを書き込むだけです。 - 翻訳された値がレポート、通知、MCP 境界に渡ることはありません。 キーは意図的な例外です。レイアウト上、キーが英語の文になる場合は、その英語が表示されます。
- MCP サーバーでも同じ方針を徹底しています。 コンテンツを引数として受け取り、データを返します。ファイルシステムへのアクセス、ネットワーク呼び出し、テレメトリはありません。翻訳が標準出力に出力された場合、
check:mcp-bundleがビルドを失敗させます。 - エラー通知では、ホームディレクトリと認証情報のような形式の文字列を伏せます。
- 評価の案内は最大2回までです。 拡張機能を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 MB | 48,000 | 92.53 ms | 518,733/秒 | 30.6 MB/s |
| next-intl ICU、2ロケール | 3.59 MB | 20,000 | 47.75 ms | 418,877/秒 | 75.2 MB/s |
| VS Code バンドル、12ロケール | 0.91 MB | 2,004 | 19.3 ms | 103,839/秒 | 46.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 をクリーンなプロファイルにインストールするエンドツーエンドテストがあります。
実行結果 — coverage/coverage-summary.json と
coverage/test-results.json — から scripts/coverage-readme.js で生成しています。このセクションに差異があると CI は失敗します。bun run test:coverage で再現でき、テストケース数には vitest が出力する値を使用しています。
LE ファミリーのその他のツール
あらゆるモデルの作業を支援する、単一目的のツール 16 個です。それぞれに 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 文字(双方向制御文字、不可視文字、ホモグリフ、混在スクリプト)を見つけます
それぞれ独立して動作し、共有クレートも公開されたコアもありません。2 つのツールが 同じ結果を出すのは、同じ答えが 2 度正しかったからです。
連絡先 — nolindnaidoo.com · GitHub · LinkedIn
nolindnaidoo によるその他のプロジェクト
Rust — pixelcoords と pixelactions はひとつのループを構成します。pixelcoords が 場所 を答え、pixelactions がそこで 操作 します。それぞれ独自のツールと独自の役割を持ち、LE ファミリーには属しません。
- pixelcoords — 画面を固定し、領域に印を付け、ピクセル単位で正確な座標と切り抜きを取得します pixelcoords.dev · crates.io · docs.rs
- pixelactions — 人間が検証した座標を受け取り、操作を実行して、正しく反映されたことを確認します pixelactions.dev · crates.io · docs.rs
ライセンス
MIT © nolindnaidoo
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。