このページとあなたの好きなAIアシスタントを使ってドキュメントを要約します
バージョン履歴
- 初版v7.0.02025/11/1
このページのコンテンツはAIを使用して翻訳されました。
英語の元のコンテンツの最新バージョンを見るこのドキュメントを改善するアイデアがある場合は、GitHubでプルリクエストを送信することで自由に貢献してください。
ドキュメントへのGitHubリンクドキュメントのMarkdownをクリップボードにコピー
2025年版 next-intl を使った Next.js アプリケーションの国際化方法
目次
next-intl とは?
next-intl は、Next.js の App Router 向けに特別に設計された人気の国際化(i18n)ライブラリです。優れた TypeScript サポートと組み込みの最適化機能を備え、多言語対応の Next.js アプリケーションをシームレスに構築する方法を提供します。
ご希望であれば、next-i18next ガイドや、直接 Intlayer を参照することもできます。
比較については、next-i18next vs next-intl vs Intlayer をご覧ください。
これらのライブラリがどのように生まれたのかを知るには、JavaScript i18n の歴史をご覧ください。
Next.js における next-intl のベンチマーク結果
翻訳を実装する前に、next-intl のパフォーマンス特性を理解しておくことが重要です。i18n ベンチマーク は、10 ページ・10 ロケールの同じ Next.js アプリケーションをさまざまな構成とライブラリで評価し、実際のバンドルサイズ、文字列の漏れ、ハイドレーションのオーバーヘッドを測定しています。
指標
動的な JSON 読み込み
実行時に翻訳を遅延読み込みします
スコープ付き JSON (ネームスペース)
ページごとの翻訳ネームスペース
この指標は何ですか?
国際化ライブラリバンドルの合計gzip圧縮サイズ。これには、ツリーシェイキングと縮小化(minification)後のプロバイダーとコンテンツ取得ロジックのみが含まれます。
なぜ重要なのか?
ライブラリのサイズが小さければ初期 JavaScript ペイロードが削減され、クライアント側でのダウンロードと実行が高速化されます।
表示形式
Next.js における next-intl の主要な数値 (gzip):
テーブルをモーダルで開き、すべてのデータを明確に表示
| 構成 | ライブラリサイズ | ページ JS 平均 | 他ロケールの漏れ | 他ページの漏れ |
|---|---|---|---|---|
| ベース (i18n なし) | - | 141.0 KB | 0.0% | 0.0% |
next-intl | 14.7 KB | 153.6 KB | 4.2% | 89.8% |
@intlayer/next-intl (compat) | 8.0 KB | 148.7 KB | 0.0% | 0.0% |
next-intlayer (ネイティブ Intlayer) | 5.5 KB | 141.3 KB | 0.0% | 0.0% |
ポイント:
- グローバルなメッセージカタログを避ける: すべてのメッセージをルートレイアウトで読み込む標準的な構成では、ブラウザに送られる翻訳コンテンツの約 89.8% が他のページのものです。ルートごとに
pick(messages, ['namespace'])を使えばこの漏れはなくなりますが、手動でのメンテナンスが必要です。 - ランタイムの重さ:
next-intlのランタイムは各ページに約 14.7 KB (gzip) を追加します。既存のnext-intlアプリでは、@intlayer/next-intlcompat アダプターが同じフック (useTranslations、useFormatterなど) を維持したまま、ランタイムを約 8.0 KB、漏れ 0% に抑えます。ネイティブのnext-intlayerなら 5.5 KB まで削減できます。
全データはこちら: Next.js ベンチマークレポート、および ベンチマークリポジトリ。
Next.js での機能比較
Next.js App Router プロジェクトで一般的に必要となる機能について、next-intl を next-i18next および Intlayer と比較します:
テーブルをモーダルで開き、すべてのデータを明確に表示
| 機能 | next-intlayer (Intlayer) | next-intl | next-i18next |
|---|---|---|---|
| コンポーネントの近くに翻訳を配置 | ✅ 各コンポーネントとコンテンツを同じ場所に配置 | ❌ 集中管理された JSON | ❌ 集中管理された JSON |
| TypeScript 統合 | ✅ 自動生成される厳密な型 | ✅ 良好、AppConfig の拡張による | ⚠️ 基本的 |
| 翻訳漏れの検出 | ✅ TypeScript エラーとビルド時の警告 | ⚠️ ランタイムでのフォールバック | ⚠️ ランタイムでのフォールバック |
| リッチコンテンツ (JSX、Markdown) | ✅ 直接サポート | ⚠️ t.rich によるタグ、Markdown なし | ⚠️ <Trans> によるタグ |
| AI 翻訳 | ✅ 独自のプロバイダーと API キー、アプリのコンテキスト付き | ❌ なし | ❌ なし |
| ビジュアルエディター / CMS | ✅ ローカルのビジュアルエディター + オプションの CMS | ❌ 外部プラットフォーム経由 | ❌ 外部プラットフォーム経由 |
| ローカライズされたルーティング | ✅ 組み込み (Next.js と Vite) | ✅ 組み込みの [locale] セグメント | ✅ 組み込み |
| 複数形 | ✅ 列挙ベース | ✅ ICU | ✅ サフィックスベース (_one、_other) |
| フォーマット (日付、数値、通貨) | ✅ Intl ベースのフォーマッター | ✅ useFormatter | ✅ Intl ベース |
| コンテンツ形式 | ✅ .ts, .tsx, .js, .json, .md, .yaml | ✅ .json, .js, .ts | ⚠️ .json |
| ICU MessageFormat | ✅ format: "icu" 経由 | ✅ ネイティブ | ⚠️ i18next-icu 経由 |
| SEO ヘルパー (hreflang、sitemap) | ✅ メタデータ、sitemap、robots.txt のヘルパー | ✅ 良好 | ✅ 良好 |
| Server Components | ✅ 任意の Server Component で直接アクセス | ⚠️ コンポーネントごとに t または await getTranslations() を渡す | ⚠️ コンポーネントツリーに t を渡していく |
| コンポーネント単位の tree-shaking | ✅ ビルド時 (Babel / SWC) | ⚠️ 手動、ルートごとに pick() | ⚠️ 手動、ルートごとに名前空間 |
| 遅延読み込み | ✅ ロケール単位と辞書単位 | ✅ ロケール単位、名前空間は手動管理 | ✅ ロケール単位、名前空間は手動管理 |
| ランタイムサイズ (gzip、ベンチマーク) | 4.9 KB | 14.7 KB | 19.7 KB |
| CI での翻訳漏れ検出 | ✅ npx intlayer test | ⚠️ 組み込みなし | ⚠️ 組み込みなし、ランタイムで saveMissing |
| エコシステム / コミュニティ | ⚠️ 小さいが急成長中 | ✅ 大きい | ✅ 非常に大きい |
ランタイムサイズは Next.js ベンチマーク によるものです。詳しい解説は next-i18next vs next-intl vs Intlayer をご覧ください。
守るべきプラクティス
実装に入る前に、以下のプラクティスを守ることをお勧めします:
- HTMLの
langとdir属性を設定する
レイアウト内でgetLocaleDirection(locale)を使ってdirを計算し、適切なアクセシビリティとSEOのために<html lang={locale} dir={dir}>を設定します。 - メッセージをネームスペースごとに分割する
ロケールとネームスペースごとにJSONファイルを整理し(例:common.json、about.json)、必要なものだけを読み込みます。 - クライアントのペイロードを最小化する
ページ上では、必要なネームスペースのみをNextIntlClientProviderに送信します(例:pick(messages, ['common', 'about']))。 - 静的ページを優先する
パフォーマンスとSEO向上のために、可能な限り静的ページを使用します。 - サーバーコンポーネントでのi18n
サーバーコンポーネントは、ページやclientとしてマークされていないすべてのコンポーネントのように静的であり、ビルド時にプリレンダリングできます。したがって、翻訳関数をプロップとして渡す必要があります。 - TypeScriptの型設定
アプリケーション全体で型安全を確保するために、ロケールの型を設定します。 - リダイレクト用プロキシ
ロケール検出とルーティングを処理し、ユーザーを適切なロケール接頭辞付きURLにリダイレクトするためにプロキシを使用します。 - メタデータ、サイトマップ、robots.txtの国際化
Next.jsが提供するgenerateMetadata関数を使用して、メタデータ、サイトマップ、robots.txtを国際化し、すべてのロケールで検索エンジンによるより良い検出を確保します。 - リンクのローカライズ
Linkコンポーネントを使用してリンクをローカライズし、ユーザーを適切なロケール接頭辞付きURLにリダイレクトします。すべてのロケールでページの発見性を確保することが重要です。 - テストと翻訳の自動化 テストと翻訳の自動化は、多言語アプリケーションのメンテナンスにかかる時間を削減します。
国際化とSEOに関して知っておくべきすべてをまとめたドキュメントをご覧ください: next-intlによる国際化 (i18n)。
Next.jsアプリケーションでnext-intlをセットアップするステップバイステップガイド
GitHub の Application Template を参照してください。
これから作成するプロジェクト構造は以下の通りです:
コードをクリップボードにコピー
依存関係のインストール
npmを使って必要なパッケージをインストールします:
bashコードをコピーコードをクリップボードにコピー
- next-intl: Next.js App Router向けのコア国際化ライブラリで、翻訳管理のためのフック、サーバー関数、クライアントプロバイダーを提供します。
プロジェクトの設定
サポートするロケールを定義し、next-intlのリクエスト設定を行う設定ファイルを作成します。このファイルはi18n設定の単一の信頼できる情報源として機能し、アプリケーション全体で型安全性を保証します。
ロケール設定を一元化することで不整合を防ぎ、将来的にロケールの追加や削除を容易にします。
getRequestConfig関数はすべてのリクエストで実行され、各ページに必要な翻訳のみを読み込むため、コード分割が可能になりバンドルサイズを削減します。src/i18n.tsコードをコピーコードをクリップボードにコピー
動的ロケールルートの定義
ロケールごとの動的ルーティングを設定するために、アプリフォルダ内に
[locale]ディレクトリを作成します。これにより、Next.js はロケールベースのルーティングを処理でき、各ロケールが URL セグメント(例:/en/about、/fr/about)になります。動的ルートを使用することで、Next.js はビルド時にすべてのロケールの静的ページを生成でき、パフォーマンスとSEOが向上します。レイアウトコンポーネントは、ロケールに基づいて HTML の
langとdir属性を設定し、アクセシビリティや検索エンジンの理解に重要です。src/app/[locale]/layout.tsxコードをコピーコードをクリップボードにコピー
src/app/[locale]/about/page.tsxコードをコピーコードをクリップボードにコピー
翻訳ファイルを作成する
各ロケールと名前空間ごとにJSONファイルを作成します。この構造により、翻訳を論理的に整理し、各ページに必要なものだけを読み込むことができます。
名前空間ごとに翻訳を整理することで(例:
common.json、about.json)、コード分割が可能になり、バンドルサイズを削減できます。これにより、各ページに必要な翻訳のみを読み込むため、パフォーマンスが向上します。locales/en/common.jsonコードをコピーコードをクリップボードにコピー
locales/fr/common.jsonコードをコピーコードをクリップボードにコピー
locales/en/about.jsonコードをコピーコードをクリップボードにコピー
locales/fr/about.jsonコードをコピーコードをクリップボードにコピー
ページで翻訳を利用する
サーバーで翻訳を読み込み、それをサーバーコンポーネントとクライアントコンポーネントの両方に渡すページコンポーネントを作成します。これにより、レンダリング前に翻訳が読み込まれ、コンテンツのフラッシュを防止します。
サーバーサイドでの翻訳読み込みはSEOを向上させ、FOUC(未翻訳コンテンツのフラッシュ)を防ぎます。
pickを使用して必要な名前空間のみをクライアントプロバイダーに送ることで、ブラウザに送信されるJavaScriptバンドルを最小化します。src/app/[locale]/about/page.tsxコードをコピーコードをクリップボードにコピー
クライアントコンポーネントでの翻訳の使用
クライアントコンポーネントは、
useTranslationsとuseFormatterフックを使用して翻訳およびフォーマット関数にアクセスできます。これらのフックはNextIntlClientProviderコンテキストから読み取ります。クライアントコンポーネントは翻訳にアクセスするために React フックを必要とします。
useTranslationsとuseFormatterフックは next-intl とシームレスに統合されており、ロケールが変更された際にリアクティブに更新されます。ページのクライアントメッセージに必要な名前空間を追加することを忘れないでください(クライアントコンポーネントが実際に必要とする名前空間のみを含めてください)。
src/components/ClientComponent.tsxコードをコピーコードをクリップボードにコピー
サーバーコンポーネントでの翻訳の使用
サーバーコンポーネントは React フックを使用できないため、親コンポーネントから props 経由で翻訳とフォーマッターを受け取ります。この方法により、サーバーコンポーネントは同期的に保たれ、クライアントコンポーネント内にネストすることが可能になります。
クライアント境界内にネストされる可能性のあるサーバーコンポーネントは同期的である必要があります。翻訳済みの文字列やフォーマット済みの値をpropsとして渡すことで、非同期処理を回避し、適切なレンダリングを保証します。親のページコンポーネントで翻訳とフォーマットを事前に計算してください。
src/components/ServerComponent.tsxコードをコピーコードをクリップボードにコピー
ページやレイアウト内で、
next-intl/serverからgetTranslationsとgetFormatterを使用して翻訳とフォーマットを事前計算し、それらを props としてサーバーコンポーネントに渡してください。コンテンツの言語を変更する
オプションnext-intl を使ってコンテンツの言語を変更するには、同じパス名を指しながらロケールを切り替えるロケール対応リンクをレンダリングします。プロバイダーが URL を自動的に書き換えるため、現在のルートをターゲットにするだけで済みます。
src/components/LocaleSwitcher.tsxコードをコピーコードをクリップボードにコピー
ローカライズされたLinkコンポーネントを使用する
オプションnext-intlは、アクティブなロケールを自動的に適用するローカライズされたリンクコンポーネントを含むサブパッケージnext-intl/navigationを提供しています。これはすでに@/i18nファイルで抽出してあるので、以下のように使用できます。src/components/MyComponent.tsxコードをコピーコードをクリップボードにコピー
Server Actions内でアクティブなロケールにアクセスする
オプションServer Actionsは
next-intl/serverを使用して現在のロケールを読み取ることができます。これはローカライズされたメールを送信したり、送信されたデータと共に言語設定を保存したりするのに便利です。src/app/actions/get-current-locale.tsコードをコピーコードをクリップボードにコピー
getLocaleはnext-intlプロキシによって設定されたロケールを読み取るため、サーバーのどこでも動作します:ルートハンドラー、サーバーアクション、およびエッジ関数。メタデータの国際化
オプションコンテンツの翻訳は重要ですが、国際化の主な目的はあなたのウェブサイトを世界により見えるようにすることです。I18nは適切なSEOを通じてウェブサイトの可視性を向上させるための強力な手段です。
適切に国際化されたメタデータは、検索エンジンがあなたのページで利用可能な言語を理解するのに役立ちます。これには、hreflangメタタグの設定、タイトルや説明の翻訳、そして各ロケールに対して正しいカノニカルURLが設定されていることの確認が含まれます。
src/app/[locale]/about/layout.tsxコードをコピーコードをクリップボードにコピー
サイトマップの国際化
オプションすべてのロケールバージョンのページを含むサイトマップを生成します。これにより、検索エンジンがすべての言語バージョンのコンテンツを検出し、インデックス化するのに役立ちます。
適切に国際化されたサイトマップは、検索エンジンがすべての言語バージョンのページを見つけてインデックス化できるようにします。これにより、国際的な検索結果での可視性が向上します。
src/app/sitemap.tsコードをコピーコードをクリップボードにコピー
robots.txtの多言語対応
オプション保護されたルートのすべてのロケールバージョンを適切に処理するrobots.txtファイルを作成します。これにより、検索エンジンが管理者ページやダッシュボードページをどの言語でもインデックスしないようにできます。
すべてのロケールに対してrobots.txtを適切に設定することで、ルートがロケールごとに異なる場合でも、検索エンジンが機密ページをインデックスするのを防ぎます。
src/app/robots.tsコードをコピーコードをクリップボードにコピー
ロケールルーティングのためのプロキシ設定
オプションユーザーの優先ロケールを自動的に検出し、適切なロケールプレフィックス付きURLへリダイレクトするプロキシを作成します。next-intlはこれを自動で処理する便利なプロキシ関数を提供しています。
プロキシは、ユーザーがサイトを訪れた際に自動的に好みの言語にリダイレクトされることを保証します。また、ユーザーの言語設定を保存し、次回以降の訪問時にユーザーエクスペリエンスを向上させます。
src/proxy.tsコードをコピーコードをクリップボードにコピー
ロケール用のTypeScript型を設定する
オプションTypeScriptを設定すると、キーのオートコンプリートと型安全性が得られます。
そのために、プロジェクトのルートに global.ts ファイルを作成し、以下のコードを追加できます。
global.tsコードをコピーコードをクリップボードにコピー
このコードはモジュール拡張(Module Augmentation)を使用して、locales と messages を next-intl の AppConfig 型に追加します。
Intlayerを使って翻訳を自動化する
オプションIntlayerは、アプリケーションのローカリゼーションプロセスを支援するために設計された無料かつオープンソースのライブラリです。next-intlが翻訳の読み込みと管理を担当する一方で、Intlayerは翻訳ワークフローの自動化を支援します。
翻訳を手動で管理することは時間がかかり、エラーが発生しやすい作業です。Intlayerは翻訳のテスト、生成、管理を自動化し、時間を節約するとともに、アプリケーション全体での一貫性を確保します。
Intlayerは以下のことを可能にします:
コードベース内の好きな場所でコンテンツを宣言する Intlayerは
.content.{ts|js|json}ファイルを使用して、コードベース内の好きな場所でコンテンツを宣言することを可能にします。これにより、コンテンツの整理が向上し、コードベースの可読性と保守性が高まります。不足している翻訳のテスト Intlayerは、CI/CDパイプラインやユニットテストに統合できるテスト機能を提供します。詳細は翻訳のテストをご覧ください。
翻訳の自動化 Intlayerは、翻訳を自動化するためのCLIとVSCode拡張機能を提供します。これらはCI/CDパイプラインに統合可能です。詳細は翻訳の自動化をご覧ください。 ご自身のAPIキーとお好みのAIプロバイダーを使用できます。また、コンテキストに応じた翻訳も提供します。詳細はコンテンツの自動補完をご覧ください。
外部コンテンツの接続 Intlayerは、外部のコンテンツ管理システム(CMS)にコンテンツを接続することを可能にします。最適化された方法でコンテンツを取得し、JSONリソースに挿入します。詳細は外部コンテンツの取得についてをご覧ください。
ビジュアルエディター
Intlayerは、ビジュアルエディターを使用してコンテンツを編集できる無料のビジュアルエディターを提供しています。詳細は翻訳のビジュアル編集についてをご覧ください。
その他にも多数の機能があります。Intlayerが提供するすべての機能を知るには、Intlayerの利点に関するドキュメントをご参照ください。
詳細なパフォーマンスベンチマークと比較については、以下を参照してください:
コメント
まだコメントはありません。最初のコメントを共有しましょう。
