国際化(i18n)ルーティング
Next.jsはv10.0.0
から国際化(i18n)ルーティングの組み込みサポートを提供しています。ロケールのリスト、デフォルトロケール、ドメイン固有のロケールを指定すると、Next.jsが自動的にルーティングを処理します。
現在のi18nルーティングサポートは、react-intl
、react-i18next
、lingui
、rosetta
、next-intl
、next-translate
、next-multilingual
、tolgee
、paraglide-next
などの既存のi18nライブラリソリューションを補完することを目的としており、ルートとロケールの解析を合理化します。
はじめに
開始するには、next.config.js
ファイルにi18n
の設定を追加します。
ロケールはUTS ロケール識別子で、ロケールを定義するための標準化された形式です。
通常、ロケール識別子は、ダッシュで区切られた言語、地域、スクリプトで構成されます:language-region-script
。地域とスクリプトはオプションです。例:
en-US
- アメリカ合衆国で話されている英語nl-NL
- オランダで話されているオランダ語nl
- オランダ語、特定の地域なし
ユーザーのロケールがnl-BE
で、設定に記載されていない場合、利用可能であればnl
に、そうでない場合はデフォルトロケールにリダイレクトされます。
国の全地域をサポートする予定がない場合、フォールバックとして機能する国のロケールを含めることをお勧めします。
ロケール戦略
ロケール処理戦略には、サブパスルーティングとドメインルーティングの2つがあります。
サブパスルーティング
サブパスルーティングは、URLパスにロケールを配置します。
上記の設定では、en-US
、fr
、nl-NL
がルーティング可能で、en-US
がデフォルトロケールになります。pages/blog.js
がある場合、以下のURLが利用可能になります:
/blog
/fr/blog
/nl-nl/blog
デフォルトロケールには接頭辞がありません。
ドメインルーティング
ドメインルーティングを使用すると、異なるドメインからロケールを提供できます:
例えば、pages/blog.js
がある場合、以下のURLが利用可能になります:
example.com/blog
www.example.com/blog
example.fr/blog
example.nl/blog
example.nl/nl-BE/blog
自動ロケール検出
ユーザーがアプリケーションのルート(通常は/
)にアクセスすると、Next.jsはAccept-Language
ヘッダーと現在のドメインに基づいて、ユーザーが好むロケールを自動的に検出しようとします。
デフォルトロケール以外のロケールが検出された場合、ユーザーは以下のいずれかにリダイレクトされます:
- サブパスルーティングを使用する場合: ロケール接頭辞のパス
- ドメインルーティングを使用する場合: そのロケールをデフォルトとして処理するドメイン
ドメインルーティングを使用する場合、Accept-Language
ヘッダーがfr;q=0.9
のユーザーがexample.com
にアクセスすると、そのドメインがデフォルトでfr
ロケールを処理するため、example.fr
にリダイレクトされます。
サブパスルーティングを使用する場合、ユーザーは/fr
にリダイレクトされます。
デフォルトロケールの接頭辞付け
Next.js 12とミドルウェアを使用すると、ワークアラウンドによってデフォルトロケールに接頭辞を追加できます。
例えば、以下は数か国語をサポートするnext.config.js
ファイルです。「default」ロケールが意図的に追加されていることに注意してください。
次に、ミドルウェアを使用してカスタムルーティングルールを追加できます:
このミドルウェアは、APIルートや、フォントや画像などの公開ファイルへの接頭辞の追加をスキップします。デフォルトロケールへのリクエストがある場合、/en
にリダイレクトします。
自動ロケール検出の無効化
自動ロケール検出は、以下のように無効にできます:
localeDetection
がfalse
に設定されている場合、Next.jsはユーザーの優先ロケールに基づいて自動的にリダイレクトしなくなり、上記で説明したロケールベースのドメインまたはロケールパスから検出されたロケール情報のみを提供します。
ロケール情報へのアクセス
Next.jsルーターを通じてロケール情報にアクセスできます。例えば、useRouter()
フックを使用すると、以下のプロパティが利用可能です:
locale
:現在アクティブなロケールを含みます。locales
:設定されているすべてのロケールを含みます。defaultLocale
:設定されているデフォルトロケールを含みます。
getStaticProps
またはgetServerSideProps
で事前レンダリングするページでは、関数に提供されるコンテキストにロケール情報が提供されます。
getStaticPaths
を利用する場合、設定されたロケールは関数のコンテキストパラメーターのlocales
で提供され、設定されたデフォルトロケールはdefaultLocale
で提供されます。
ロケール間の遷移
next/link
またはnext/router
を使用してロケール間を移動できます。
next/link
の場合、現在のロケールとは異なるロケールに遷移するためにlocale
プロップを指定できます。locale
プロップが提供されない場合、クライアント遷移中は現在のアクティブなlocale
が使用されます。例:
next/router
メソッドを直接使用する場合、遷移オプションを通じて使用するlocale
を指定できます。例:
動的ルートのクエリ値や非表示のhrefクエリ値などのルーティング情報をすべて保持しながら、locale
のみを切り替える場合は、href
パラメーターをオブジェクトとして提供できます:
router.push
のオブジェクト構造の詳細はこちらを参照してください。
すでにロケールを含むhref
がある場合、ロケールプレフィックスの自動処理を無効にできます:
NEXT_LOCALE
クッキーの活用
Next.jsでは、accept-languageヘッダーよりも優先されるNEXT_LOCALE=the-locale
クッキーの設定を許可しています。このクッキーは言語切り替えを使用して設定でき、ユーザーがサイトに戻ってきたときに、/
からの適切なロケール位置にリダイレクトする際にクッキーで指定されたロケールを活用します。
例えば、ユーザーのaccept-languageヘッダーでfr
ロケールを希望していても、NEXT_LOCALE=en
クッキーが設定されている場合、/
を訪問する際はen
ロケールにリダイレクトされ、クッキーが削除または期限切れになるまでその状態が続きます。
検索エンジン最適化
Next.jsはユーザーが訪問している言語を把握しているため、自動的に<html>
タグにlang
属性を追加します。
Next.jsはページの variants を認識できないため、next/head
を使用してhreflang
メタタグを追加する必要があります。hreflang
の詳細はGoogle Webmasters ドキュメントで確認できます。
静的生成とどのように連携するか
注意:国際化ルーティングは、Next.jsのルーティングレイヤーを利用しない
output: 'export'
と統合されません。output: 'export'
を使用しないハイブリッドNext.jsアプリケーションは完全にサポートされています。
動的ルートとgetStaticProps
ページ
動的ルートでgetStaticProps
を使用するページの場合、事前レンダリングする必要があるページのすべてのロケールバリアントをgetStaticPaths
から返す必要があります。paths
に返されるparams
オブジェクトとともに、レンダリングしたいロケールを指定するlocale
フィールドも返すことができます。例:
自動的に静的に最適化されたページと非動的getStaticProps
ページについては、ページの各ロケール用のバージョンが生成されます。これは、getStaticProps
内で構成されているロケールの数に応じてビルド時間が増加する可能性があるため、考慮することが重要です。
例えば、50のロケールと10の非動的getStaticProps
ページがある場合、getStaticProps
は500回呼び出され、10ページの50バージョンが各ビルド中に生成されます。
getStaticProps
を使用する動的ページのビルド時間を短縮するには、fallback
モードを使用してください。これにより、ビルド中に最も人気のあるパスとロケールのみをgetStaticPaths
から返すことができます。その後、Next.jsは要求に応じてランタイムで残りのページをビルドします。
自動的に静的に最適化されたページ
自動的に静的に最適化されたページについては、ページの各ロケール用のバージョンが生成されます。
非動的 getStaticProps ページ
非動的getStaticProps
ページの場合、上記と同様に各ロケール用のバージョンが生成されます。getStaticProps
は、レンダリングされる各locale
で呼び出されます。特定のロケールを事前レンダリングから除外したい場合は、getStaticProps
からnotFound: true
を返すことで、そのページのバリアントは生成されません。
i18n設定の制限
locales
:合計100ロケールdomains
:合計100ロケールドメインアイテム
補足:これらの制限は、ビルド時のパフォーマンス問題を防ぐために初期に追加されました。Next.js 12のミドルウェアを使用するカスタムルーティングでこれらの制限を回避できます。