このページとあなたの好きなAIアシスタントを使ってドキュメントを要約します
バージョン履歴
- "ルートの head 関数におけるメタデータ辞書の静的解決・動的解決・キャッシュ付き動的解決を比較"v9.4.02026/8/25
- "Solid の useIntlayer API の使用法を直接プロパティアクセスに更新"v8.9.02026/5/4
- "プリレンダリングとサイトマップの追加"v8.6.02026/3/29
- "initコマンドを追加"v7.5.92025/12/30
- "validatePrefixを導入し、ステップ14「ローカライズされたルートでの404ページの処理」を追加。"v7.4.02025/12/11
- "ステップ13「サーバーアクションでのロケールの取得(任意)」を追加。"v7.3.92025/12/5
- "ステップ13「Nitroの適応」を追加。"v7.2.32025/11/18
- "getPrefix関数の追加、useLocalizedNavigate、LocaleSwitcher、LocalizedLinkの使用により、デフォルトのプレフィックスを修正。"v7.1.02025/11/17
- "ドキュメントの更新"v6.5.22025/10/3
- "TanStack Start向けに追加"v5.8.12025/9/9
このページのコンテンツはAIを使用して翻訳されました。
英語の元のコンテンツの最新バージョンを見るこのドキュメントを改善するアイデアがある場合は、GitHubでプルリクエストを送信することで自由に貢献してください。
ドキュメントへのGitHubリンクドキュメントのMarkdownをクリップボードにコピー
Intlayerを使用してTanStack Startウェブサイトを翻訳する | 国際化(i18n)
目次
このガイドでは、ロケール対応のルーティング、TypeScriptサポート、および最新の開発手法を使用して、TanStack StartプロジェクトにIntlayerをシームレスに統合し、国際化を実現する方法を説明します。
代替手段ではなく Interlayer を使用する理由
「react-i18next」、「use-intl」、または「paraglide」などの主要なソリューションと比較して、Intlayer は次のような統合された最適化を備えたソリューションです。
Intlayer は TanStack Start 用に完全に最適化されており、多言語ルーティング、Cookie 管理、サイトマップ生成、動的コンテンツ読み込み、および国際化 (i18n) の取り組みを拡張するために必要なすべての機能を提供します。
大量の JSON ファイルをページにロードするのではなく、必要なコンテンツのみをロードします。 Intlayer は、バンドルとページのサイズを最大 50% 削減するのに役立ちます。
アプリケーションのコンテンツのスコープを設定すると、大規模なアプリケーションの メンテナンスが容易になります。コンテンツ コードベース全体を確認するという精神的な負担を負うことなく、単一の機能フォルダーを複製または削除できます。さらに、Intlayer は完全に型指定されており、コンテンツの正確性を保証します。
コンテンツを同じ場所に配置すると、大規模言語モデル (LLM) によって 必要なコンテキストが削減されます。 Intlayer には、翻訳の欠落をテストする CLI、LSP、MCP などのツール スイートも付属しています。および agent skills により、AI エージェントの開発者エクスペリエンス (DX) がさらにスムーズになります。
AI プロバイダーの費用で、選択した LLM を使用して CI/CD パイプラインで自動化を変換します。 Intlayer は、コンテンツ抽出を自動化する コンパイラー と、バックグラウンドでの翻訳を支援する Web プラットフォーム も提供します。
大量の JSON ファイルをコンポーネントに接続すると、パフォーマンスと反応性の問題が発生する可能性があります。 Intlayer は、ビルド時のコンテンツの読み込みを最適化します。
Intlayer は単なる i18n ソリューションではなく、自己ホスト型 ビジュアル エディター と 完全な CMS を提供します。 リアルタイムで多言語コンテンツを管理できるようになり、翻訳者、コピーライター、その他のチーム メンバーとのコラボレーションがシームレスになります。コンテンツはローカルおよび/またはリモートに保存できます。
TanStack StartアプリケーションでIntlayerをセットアップするためのステップバイステップガイド
GitHubのアプリケーションテンプレートを参照してください。
プロジェクトの作成
まず、TanStack Startウェブサイトのプロジェクトの開始ガイドに従って、新しいTanStack Startプロジェクトを作成します。
Intlayerパッケージのインストール
好みのパッケージマネージャーを使用して、必要なパッケージをインストールします:
bashコードをコピーコードをクリップボードにコピー
--interactiveフラグはオプションです。AI エージェントの場合はintlayer-cli initを使用してください。このコマンドは環境を検出し、必要なパッケージをインストールします。例えば:
bashコードをコピーコードをクリップボードにコピー
プロジェクトの構成
アーキテクチャ
このアーキテクチャでは、ローカライズされたすべてのルートが
{-$locale}ルートセグメントの下に配置されます。このアプローチにより、各言語が専用のURLを持つことが保証され、自動ロケールプレフィックス、バリデーション、およびSEOの最適化が可能になります。bashコードをコピーコードをクリップボードにコピー
設定
アプリケーションの言語を構成するための設定ファイルを作成します:
intlayer.config.tsコードをコピーコードをクリップボードにコピー
この構成ファイルを通じて、ローカライズされたURL、ミドルウェアのリダイレクト、クッキー名、コンテンツ宣言の場所と拡張子、コンソールでのIntlayerログの無効化などを設定できます。利用可能なパラメータの完全なリストについては、構成ドキュメントを参照してください。
Vite構成へのIntlayerの統合
構成にintlayerプラグインを追加します:
vite.config.tsコードをコピーコードをクリップボードにコピー
intlayer()Viteプラグインは、IntlayerをViteと統合するために使用されます。コンテンツ宣言ファイルの構築を確実にし、開発モードでそれらを監視します。Viteアプリケーション内でIntlayer環境変数を定義します。さらに、パフォーマンスを最適化するためのエイリアスを提供します。ルートレイアウトの作成
useParamsを使用して現在のロケールを検出し、htmlタグにlangおよびdir属性を設定することで、国際化をサポートするようにルートレイアウトを構成します。src/routes/__root.tsxコードをコピーコードをクリップボードにコピー
ロケールレイアウトの作成
ロケール接頭辞を処理し、検証を実行するレイアウトを作成します。
src/routes/{-$locale}/route.tsxコードをコピーコードをクリップボードにコピー
ここで、
{-$locale}は現在のロケールに置き換えられる動的なルートパラメータです。この記法によりスロットがオプションになり、'prefix-no-default'などのルーティングモードで動作できるようになります。同じルートで複数の動的セグメントを使用する場合(例:
/{-$locale}/other-path/$anotherDynamicPath/...)、このスロットが問題を引き起こす可能性があることに注意してください。'prefix-all'モードの場合、スロットを$localeに切り替えることをお勧めします。'no-prefix'または'search-params'モードの場合、スロットを完全に削除できます。コンテンツの宣言
翻訳を保存するためのコンテンツ宣言を作成および管理します:
src/contents/page.content.tsコードをコピーコードをクリップボードにコピー
コンテンツ宣言は、
contentDirディレクトリ(デフォルトでは./app)に含まれている限り、アプリケーションのどこでも定義できます。また、コンテンツ宣言ファイルの拡張子(デフォルトでは.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml})と一致する必要があります。詳細については、コンテンツ宣言ドキュメントを参照してください。
ロケール対応コンポーネントとフックの作成
ロケール対応のナビゲーションのための
LocalizedLinkコンポーネントを作成します:src/components/localized-link.tsxコードをコピーコードをクリップボードにコピー
このコンポーネントには2つの目的があります:
- URLから不要な
{-$locale}接頭辞を削除します。 - ロケールパラメータをURLに挿入して、ユーザーがローカライズされたルートに直接リダイレクトされるようにします。
次に、プログラムによるナビゲーションのための
useLocalizedNavigateフックを作成できます:src/hooks/useLocalizedNavigate.tsxコードをコピーコードをクリップボードにコピー
- URLから不要な
ページでのIntlayerの利用
コンポーネント内では既定で
useIntlayerを使用してください。コンパイラがレンダリング対象のロケールへ解決してくれるため、これが推奨される方法です。getIntlayer/getIntlayerAsyncは React ツリーの外側(ルートのhead、ローダー、サーバー関数)でのみ使用します。アプリケーション全体でコンテンツ辞書にアクセスします:
ローカライズされたホームページ
src/routes/{-$locale}/index.tsxコードをコピーコードをクリップボードにコピー
alt、title、href、aria-labelなどのstring属性でコンテンツを使用する場合、関数の値を次のように使用できます:tsxコードをコピーコードをクリップボードにコピー
useIntlayerhook の詳細については、ドキュメントを参照してください。ロケール切り替えコンポーネントを作成する
ユーザーが言語を変更できるようにするコンポーネントを作成します:
src/components/locale-switcher.tsxコードをコピーコードをクリップボードにコピー
useLocalehook の詳細については、ドキュメントを参照してください。HTML 属性管理
ステップ 5 で見たように、ルートコンポーネントで
useParamsを使用してhtmlタグのlangとdir属性を管理できます。これにより、サーバーとクライアントで正しい属性が設定されます。src/routes/__root.tsxコードをコピーコードをクリップボードにコピー
ミドルウェアを追加する
intlayerProxyを使用して、アプリケーションにサーバー側のルーティングを追加することもできます。このプラグインは URL に基づいて現在のロケールを自動的に検出し、適切なロケール cookie を設定します。ロケールが指定されていない場合、プラグインはユーザーのブラウザ言語設定に基づいて最も適切なロケールを決定します。ロケールが検出されない場合、デフォルトロケールにリダイレクトされます。本番環境で
intlayerProxyを使用するには、vite-intlayerパッケージをdevDependenciesからdependenciesに切り替える必要があります。Intlayer v9 以降では、
intlayerProxy()はintlayer()プラグインに直接バンドルされ、routing.enableProxyオプション(デフォルトでtrue)を通じてデフォルトで有効になっています。以下に示すように、別途登録することは今や任意です: これは後方互換性と、プラグイン順序を制御する必要があるセットアップのために保持されています。オプトアウトするにはrouting.enableProxy: falseを設定してください。v9 リリースノートを参照してください。vite.config.tsコードをコピーコードをクリップボードにコピー
メタデータを国際化する
getIntlayerはマージされたディクショナリに対して同期的に解決します。これはすべての宣言されたロケールを保持しているものです。headは同期のままで何も待機しませんが、多言語ディクショナリ全体がブラウザに送信されるルートチャンクに含まれます。src/routes/{-$locale}/index.tsxコードをコピーコードをクリップボードにコピー
小さなメタデータディクショナリ、少数のロケール、またはプロトタイピング中に最適です。
getIntlayerAsync(v9.4 から利用可能)はgetIntlayerのような動作をしますが、ビルドプラグインはマージされたディクショナリではなく、.intlayer/dynamic_dictionaries/のロケール別チャンクを指します。したがって、ページはそれがレンダリングするロケールのみを配信します。そのチャンクはオンデマンドで読み込まれるため、headはasyncになります:src/routes/{-$locale}/index.tsxコードをコピーコードをクリップボードにコピー
headが複数のディクショナリを読む場合、Promise.allで解決してください: 各getIntlayerAsyncを独自の行で待機すると、リクエストが並行実行ではなく直列実行されます。トレードオフ: 動的インポートは
headが実行されている間に、ドキュメントレンダリングの重大パス上で解決されます。コールドルートでは、これにより head を数ミリ秒遅延させ、LCP をわずかに低下させる可能性があります。ルート
loaderでディクショナリを解決し、headでloaderDataから読み直してください。マッチされたルートのローダーは並行実行され、staleTime: Infinityは TanStack Router に結果が決してstaleにならないことを伝えるため、ロケール別チャンクは一度解決され、その後ルーターキャッシュから提供されるため、headは同期のままです。src/routes/{-$locale}/index.tsxコードをコピーコードをクリップボードにコピー
headはローダーが確定する前に呼び出される可能性があるため、loaderDataはundefinedの可能性があるとして型付けされています。オプショナルチェーニングを保持するか、フォールバックタイトルを返してください。head の重大パスでその コストを支払うことなく、ロケール別チャンクを保持します。代金は開発者体験です: コンテンツは
loaderDataを通じてローダーからheadに明示的にスレッド処理される必要があります。どの解決方法を選ぶべき?
テーブルのすべての内容を表示テーブルをモーダルで開き、すべてのデータを明確に表示
静的解決 動的解決 キャッシュされた動的解決 API getIntlayergetIntlayerAsync(v9.4+)getIntlayerAsyncinloader(v9.4+)headsignaturesynchronous asyncsynchronous, reads loaderDataLocales shipped every declared locale requested locale only requested locale only Client navigations nothing to resolve re-entered on every match served from the router cache Developer experience simplest one awaitcontent threaded through loaderDataサーバーアクションでロケールを取得する
サーバーアクションまたはAPIエンドポイント内から現在のロケールにアクセスしたい場合があります。
intlayerからgetLocaleヘルパーを使用してこれを実行できます。TanStack Start のサーバー関数を使用した例を示します:
src/routes/{-$locale}/index.tsxコードをコピーコードをクリップボードにコピー
見つからないページを管理する
ユーザーが存在しないページにアクセスした場合、カスタムの 404 ページを表示できます。ロケールプレフィックスは、見つからないページがトリガーされる方法に影響を与える可能性があります。
ロケール接頭辞を使用した TanStack Router の 404 処理の理解
TanStack Router では、ローカライズされたルートでの 404 ページの処理には多層的なアプローチが必要です:
- 専用の 404 ルート: 404 UI を表示するための特定のルート
- ルートレベルの検証: ロケール接頭辞を検証し、無効なものを 404 にリダイレクトします
- キャッチオールルート: ロケールセグメント内の一致しないパスをすべてキャプチャします
src/routes/{-$locale}/404.tsxコードをコピーコードをクリップボードにコピー
src/routes/{-$locale}/route.tsxコードをコピーコードをクリップボードにコピー
src/routes/{-$locale}/$.tsxコードをコピーコードをクリップボードにコピー
コンポーネントのコンテンツを抽出する
オプション既存のコードベースがある場合、数千のファイルを変換するのは時間がかかることがあります。
このプロセスを容易にするために、Intlayer は、コンポーネントを変換しコンテンツを抽出するための コンパイラ / エクストラクタ を提供しています。
セットアップするには、
intlayer.config.tsファイルにcompilerセクションを追加します:intlayer.config.tsコードをコピーコードをクリップボードにコピー
import { type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { // ... 他の構成 compiler: { /** * コンパイラを有効にするかどうかを指定します。 */ enabled: true, /** * 出力ファイルのパスを定義します。 */ output: ({ fileName, extension }) => `./${fileName}${extension}`, /** * 変換後にコンポーネントを保存するかどうかを指定します。 * * - `true` の場合、コンパイラはディスク上のコンポーネントファイルを書き換えます。変換は永続的になり、次回のプロセスではスキップされます。これにより、アプリの変換後にコンパイラを削除できます。 * * - `false` の場合、コンパイラはビルド出力のコードにのみ `useIntlayer()` 関数呼び出しを注入し、元のコードベースはそのまま維持します。変換はメモリ内でのみ行われます。 */ saveComponents: false, /** * 辞書キーの接頭辞 */ dictionaryKeyPrefix: "", }, }; export default config;コンポーネントを変換してコンテンツを抽出するためにエクストラクタを実行します
bashコードをコピーコードをクリップボードにコピー
v9 以降、
intlayerCompilerはintlayerプラグインに含まれています。そのため、手動で追加する必要はありません。vite.config.tsを更新してintlayerCompilerプラグインを含めます:vite.config.tsコードをコピーコードをクリップボードにコピー
bashコードをコピーコードをクリップボードにコピー
プリレンダリングとサイトマップ生成
Intlayer には、アプリケーションのサイトマップを簡単に作成できるサイトマップ ジェネレーターが組み込まれています。ローカライズされたルートを処理し、検索エンジンに必要なメタデータを追加します。
Intlayer によって生成されたサイトマップは、
xhtml:link名前空間 (Hreflang XML Extensions) をサポートしています。生の URL のみを表示するデフォルトのサイトマップ ジェネレーターとは異なり、Intlayer はページのすべての言語バージョン (例:/about、/about?lang=fr、/about?lang=es) 間に必要な双方向リンクを自動的に作成します。これにより、検索エンジンが正しい言語バージョンを正しい対象者に正しくインデックス付けして提供できるようになります。これを使用するには、まず
vite.config.tsを構成して、ローカライズされたルートのプリレンダリングを有効にし、デフォルトの TanStack Start サイトマップ生成を無効にする必要があります。vite.config.tsコードをコピーコードをクリップボードにコピー
次に、
generateSitemap関数を使用するsrc/routes/sitemap[.]xml.tsルートを作成します。src/routes/sitemap[.]xml.tsコードをコピーコードをクリップボードにコピー
TypeScriptの構成
Intlayer はモジュール拡張機能を利用して、TypeScript の利点を活用し、コードベースを強化します。
TypeScript の構成に自動生成された型が含まれていることを確認してください:
tsconfig.jsonコードをコピーコードをクリップボードにコピー
Git Configuration
Intlayerによって生成されたファイルを無視することをお勧めします。これにより、Gitリポジトリにコミットするのを避けることができます。
これを行うには、.gitignoreファイルに以下の指示を追加できます:
コードをクリップボードにコピー
VS Code Extension
Intlayer での開発体験を向上させるために、公式の Intlayer VS Code Extension をインストールできます。
この拡張機能は以下を提供します:
- 翻訳キーの自動補完。
- 欠落している翻訳のリアルタイムエラー検出。
- 翻訳されたコンテンツのインラインプレビュー。
- 翻訳を簡単に作成・更新するクイックアクション。
拡張機能の使用方法の詳細については、Intlayer VS Code Extension ドキュメントを参照してください。
さらに進む
さらに進むために、ビジュアルエディターを実装するか、CMSを使用してコンテンツを外部化することができます。
ドキュメント参考資料
よくある質問
TanStack Start には独自の i18n レイヤーが付属していないため、ライブラリを選択する必要があります:
i18next/react-i18nextおよびreact-intl:フレームワークに依存しないメッセージカタログで、ルーターに手動で接続します。Lingui:ICU メッセージとコンパイルステップ。Paraglide:コンパイル済みメッセージで、メッセージレイヤーのみに焦点を当てています。Intlayer:最も高度なソリューション。コンテンツはコードベースの任意の場所で宣言でき(各コンポーネントの隣またはセントラライズ)、ビルド時にコンパイルされ、型付きキー、ロケール対応ルーティング、サイトマップ生成、AI 翻訳、ビジュアルエディター、CMS を備えています。
TanStack Start で重要な違いはルーティングとサーバーレンダリングです。Intlayer はファイルベースのルーター、head 関数、プリレンダーパスと統合され、プロバイダー、ロケール検出器、サイトマップを手動で組み立てる必要がありません。Intlayer を選ぶ理由と TanStack Start i18n ベンチマークを参照してください。
はい、2 つのパスがあります。react-i18next 移行ガイドまたは i18next 移行ガイドを使用してコンテンツを段階的に移行できます。または、現在の API を完全に保持できます:互換性アダプターは react-i18next、react-intl、i18next と同じ API を公開しますが、Intlayer 辞書によって提供されるため、インポートは変わりますがコンポーネントコードは変わりません。
はい。sync JSON プラグインは /messages/{locale}/{namespace}.json ファイルを真実のソースとして保持し、双方向で Intlayer 辞書を生成します。sync PO プラグインは gettext カタログに対して同じことを行い、ロケールごとのファイルではロケールを 1 つのファイルにグループ化する代わりに言語ごとにコンテンツを分割できます。
いいえ。npx intlayer extract を実行すると、Intlayer はコンポーネントを読み込み、ユーザーに見える文字列を抽出し、各コンポーネントの隣に .content ファイルを書き込むため、文字列を 1 つずつカタログにコピーする代わりに diff を確認できます。このガイドのステップ 15 でそれを説明しています。
完全に自動化されたパイプラインの場合、Intlayer Compilerはビルド時に同じことを行います:変更のたびに JSX、TSX、Vue、Svelte ソースをスキャンし、辞書を生成し、ホットモジュール置換を通じて同期を保つため、手動で保守するキーはまったくありません。
コンパイラをオンにする前に知っておく価値のある 2 つの制限があります。静的分析によって機能するため、API エラーコードや CMS フィールドなど、実行時にのみ存在する文字列は到達不可能なままです。また、className="active" やステータスコードなどのアプリケーションロジックからユーザーに見える文字列を区別する必要があり、大規模なコードベースではいくつかのアノテーションが必要です。extract コマンドはループに保つことでその両方を回避します。
5 つのツール、すべてオプションです:
- VS Code 拡張機能:
useIntlayerキーからそれを宣言するコンテンツファイルにジャンプし、コンポーネントからコンテンツを抽出し、コマンドパレットまたは専用の Intlayer タブからビルド、フィル、テスト、プッシュ、プルを実行します。 - LSP サーバー:LSP を話す任意のエディターで同じ認識を持ち、定義へのジャンプ、すべての参照を検索、翻訳値のホバープレビュー、キーとフィールドのオートコンプリート、キーがどこにも宣言されていない場合の警告があります。また、
i18next、react-i18next、next-intl、use-intl呼び出しを解決し、移行中に役立ちます。 - MCP サーバー:Intlayer ドキュメントと CLI を Cursor、VS Code、Claude Desktop、Claude Code、ChatGPT に公開し、アシスタントが推測する代わりに現在のドキュメントから回答でき、
intlayer fillなどのコマンドを自分で実行できます。 - エージェントスキル:
intlayer-config、intlayer-cli、intlayer-contentなどの焦点を絞ったスキル、およびフレームワークごとに 1 つ、ルーティング設定とコンテンツノードタイプをエージェントに教えます。 - ESLint プラグイン:
no-raw-textはハードコードされた文字列にフラグを立て、静的辞書キーと未使用コンテンツのさらなるルールがあります。
