Next.js i18n セットアップ (nextjs-i18n-setup)
既存の Next.js App Router プロジェクトに next-intl を導入し、最新の next/root-params、動的セグメント app/[locale]/、および Next.js 16+(proxy.ts) / Next.js <=15(middleware.ts) を用いて初期構成を行います。
[!TIP] ボイラープレートとテンプレート: ファイルをスキャフォールドする際は、
references/templates.mdに掲載されている完全なドロップインコードテンプレートを参照してください。 高速実行: 検証は軽量なサブエージェント(Model: 'flash')に委任してください。
1. アーキテクチャルールと要件
- メタデータ規約:
docs/project.jsonに以下が含まれていることを確認します。"dictionaries_dir": "messages", "dictionary_file_pattern": "[locale].json" - Next.js バージョンインターセプター:
- Next.js 16 以上:
proxy.ts(またはsrc/proxy.ts)を使用します。レガシーなmiddleware.tsがあれば移行・削除します。 - Next.js 15 以下:
middleware.ts(またはsrc/middleware.ts)を使用します。
- Next.js 16 以上:
- モダンな Root Params:
i18n/request.tsでnext/root-params(await rootParams.locale())を使用します。非推奨のrequestLocaleおよびsetRequestLocale()は使用禁止です。 - ナビゲーション:
Link、redirect、usePathname、useRouterはi18n/navigation.tsからエクスポートします(純粋な TypeScript、JSX は含みません)。 - 静的生成: ルートレイアウト
app/[locale]/layout.tsxは、サポートされているすべてのロケールに対して{ locale }を返すgenerateStaticParams()をエクスポートする必要があります。
2. セットアップチェックリスト
- Step 0: 監査:
docs/project.json(supported_languages)とpackage.jsonの Next.js バージョンを確認します。 - Step 1: インストール:
<pkg_mgr> add next-intl(例:pnpm add next-intl)を実行します。 - Step 2: 設定メタデータ:
docs/project.jsonにdictionaries_dir: "messages"が存在することを確認します。 - Step 3: ルーティング:
defineRoutingを使用してi18n/routing.tsを作成します(テンプレートは こちら)。 - Step 4: リクエストハンドラ:
next/root-paramsを使用してi18n/request.tsを作成します(テンプレートは こちら)。 - Step 5: ナビゲーションヘルパー:
i18n/navigation.tsを作成します(テンプレートは こちら)。 - Step 6: Next プラグイン:
next.config.tsをcreateNextIntlPlugin()でラップします(テンプレートは こちら)。 - Step 7: インターセプター: アセットフィルタリングマッチャーを備えた
proxy.ts(Next 16+)またはmiddleware.ts(Next <=15)を作成します(テンプレートは こちら)。 - Step 8: スターター辞書: サポートされているすべてのロケールに対して、
messages/[locale].jsonが存在し、ベースラインとなるキーが揃っていることを確認します。 - Step 9: レイアウトとルートの移行: トップレベルのルートを
app/[locale]/に移動します。動的なdir、lang、generateStaticParams、および<NextIntlClientProvider>を設定します(テンプレートは こちら)。 - Step 10: 型拡張:
global.d.tsにAppConfig.Messagesを宣言します(テンプレートは こちら)。 - Step 11: ナビゲーションインポートの更新: 既存のコンポーネント内の内部リンクを
@/i18n/navigationを使用するように更新します。 - Step 12: 検証: 検証スクリプトとビルドを実行します。
pwsh .agents/skills/nextjs-i18n-setup/scripts/verify-setup.ps1 -Quiet pnpm run build
3. セットアップ実行レポートテンプレート
## 🌐 Next.js i18n セットアップ実行レポート
| ステップ / コンポーネント | 対象ファイル | ステータス | 備考 |
| :------------------------- | :------------------------------- | :------------------------------ | :------------------- |
| **パッケージ** | `package.json`(`next-intl`) | `[IMPLEMENTED]` / `[UNTOUCHED]` | ランタイムインストール |
| **プロジェクト設定** | `docs/project.json` | `[IMPLEMENTED]` / `[UNTOUCHED]` | メッセージディレクトリ設定 |
| **ルーティング** | `i18n/routing.ts` | `[IMPLEMENTED]` / `[UNTOUCHED]` | ロケールとデフォルト |
| **リクエスト** | `i18n/request.ts` | `[IMPLEMENTED]` / `[UNTOUCHED]` | next/root-params |
| **ナビゲーション** | `i18n/navigation.ts` | `[IMPLEMENTED]` / `[UNTOUCHED]` | 純粋な TS ヘルパー |
| **プラグイン** | `next.config.ts` | `[IMPLEMENTED]` / `[UNTOUCHED]` | withNextIntl でラップ |
| **インターセプター** | `proxy.ts` / `middleware.ts` | `[IMPLEMENTED]` / `[UNTOUCHED]` | ルートマッチャー |
| **辞書** | `messages/[locale].json` | `[IMPLEMENTED]` / `[UNTOUCHED]` | スターター辞書 |
| **レイアウト** | `app/[locale]/layout.tsx` | `[IMPLEMENTED]` / `[UNTOUCHED]` | 静的パラメータとプロバイダ |
| **型** | `global.d.ts` | `[IMPLEMENTED]` / `[UNTOUCHED]` | AppConfig 拡張 |
| **検証** | `verify-setup.ps1` & ビルド | `[PASSED]` | クリーンビルド |