多言語対応
6m 21s
既存のライブラリは重く、Cache との相性も悪いためスクラッチします。
多言語対応の仕組み
- 翻訳文と型を定義
- ブラウザからユーザーの言語を取得(初回のみ)
- 言語パスにリダイレクト(/ja, /en)
- URLに基づいて表示言語を切り替え
- 言語変更時はブラウザの Cookie に保存し、以降はCookieの値を使用
URLの言語階層('/ja', '/en')は Proxy や ライブラリ を使うことで隠蔽できます。このガイドでは隠蔽する方法を紹介します。
関連ファイル
最終的に以下のファイルで構成されます。
翻訳文の定義
まずデフォルト言語の翻訳文を定義します。
次に、デフォルト言語をベースに言語の型を定義します。
型を使用してその他の言語の翻訳文を定義します。型安全でメッセージを定義できます。
以後、あらゆるテキストは翻訳文に定義したキーを使用して取得します。
言語の取得とリダイレクト
Proxy 用のルーティングヘルパーを作成します。このヘルパーはリダイレクトとパスの言語階層を隠蔽します。
Proxy のミドルウェアでこの関数を呼び出します。
これにより、Cookie、もしくはブラウザの言語設定に応じて適切な言語パスにリダイレクトします。
翻訳テキストの使用
翻訳テキストを取得するためのヘルパー関数を作成します。
レイアウト、画面で言語を取得し、キャッシュする
まず、すべての画面やレイアウトは /[locale] パス配下に配置します。
ルートレイアウト
ルートレイアウトは必要なので空で用意します、
メインレイアウト
これが実質的なルートレイアウトになります。動的パラメーターを使用して言語を取得し、設定します。内部的に React Cache を使用するため、サーバーサイドでのレンダリング中に下位コンポーネントはキャッシュされた言語情報にアクセスできます。
各画面
各画面も同様に動的パラメーターを使用して言語を取得し、設定します。Next.js では Layout と Page が並列で処理されるため、Page の方が先に処理されるケースに備えて Page 側でも言語情報をキャッシュする必要があります。
getMessageにより既存の言語に応じた翻訳テキストを取得できます。generateMetadataを使ってメタデータを生成します。generateStaticParamsを使って静的パラメーターを生成します。
クライアント用プロバイダーの作成
クライアントで翻訳メッセージを使用するためのプロバイダーを作成します。
次にメインレイアウトにプロバイダーを設置します。
これによりクライアントコンポーネントから翻訳テキストを取得できます。
表示言語の切り替え
切り替えコンポーネントを作成し、任意の場所で使用します。