エージェントガイド: i18n-rosettaの使い方
i18n-rosettaは、アプリのロケールファイルを1つのコマンドで翻訳するCLIツールです。このガイドは、ゼロから素早くロケールファイルの翻訳を行いたいAIエージェント(またはAIエージェントと連携する開発者)向けに作成されています。
:::tip すでに使い慣れている場合 コマンドだけが必要な場合は、CLIリファレンスにジャンプしてください。翻訳メソッドを構築してベンチマークを行いたい場合は、Arenaエージェントガイドを参照してください。 :::
環境セットアップ
# No global install needed — npx runs it directly
npx i18n-rosetta sync
要件:
- Node.js 18以上
- 翻訳プロバイダーのAPIキー
APIキーのセットアップ — 使用するメソッドに応じて、rosettaには少なくとも1つのキーが必要です:
# Option 1: export (session only)
export OPENROUTER_API_KEY="sk-or-..." # for llm / llm-coached methods
export GOOGLE_TRANSLATE_API_KEY="AIza..." # for google-translate method
# Option 2: .env file in your project root (persistent, gitignored)
echo 'OPENROUTER_API_KEY=sk-or-...' > .env
Rosettaは自動的に.envを読み込みます。OpenRouterのキーはopenrouter.ai/keysで取得できます。
初回同期
Rosettaは、ロケールファイル、そのフォーマット(JSON、TOML、YAML、PO)、およびターゲット言語を自動検出します:
npx i18n-rosetta sync
実行される処理:
i18n-rosetta.config.jsonを読み込みます(または設定を自動検出します)- ソースのロケールファイルをスキャンし、ネストされたキーをフラット化します
.i18n-rosetta.lock(過去に翻訳された値のSHA-256ハッシュ)と比較します.rosetta/tm.jsonでキャッシュされた翻訳(翻訳メモリ)を確認します- 設定されたメソッドを使用して、変更されたキー、欠落しているキー、または古いキーのみを翻訳します
- すべての翻訳に対して品質ゲート(5つのチェック)を実行します
- チェックを通過した翻訳をターゲットのロケールファイルに書き込みます
- ロックファイルとTM(翻訳メモリ)キャッシュを更新します
1つのキーを変更した後の通常の再実行では、ステップ4で142個のキーがキャッシュから提供され、ステップ5で1個のキーが翻訳されます。これが、2回目以降の同期が高速かつ低コストになる理由です。
設定
プロジェクトのルートにi18n-rosetta.config.jsonを作成します:
{
"inputLocale": "en",
"pairs": {
"en-fr": { "method": "llm-coached" },
"en-ja": { "method": "google-translate" },
"en-crk": { "method": "api", "endpoint": "http://localhost:3000/translate" }
}
}
主要なフィールド:
| フィールド | 目的 | デフォルト |
|---|---|---|
inputLocale | ソース言語 | en |
pairs | メソッド設定を含むソース→ターゲットのマップ | (必須) |
localesDir | ロケールファイルの保存場所 | (自動検出) |
model | llm/llm-coachedメソッド用のLLMモデル | google/gemini-2.5-flash |
batchSize | 1回のAPI呼び出しあたりのキー数 | 80 (LLM), 128 (Google) |
jsonConcurrency | JSONキーの並列ロケール翻訳数 | 200 |
contentConcurrency | コンテンツ翻訳の並列API呼び出し数 | 48 |
完全なリファレンス: 設定
翻訳メソッド
| メソッド | 使用する場面 | コスト | 必要なAPIキー |
|---|---|---|---|
llm | 汎用。リソースが豊富な言語に最適 | トークン単位 (モデルに依存) | OPENROUTER_API_KEY |
llm-coached | ターゲット言語の文法規則/辞書がある場合 | トークン単位 + コーチングコンテキスト | OPENROUTER_API_KEY |
google-translate | GT(Google翻訳)がうまく機能するリソースが豊富な言語 | 20ドル/100万文字 | GOOGLE_TRANSLATE_API_KEY |
api | HTTPエンドポイントの背後でホストされるカスタムパイプライン | サーバー側で決定 | なし (エンドポイントが認証を処理) |
plugin | ローカルにインストールされたパッケージ化済みのメソッド | 変動 | 変動 |
詳細: 翻訳メソッド
コーチングデータ
llm-coachedのペアの場合、コーチングデータは明示的な言語知識でLLMを誘導します。コーチングファイルを作成します:
{
"grammar_rules": [
"Use formal register (vous) for all UI text",
"Adjectives agree in gender and number with the noun"
],
"dictionary": {
"dashboard": "tableau de bord",
"settings": "paramètres"
},
"style_notes": "Prefer active voice. Avoid anglicisms."
}
ペアの設定でそれを参照します:
"en-fr": { "method": "llm-coached", "coachingFile": "coaching/fr.json" }
品質ゲートは、辞書の用語が実際に出力に含まれているかを検証します。違反は[TERM]の警告としてログに記録されます。
詳細: コーチングデータ
品質ゲート
すべての翻訳は、ディスクに書き込まれる前に5つの自動チェックを通過します:
| チェック | 検出内容 | 例 |
|---|---|---|
| 空/空白 | モデルが何も返さなかった | "" |
| ソースのエコー | モデルが入力された英語をそのまま返した | 日本語に対する"Welcome" |
| ハルシネーションループ | トライグラム(3文字/3単語)の繰り返し | "Qo' Qo' Qo' Qo'" |
| 長さの膨張 | 出力がソースの4倍以上の長さになっている | 10文字のソース → 50文字の出力 |
| 文字体系の準拠 | ロケールに対して誤った文字体系(スクリプト)が使われている | アラビア語ロケールに対するラテン文字 |
失敗は[GATE]のプレフィックスを付けてログに記録されます。サイレントフォールバックはありません。翻訳が失敗した場合、暗黙のうちに受け入れられることはなく、必ず報告されます。
詳細: 品質ゲート
翻訳メモリ
Rosettaは、ソーステキスト + ロケール + メソッドをキーとして、翻訳を.rosetta/tm.jsonにキャッシュします。2回目以降の同期では、変更されていないキーはキャッシュから提供されるため、API呼び出しやコストは発生しません。
[TM] 142 key(s) served from cache
Translating 3 key(s) to French (llm)... [OK]
1回の実行でキャッシュをバイパスする場合: npx i18n-rosetta sync --no-tm
詳細: 翻訳メモリ
生成されるファイル
Rosettaはプロジェクト内にいくつかのファイルを作成します。誤って削除したり、間違ったファイルをコミットしたりしないように、それぞれの役割を把握しておいてください:
| ファイル | 目的 | Git? |
|---|---|---|
.i18n-rosetta.lock | 翻訳されたソース値のSHA-256ハッシュ(変更検出用) | はい — コミットしてください |
.i18n-rosetta-content.lock | 同上(Markdown/MDXコンテンツファイル用) | はい — コミットしてください |
.rosetta/tm.json | 翻訳メモリのキャッシュ | はい — コミットしてください(チームのAPIコストを節約します) |
.rosetta/coaching/ | コーチングデータのディレクトリ | はい — これはあなたの言語知識です |
i18n-rosetta.config.json | プロジェクト設定 | はい — コミットしてください |
一般的なパターン
1つの言語ペアを翻訳する:
npx i18n-rosetta sync --pair en-fr
設定されたすべてのペアを翻訳する:
npx i18n-rosetta sync
Rosettaはすべてのロケールを並列で翻訳します。TMキャッシュにより、変更されたキーのみがAPIにアクセスします。
コンテンツモード(Docusaurus、HugoなどのMarkdown/MDX):
npx i18n-rosetta sync --content
ロケールのJSONと一緒に、ドキュメント、ブログ記事、コンテンツファイルを翻訳します。並列処理(デフォルト: 同時48 API呼び出し)を使用します。--content-concurrencyで調整できます。
ドライラン(書き込まずにプレビュー):
npx i18n-rosetta sync --dry-run
特定のキーを強制的に再翻訳する:
npx i18n-rosetta sync --force-keys "hero.title,nav.about"
すべてのコンテンツファイルを強制的に再翻訳する:
npx i18n-rosetta sync --force-content
翻訳ステータスを確認する:
npx i18n-rosetta status
各ペアのカバレッジ、品質ティア、プラグイン情報を表示します。
未翻訳のフォールバックを監査する:
npx i18n-rosetta audit
翻訳が必要なすべての[EN]フォールバック値をリストアップします。
トラブルシューティング
| 問題 | 解決策 |
|---|---|
OPENROUTER_API_KEY not set | キーをエクスポートするか、プロジェクトルートの.envに追加します |
No locale files found | 設定でlocalesDirを指定するか、ロケールファイルが標準の命名規則(en.json、fr.json)と一致しているか確認します |
[GATE] Script compliance failed | ターゲットロケールで期待される文字体系ではなくラテン文字が出力されました。別のモデルを試すか、コーチングデータを追加してください |
[GATE] Source echo | モデルが英語をそのまま返しました。通常、コーチングデータを追加するか別のモデルを使用することで解決します |
| すべての翻訳がキャッシュされている | キャッシュをバイパスするには--no-tmを付けて実行するか、特定のキーに対して--force-keysを使用します |
| ロックファイルの競合 | .i18n-rosetta.lockはSHA-256ハッシュを使用しています。マージコンフリクトはどちらかのバージョンを保持して解決し、その後同期を再実行すれば安全です |
次のステップ
- クイックスタート — 導入手順の完全なウォークスルー
- CLIリファレンス — すべてのコマンドとフラグ
- 仕組み — 同期パイプラインの解説
- Eval Harnessブリッジ — rosettaがArenaに接続する仕組み
- 独自の翻訳メソッドを構築したい場合: Arenaエージェントガイドを参照してください。メソッドを構築し、その動作を証明して、賞品を獲得しましょう。