このページとあなたの好きな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 は次のような統合された最適化を備えたソリューションです。
TanStack Start を完全にカバー
Intlayer は TanStack Start 用に完全に最適化されており、多言語ルーティング、Cookie 管理、サイトマップ生成、動的コンテンツ読み込み、および国際化 (i18n) の取り組みを拡張するために必要なすべての機能を提供します。
バンドルサイズ
大量の JSON ファイルをページにロードするのではなく、必要なコンテンツのみをロードします。 Intlayer は、バンドルとページのサイズを最大 50% 削減するのに役立ちます。
保守性
アプリケーションのコンテンツのスコープを設定すると、大規模なアプリケーションの メンテナンスが容易になります。コンテンツ コードベース全体を確認するという精神的な負担を負うことなく、単一の機能フォルダーを複製または削除できます。さらに、Intlayer は完全に型指定されており、コンテンツの正確性を保証します。
AI エージェント
コンテンツを同じ場所に配置すると、大規模言語モデル (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パッケージのインストール
好みのパッケージマネージャーを使用して、必要なパッケージをインストールします:
コードをクリップボードにコピー
--interactiveフラグはオプションです。AI エージェントの場合はintlayer-cli initを使用してください。
このコマンドは環境を検出し、必要なパッケージをインストールします。例えば:
コードをクリップボードにコピー
プロジェクトの構成
アプリケーションの言語を構成するための設定ファイルを作成します:
コードをクリップボードにコピー
この構成ファイルを通じて、ローカライズされたURL、ミドルウェアのリダイレクト、クッキー名、コンテンツ宣言の場所と拡張子、コンソールでのIntlayerログの無効化などを設定できます。利用可能なパラメータの完全なリストについては、構成ドキュメントを参照してください。
Vite構成へのIntlayerの統合
構成にintlayerプラグインを追加します:
コードをクリップボードにコピー
intlayer() Viteプラグインは、IntlayerをViteと統合するために使用されます。コンテンツ宣言ファイルの構築を確実にし、開発モードでそれらを監視します。Viteアプリケーション内でIntlayer環境変数を定義します。さらに、パフォーマンスを最適化するためのエイリアスを提供します。
ルートレイアウトの作成
useParamsを使用して現在のロケールを検出し、htmlタグにlangおよびdir属性を設定することで、国際化をサポートするようにルートレイアウトを構成します。
コードをクリップボードにコピー
ロケールレイアウトの作成
ロケール接頭辞を処理し、検証を実行するレイアウトを作成します。
コードをクリップボードにコピー
ここで、{-$locale}は現在のロケールに置き換えられる動的なルートパラメータです。この記法によりスロットがオプションになり、'prefix-no-default'などのルーティングモードで動作できるようになります。
同じルートで複数の動的セグメントを使用する場合(例:
/{-$locale}/other-path/$anotherDynamicPath/...)、このスロットが問題を引き起こす可能性があることに注意してください。'prefix-all'モードの場合、スロットを$localeに切り替えることをお勧めします。'no-prefix'または'search-params'モードの場合、スロットを完全に削除できます。
コンテンツの宣言
翻訳を保存するためのコンテンツ宣言を作成および管理します:
コードをクリップボードにコピー
コンテンツ宣言は、contentDirディレクトリ(デフォルトでは./app)に含まれている限り、アプリケーションのどこでも定義できます。また、コンテンツ宣言ファイルの拡張子(デフォルトでは.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml})と一致する必要があります。
詳細については、コンテンツ宣言ドキュメントを参照してください。
ロケール対応コンポーネントとフックの作成
ロケール対応のナビゲーションのための LocalizedLink コンポーネントを作成します:
コードをクリップボードにコピー
このコンポーネントには2つの目的があります:
- URLから不要な
{-$locale}接頭辞を削除します。 - ロケールパラメータをURLに挿入して、ユーザーがローカライズされたルートに直接リダイレクトされるようにします。
次に、プログラムによるナビゲーションのための useLocalizedNavigate フックを作成できます:
コードをクリップボードにコピー
ページでのIntlayerの利用
コンポーネント内では既定でuseIntlayerを使用してください。コンパイラがレンダリング対象のロケールへ解決してくれるため、これが推奨される方法です。getIntlayer/getIntlayerAsyncは React ツリーの外側(ルートのhead、ローダー、サーバー関数)でのみ使用します。
アプリケーション全体でコンテンツ辞書にアクセスします:
ローカライズされたホームページ
コードをクリップボードにコピー
alt、title、href、aria-labelなどのstring属性でコンテンツを使用する場合、関数の値を次のように使用できます:htmlコードをコピーコードをクリップボードにコピー
useIntlayer hook の詳細については、ドキュメントを参照してください。
ロケール切り替えコンポーネントを作成する
ユーザーが言語を変更できるようにするコンポーネントを作成します:
コードをクリップボードにコピー
useLocale hook の詳細については、ドキュメントを参照してください。
HTML 属性管理
ステップ 5 で見たように、ルートコンポーネントで useParams を使用して html タグの lang と dir 属性を管理できます。これにより、サーバーとクライアントで正しい属性が設定されます。
コードをクリップボードにコピー
ミドルウェアを追加する
intlayerProxy を使用して、アプリケーションにサーバー側のルーティングを追加することもできます。このプラグインは URL に基づいて現在のロケールを自動的に検出し、適切なロケール cookie を設定します。ロケールが指定されていない場合、プラグインはユーザーのブラウザ言語設定に基づいて最も適切なロケールを決定します。ロケールが検出されない場合、デフォルトロケールにリダイレクトされます。
本番環境でintlayerProxyを使用するには、vite-intlayerパッケージをdevDependenciesからdependenciesに切り替える必要があります。
Intlayer v9 以降では、intlayerProxy()はintlayer()プラグインに直接バンドルされ、routing.enableProxyオプション(デフォルトでtrue)を通じてデフォルトで有効になっています。以下に示すように、別途登録することは今や任意です: これは後方互換性と、プラグイン順序を制御する必要があるセットアップのために保持されています。オプトアウトするにはrouting.enableProxy: falseを設定してください。v9 リリースノートを参照してください。
コードをクリップボードにコピー
メタデータを国際化する
getIntlayer はマージされたディクショナリに対して同期的に解決します。これはすべての宣言されたロケールを保持しているものです。head は同期のままで何も待機しませんが、多言語ディクショナリ全体がブラウザに送信されるルートチャンクに含まれます。
コードをクリップボードにコピー
小さなメタデータディクショナリ、少数のロケール、またはプロトタイピング中に最適です。
getIntlayerAsync(v9.4 から利用可能)は getIntlayer のような動作をしますが、ビルドプラグインはマージされたディクショナリではなく、.intlayer/dynamic_dictionaries/ のロケール別チャンクを指します。したがって、ページはそれがレンダリングするロケールのみを配信します。そのチャンクはオンデマンドで読み込まれるため、head は async になります:
コードをクリップボードにコピー
headが複数のディクショナリを読む場合、Promise.allで解決してください: 各getIntlayerAsyncを独自の行で待機すると、リクエストが並行実行ではなく直列実行されます。
トレードオフ: 動的インポートは head が実行されている間に、ドキュメントレンダリングの重大パス上で解決されます。コールドルートでは、これにより head を数ミリ秒遅延させ、LCP をわずかに低下させる可能性があります。
ルート loader でディクショナリを解決し、head で loaderData から読み直してください。マッチされたルートのローダーは並行実行され、staleTime: Infinity は TanStack Router に結果が決してstaleにならないことを伝えるため、ロケール別チャンクは一度解決され、その後ルーターキャッシュから提供されるため、head は同期のままです。
コードをクリップボードにコピー
headはローダーが確定する前に呼び出される可能性があるため、loaderDataはundefinedの可能性があるとして型付けされています。オプショナルチェーニングを保持するか、フォールバックタイトルを返してください。
head の重大パスでその コストを支払うことなく、ロケール別チャンクを保持します。代金は開発者体験です: コンテンツは loaderData を通じてローダーから head に明示的にスレッド処理される必要があります。
どの解決方法を選ぶべき?
テーブルをモーダルで開き、すべてのデータを明確に表示
| 静的解決 | 動的解決 | キャッシュされた動的解決 | |
|---|---|---|---|
| API | getIntlayer | getIntlayerAsync (v9.4+) | getIntlayerAsync in loader (v9.4+) |
head signature | synchronous | async | synchronous, reads loaderData |
| Locales 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 await | content threaded through loaderData |
サーバーアクションでロケールを取得する
サーバーアクションまたはAPIエンドポイント内から現在のロケールにアクセスしたい場合があります。
intlayer から getLocale ヘルパーを使用してこれを実行できます。
TanStack Start のサーバー関数を使用した例を示します:
コードをクリップボードにコピー
見つからないページを管理する
ユーザーが存在しないページにアクセスした場合、カスタム見つからないページを表示できます。ロケールプレフィックスは見つからないページがトリガーされる方法に影響を与える可能性があります。
ローカライズされたホームページ
string属性(alt、title、href、aria-labelなど)でコンテンツを使用したい場合は、関数の値を次のように使用できます:htmlコードをコピーコードをクリップボードにコピー
useIntlayerフックの詳細については、ドキュメントを参照してください。
コードをクリップボードにコピー
useLocaleフックの詳細については、ドキュメントを参照してください。
</Step>
HTML属性の管理
return ( {/* ... _/} ); } {/_ ... */} </html> ); }
export const Route = createFileRoute("/{-$locale}/")({ component: RouteComponent, head: async ({ params }) => { const { locale = defaultLocale } = params; const path = "/"; // The path for this route
コードをクリップボードにコピー
コードをクリップボードにコピー
サーバーアクションでのロケールの取得
サーバーアクションやAPIエンドポイント内から現在のロケールにアクセスしたい場合があります。
Intlayerの getLocale ヘルパーを使用してこれを行うことができます。
以下は、TanStack Startのサーバー関数を使用した例です:
コードをクリップボードにコピー
`
「見つかりませんでした」ページの管理
ユーザーが存在しないページにアクセスしたときにカスタムの404ページを表示できます。ロケール接頭辞は、404ページがトリガーされる方法に影響を与える可能性があります。
ロケール接頭辞を使用したTanStack Routerの404処理の理解
TanStack Routerでは、ローカライズされたルートでの404ページの処理には多層的なアプローチが必要です:
- 専用の404ルート: 404 UIを表示するための特定のルート
- ルートレベルの検証: ロケール接頭辞を検証し、無効なものを404にリダイレクトします
- キャッチオールルート: ロケールセグメント内の一致しないパスをすべてキャプチャします
コードをクリップボードにコピー
コードをクリップボードにコピー
コードをクリップボードにコピー
コンポーネントのコンテンツを抽出する
オプション既存のコードベースがある場合、数千のファイルを変換するのは時間がかかることがあります。
このプロセスを容易にするために、Intlayerは、コンポーネントを変換しコンテンツを抽出するための コンパイラ / エクストラクタ を提案しています。
セットアップするには、intlayer.config.ts ファイルに compiler セクションを追加します。
コードをクリップボードにコピー
コンポーネントを変換してコンテンツを抽出するためにエクストラクタを実行します
コードをクリップボードにコピー
bun x intlayer extract import { intlayer, intlayerCompiler } from "vite-intlayer"; import { defineConfig } from "vite"; import { devtools } from "@tanstack/devtools-vite"; import { tanstackStart } from "@tanstack/react-start/plugin/vite"; import viteReact from "@vitejs/plugin-react";
export default defineConfig({ plugins: [
コードをクリップボードにコピー
], });
コードをクリップボードにコピー
bash packageManager="npm" npm run build # または npm run dev
コードをクリップボードにコピー
bash packageManager="pnpm" pnpm run build # または pnpm run dev
コードをクリップボードにコピー
bash packageManager="yarn" yarn build # Or yarn dev
コードをクリップボードにコピー
bash packageManager="bun"
- BLOCK 2 of 3 - 英語(en)のソース
- BLOCK 2 of 3 - 日本語(ja)の現在の翻訳
その後、監査を実施し、完全に更新された日本語ファイルを返します。---
bun run build # またはbun run dev import { localeFlatMap } from "intlayer"; // ... その他のインポート
export default defineConfig({ plugins: [
コードをクリップボードにコピー
], });
コードをクリップボードにコピー
`typescript fileName="src/routes/sitemap[.]xml.ts"
export const Route = createFileRoute("/sitemap.xml")({ server: {
コードをクリップボードにコピー
}, }); { // ... 既存の構成 include: [
コードをクリップボードにコピー
], }
Git Configuration
Intlayerによって生成されたファイルを無視することをお勧めします。これにより、Gitリポジトリにコミットするのを避けることができます。
これを行うには、.gitignoreファイルに以下の指示を追加できます:
コードをクリップボードにコピー
`
VS Code Extension
Intlayer での開発体験を向上させるために、公式の Intlayer VS Code Extension をインストールできます。
この拡張機能は以下を提供します:
- 翻訳キーの自動補完。
- 欠落している翻訳のリアルタイムエラー検出。
- 翻訳されたコンテンツのインラインプレビュー。
- 翻訳を簡単に作成・更新するクイックアクション。
拡張機能の使用方法の詳細については、Intlayer VS Code Extension ドキュメントを参照してください。
さらに進む
さらに進むために、ビジュアルエディターを実装するか、CMSを使用してコンテンツを外部化することができます。
