まずランタイムのi18nライブラリを導入し、次にCopilotがすでに書いてしまった文字列を変換し、そのうえで新たな直書きが入り込まないようにします。多くのチームが最後のステップでつまずくのは、リポジトリのinstructionsファイルがCopilotのすべての出力経路に届くわけではないからです。チャットとコーディングエージェントはそれを読みますが、インラインの自動補完は読みません。globalize.nowはAI駆動のローカライゼーションインフラで、コードベースを一度変換し、i18nライブラリが読み込むキーとロケールファイルを生成します。
instructionsファイルを追加したのに、なぜCopilotはまだ文字列を直書きしてしまうのですか?
instructionsファイルが、最も頻繁に使われる経路には組み込まれていないからです。VS Codeのドキュメントには、入力中に得られるインライン補完候補にはカスタムinstructionsが考慮されないとはっきり書かれています。そしてこのモードこそ、多くの人が一日の大半を過ごす作業モードなのです。
つまり、あなたが書いたルールは確かに有効ですが、それが適用されるのはチャットでCopilotに質問したときや、コーディングエージェントにタスクを任せたときです。JSXタグを入力してグレー表示の補完候補にTabキーを押したときには適用されません。どちらの操作もコミットされるコードを生み出しますが、あなたのルールを読んでいるのは片方だけです。
どのCopilot機能があなたのinstructionsを読むのか?
リポジトリにコードを書き込む経路は3つあり、それぞれ挙動が異なります。
| 機能 | instructionsを読むか? | 出力先 |
|---|---|---|
| インライン補完 | できない | 編集中のファイルに直接 |
| チャットとエージェントモード | はい | エディタでレビューする編集内容 |
| コーディングエージェント | はい | レビューするドラフトのプルリクエスト |
この問題に関しては、3つの中でコーディングエージェントが最も扱いやすい存在です。issueを割り当てるとバックグラウンドで作業し、ドラフトのプルリクエストを開いてくれるので、出力結果はレビュアーがもともと目を通す場所に届きます。一方、インライン補完にはそもそもゲートが存在しません。
Copilotプロジェクトでi18nをセットアップするには?
まず、フレームワークが求めるランタイムライブラリを選びましょう。Next.jsのApp Routerにはnext-intl、それ以外のReactアプリにはreact-i18next、コンパイル時抽出とPOカタログが欲しいならLinguiです。この3つはnext-intl vs react-i18next vs Linguiで比較しています。
CopilotはLovableやBoltのように特定のフレームワークに縛られていないため、スタックの選択は本当に自由で、ライブラリ選びもあなた次第です。自由ではないのは順序です。まずライブラリを導入し、既存の文字列を変換し、それが済んでから初めて予防策を考えましょう。コードベースがまだ9割方直書きの英語のままの状態で予防ルールを書いても、測定できる指標が何もありません。
.github/copilot-instructions.mdには何を書くべきか?
このパスに置かれたリポジトリのinstructionsファイルは自動的に検出され、ワークスペース内のチャットリクエストに適用されます。GitHub自身のガイダンスによれば、各instructionは短く自己完結させ、理由を説明し、リンターがすでに強制している内容は省くべきだとされています。このアドバイスに沿ったi18nセクションはシンプルです。
## User-facing text
- User-facing text belongs in the message catalog, never in a component literal.
- Use the translation function from our i18n library for every visible string.
- Reason: a literal cannot be translated and does not show up as a missing key,
so it ships silently in one language.
- Add new English values to the source catalog only. Never hand-edit other locales.
- Not user-facing: test names, log lines, error codes, internal constants.
最後の一文は見た目以上に重要です。適用範囲が広すぎるルールは無視されがちで、ログメッセージまでラップしろと指示するルールは、そのセクション全体をノイズだとエージェントに学習させてしまいます。instructionsファイルをまだ持っていないなら、VS Codeのチャットでinitコマンドを使い、コードベースから下書きを生成させましょう。白紙から始めるよりずっと良い出発点になります。
パス限定のinstructionsファイルなら、もっとうまくいくのか?
はい、そしてこれこそCopilotが持つ、他のエディタのルールファイルにはない特有のレバーです。.instructions.mdという拡張子で.github/instructions配下に保存されたファイルは、フロントマターにapplyToのglobパターンを持ち、エージェントが該当するファイルを触ったときだけ読み込まれます。
---
name: 'UI strings'
description: 'String handling rules for components'
applyTo: '**/*.{jsx,tsx}'
---
Every visible string in this file must come from the catalog.
Key format is feature.element.state, lowerCamelCase.
If you add a key here, add its English value to the source catalog in the same change.
ルールをコンポーネントファイルに絞り込むことこそが、そのルールの信頼性を保つコツです。ユーザー向けテキストが存在する場所では発動し、APIルートやマイグレーションスクリプトでは静かにしています。すでにリポジトリのルートにAGENTS.mdやCLAUDE.mdを置いているなら、Copilotはそれらも常時有効なinstructionsとして読み込むので、複数のエージェントを運用しているチームでもツールごとに別々のファイルを用意する必要はありません。
instructionsが見逃した文字列は何が拾うのか?
それはCIのlintルールです。このスタックの中で、唯一ビルドを実際に失敗させられる層だからです。instructionsは確率を変えるだけですが、失敗するチェックは結果そのものを変えます。この実施レイヤーについてはAIエージェントが直書き文字列を追加し続ける理由で詳しく解説しており、その仕組みはそのままCopilotのリポジトリにも適用できます。
Copilot固有の追加要素はプルリクエストです。リポジトリのinstructionsはチャットだけでなくCopilotのコードレビューにも適用されるため、生成時に文字列の書き方を左右した同じファイルが、コーディングエージェントのドラフトPRに対するレビューコメントにも反映されます。これにより、インライン補完がすり抜けられないゲートが一つ生まれます。これが、本記事冒頭で挙げたギャップに対する現実的に最も近い解決策です。
ただし、これでリポジトリにすでにある負債が消えるわけでも、ロケールファイルが埋まるわけでもありません。レビューでリテラル文字列を見つけても、それは「文字列が抜けている」とわかるだけです。それにキーを割り当て、翻訳し、他のロケールが同期からずれていくのを防ぐのは、依然として人の仕事です。
globalize.nowはどこに当てはまるのか?
それはカタログを生成する層——i18nライブラリもinstructionsファイルもカバーしていない部分です。アプリでリポジトリを接続すると、コードベースを一度変換し、直書きの文字列をキーに置き換えてロケールファイルを生成します。この初回変換のあとは、プッシュごとのジョブが、コミットによって新たに生まれたカタログの単位を翻訳していきます。
出力はJSONまたはPO形式なので、カタログはあなたのランタイムライブラリがすでに読み込んでいる形式でそのまま届きます。同じアプローチは他のエージェント型エディタにも通用します。Claude CodeやCursorも別の角度から同じ壁にぶつかっており、Next.jsコードベースでの手順はAI構築のNext.jsアプリにi18nを追加するで詳しく解説しています。変換の詳細は開発者向けドキュメントを、料金プランは料金ページをご覧ください。
要点まとめ
instructionsファイルを作成し、パス限定のルールをコンポーネントファイルに絞って設定し、CIにlintルールを組み込みましょう。そうすれば、Copilotに指示した内容と実際にCopilotが書いたコードとのズレは、英語文字列がそのままリリースされる代わりに、赤いビルド失敗として表面化するようになります。そのうえで、既存の負債を一度きちんと変換すれば、そのルールが守るべき一貫した対象ができあがります。
globalize.nowは、ハードコードされたアプリ内テキストを翻訳可能なロケールファイルに変換し、リリースのたびに自動で最新の状態を保ちます。
globalize.nowを無料で試す