Next.js i18n 設定(nextjs-i18n-setup)
將 next-intl 引導並建置於現有的 Next.js App Router 專案中,使用現代 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+:使用
- 現代根參數: 在
i18n/request.ts中使用next/root-params(await rootParams.locale())。禁止使用已棄用的requestLocale與setRequestLocale()。 - 導航: 從
i18n/navigation.ts匯出Link、redirect、usePathname、useRouter(純 TypeScript,無 JSX)。 - 靜態生成: 根佈局
app/[locale]/layout.tsx必須匯出generateStaticParams(),為所有支援的地區設定傳回{ locale }。
2. 設定檢查清單
- 步驟 0:審計:檢查
docs/project.json(supported_languages)以及package.json中的 Next.js 版本。 - 步驟 1:安裝:執行
<pkg_mgr> add next-intl(pnpm add next-intl)。 - 步驟 2:組態中繼資料:確保
docs/project.json中有dictionaries_dir: "messages"。 - 步驟 3:路由:使用
defineRouting建立i18n/routing.ts(請參閱範本)。 - 步驟 4:請求處理:使用
next/root-params建立i18n/request.ts(請參閱範本)。 - 步驟 5:導航輔助函式:建立
i18n/navigation.ts(請參閱範本)。 - 步驟 6:Next.js 外掛:使用
createNextIntlPlugin()包裹next.config.ts(請參閱範本)。 - 步驟 7:攔截器:建立
proxy.ts(Next 16+)或middleware.ts(Next ≤15),並包含靜態資源過濾匹配器(請參閱範本)。 - 步驟 8:起始字典:確保所有支援的地區設定都存在
messages/[locale].json,且具有一致的基礎鍵值。 - 步驟 9:遷移佈局與路由:將頂層路由移至
app/[locale]/。設定動態dir、lang、generateStaticParams以及<NextIntlClientProvider>(請參閱範本)。 - 步驟 10:型別擴充:在
global.d.ts中宣告AppConfig.Messages(請參閱範本)。 - 步驟 11:導航匯入:更新現有元件中的內部連結,改用
@/i18n/navigation。 - 步驟 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]` | 靜態參數與 provider |
| **型別** | `global.d.ts` | `[IMPLEMENTED]` / `[UNTOUCHED]` | AppConfig 擴充 |
| **驗證** | `verify-setup.ps1` 與建置 | `[PASSED]` | 乾淨建置 |