このページとあなたの好きなAIアシスタントを使ってドキュメントを要約します
バージョン履歴
- "ルートの head 関数におけるメタデータ辞書の静的解決・動的解決・キャッシュ付き動的解決を比較"v9.4.02026/8/25
- "Solid の useIntlayer API の使用法を直接プロパティアクセスに更新"v8.9.02026/5/4
- "Tanstack Start Solid.js用に追加"v8.5.12026/3/25
このページのコンテンツはAIを使用して翻訳されました。
英語の元のコンテンツの最新バージョンを見るこのドキュメントを改善するアイデアがある場合は、GitHubでプルリクエストを送信することで自由に貢献してください。
ドキュメントへのGitHubリンクドキュメントのMarkdownをクリップボードにコピー
Intlayerを使用してTanstack Start + Solid.jsウェブサイトを翻訳する | 国際化 (i18n)
目次
このガイドでは、Solid.jsを使用したTanstack Startプロジェクトにおいて、Intlayerを統合してシームレスな国際化、ロケール対応ルーティング、TypeScriptサポート、および現代的な開発手法を実現する方法を説明します。
代替手段ではなく Interlayer を使用する理由
「react-i18next」や「i18next」などの主要なソリューションと比較して、Intlayer は次のような統合された最適化を備えたソリューションです。
Intlayer は、多言語ルーティング、サイトマップ、および国際化の拡張 (i18n) に必要なすべての機能を提供することにより、TanStack Start および Solid と完全に連携するように最適化されています。
大量の 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コードをコピーコードをクリップボードにコピー
プロジェクトの構成
アプリケーションの言語を構成するための構成ファイルを作成します:
intlayer.config.tsコードをコピーコードをクリップボードにコピー
この構成ファイルを通じて、ローカライズされたURL、ミドルウェアのリダイレクト、Cookie名、コンテンツ宣言の場所と拡張子、コンソールでのIntlayerログの無効化などを設定できます。利用可能なパラメータの完全なリストについては、構成ドキュメントを参照してください。
Vite構成にIntlayerを統合する
Vite構成に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/LocalizedLink.tsxコードをコピーコードをクリップボードにコピー
このコンポーネントには2つの目的があります:
- URLから不要な
{-$locale}プレフィックスを削除する。 - ユーザーがローカライズされたルートに直接リダイレクトされるように、URLにロケールパラメータを注入する。
次に、プログラムによるナビゲーションのための
useLocalizedNavigateフックを作成します:src/hooks/useLocalizedNavigate.tsxコードをコピーコードをクリップボードにコピー
- URLから不要な
ページでIntlayerを活用する
コンポーネント内では既定で
useIntlayerを使用してください。コンパイラがレンダリング対象のロケールへ解決してくれるため、これが推奨される方法です。getIntlayer/getIntlayerAsyncは Solid ツリーの外側(ルートのhead、ローダー、サーバー関数)でのみ使用します。アプリケーション全体でコンテンツ辞書にアクセスします:
ローカライズされたホームページ
src/routes/{-$locale}/index.tsxコードをコピーコードをクリップボードにコピー
htmlコードをコピーコードをクリップボードにコピー
Solidでは、
useIntlayerはリアクティブなコンテンツ(例:content)を返します。そのプロパティに直接アクセスできます。useIntlayerフックの詳細については、ドキュメントを参照してください。ロケール切り替えコンポーネントの作成
ユーザーが言語を変更できるようにするコンポーネントを作成します:
src/components/LocaleSwitcher.tsxコードをコピーコードをクリップボードにコピー
Solidでは、
useLocaleからのlocaleは シグナルアクセサー です。現在の値をリアクティブに読み取るには、locale()(括弧付き) を使用します。useLocaleフックの詳細については、ドキュメントを参照してください。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コードをコピーコードをクリップボードにコピー
1 つの
headで複数の辞書を読む場合はPromise.allでまとめて解決してください。getIntlayerAsyncを 1 行ずつ await すると、リクエストが並列ではなく直列に連鎖してしまいます。トレードオフとして、動的インポートはドキュメントレンダリングのクリティカルパス上で
headの実行中に解決されます。コールドなルートではheadが数ミリ秒遅れ、LCP がわずかに悪化する可能性があります。辞書をルートの
loaderで解決し、headではloaderDataから読み戻します。マッチしたルートのローダーは並行して実行され、staleTime: Infinityによって TanStack Router は結果が古くならないと判断します。つまりロケール別チャンクは一度だけ解決され、以降はルーターのキャッシュから提供されるため、headは同期のままです。src/routes/{-$locale}/index.tsxコードをコピーコードをクリップボードにコピー
headはローダーの解決前に呼ばれることがあるため、loaderDataはundefinedの可能性がある型になります。オプショナルチェーンを残すか、フォールバックのタイトルを返してください。ロケール別チャンクの利点を保ちつつ、そのコストを
headのクリティカルパスで支払わずに済みます。代償は DX です。コンテンツをローダーからheadへloaderData経由で明示的に受け渡す必要があります。どの解決方法を選ぶべきか
テーブルのすべての内容を表示テーブルをモーダルで開き、すべてのデータを明確に表示
静的解決 動的解決 キャッシュ付き動的解決 API getIntlayergetIntlayerAsync(v9.4+)loader内のgetIntlayerAsync(v9.4+)headのシグネチャ同期 async同期、 loaderDataを読む配信されるロケール 宣言されたすべてのロケール 要求されたロケールのみ 要求されたロケールのみ クライアント遷移 解決するものなし マッチのたびに再実行 ルーターのキャッシュから提供 DX 最もシンプル awaitが 1 つコンテンツを loaderData経由で受け渡しサーバーアクションでロケールを取得する
サーバーアクションやAPIエンドポイント内から現在のロケールにアクセスしたい場合があります。 これを行うには、
intlayerからgetLocaleヘルパーを使用します。TanStack Startのサーバー関数を使用した例を次に示します:
src/routes/{-$locale}/index.tsxコードをコピーコードをクリップボードにコピー
404ページを管理する
ユーザーが存在しないページにアクセスしたときに、カスタム 404 ページを表示できます。ロケールプレフィックスは、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コードをコピーコードをクリップボードにコピー
Since v9, the
intlayerCompileris included in theintlayerplugin. So you don't need to add it manually.intlayerCompilerプラグインを含めるようにvite.config.tsを更新します:vite.config.tsコードをコピーコードをクリップボードにコピー
bashコードをコピーコードをクリップボードにコピー
サイトマップの生成
Intlayer によって生成されたサイトマップは、
xhtml:link名前空間 (Hreflang XML Extensions) をサポートしています。生の URL のみを表示するデフォルトのサイトマップ ジェネレーターとは異なり、Intlayer はページのすべての言語バージョン (例:/about、/about?lang=fr、/about?lang=es) 間に必要な双方向リンクを自動的に作成します。これにより、検索エンジンが正しい言語バージョンを正しい対象者に正しくインデックス付けして提供できるようになります。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の利点を活用し、コードベースをより強固にするために、モジュール拡張(module augmentation)を使用します。
TypeScript構成に自動生成された型が含まれていることを確認してください:
tsconfig.jsonコードをコピーコードをクリップボードにコピー
Git構成
Intlayerによって生成されたファイルを無視することをお勧めします。これにより、それらをGitリポジトリにコミットすることを避けることができます。
これを行うには、.gitignore ファイルに次の指示を追加します:
コードをクリップボードにコピー
VS Code 拡張機能
Intlayerでの開発体験を向上させるために、公式の Intlayer VS Code 拡張機能 をインストールできます。
この拡張機能は以下を提供します:
- 翻訳キーの オートコンプリート。
- 不足している翻訳の リアルタイムエラー検出。
- 翻訳されたコンテンツの インラインプレビュー。
- 翻訳を簡単に作成および更新するための クイックアクション。
拡張機能の使用方法の詳細については、Intlayer VS Code 拡張機能ドキュメント を参照してください。
さらに進む
さらに進むには、ビジュアルエディタを実装したり、CMSを使用してコンテンツを外部化したりできます。
ドキュメント参照
よくある質問
TanStack Start には i18n レイヤーが付属していないため、Solid エコシステムのオプションは限定的です:
@solid-primitives/i18n: フラットな辞書で、ルーターに自分で組み込む必要があります。i18nextと Solid ラッパー: 成熟したカタログですが、TanStack ルーター、head関数、プリレンダリングパスとの統合がありません。Paraglide: コンパイルされたメッセージで、メッセージレイヤーのみに焦点を当てています。Intlayer: 最も高度なソリューション。コンテンツはコードベースの任意の場所で宣言でき(各コンポーネントの隣またはセントラライズ)、ビルド時にコンパイルされます。ロケール対応ルーティング、サイトマップ生成、AI 翻訳、ビジュアルエディター、CMS を備えています。
Intlayer を選ぶ理由と TanStack Start i18n ベンチマークを参照してください。
ほぼ可能です。i18next 移行ガイドに従ってコンテンツを移動してください。段階的に移行することもできます:sync JSON プラグインは既存の JSON カタログを信頼できるソースとして保ち、それらから Intlayer 辞書を生成するため、両方のレイヤーは同期を保ちながらコンポーネントを一度に 1 つずつ移動できます。
はい。sync JSON プラグインは /messages/{locale}/{namespace}.json ファイルを信頼できるソースとして保ち、双方向で Intlayer 辞書を生成します。sync PO プラグインは gettext カタログに対して同じことを行い、ロケールごとのファイルでは 1 つのファイルにロケールをグループ化する代わりに言語ごとにコンテンツを分割できます。
いいえ。npx intlayer extract を実行すると、Intlayer はコンポーネントを読み込み、ユーザーに見える文字列を抽出し、各コンポーネントの隣に .content ファイルを書き込むため、カタログに文字列を 1 つずつコピーする代わりに差分をレビューできます。このガイドのステップ 15 でそれについて説明しています。
完全に自動化されたパイプラインの場合、Intlayer Compilerはビルド時に同じことを行います:JSX、TSX、Vue、Svelte ソースをすべての変更でスキャンし、辞書を生成し、hot module replacement を通じて同期を保つため、手動で保守するキーはまったくありません。
コンパイラをオンにする前に知っておく価値のある 2 つの制限があります。静的分析で動作するため、API エラーコードや CMS フィールドなど、実行時にのみ存在する文字列は到達できません。また、className="active" やステータスコードなどのアプリケーションロジックからユーザーに見える文字列を区別する必要があり、大規模なコードベースではいくつかのアノテーションが必要です。extract コマンドはあなたをループに保つことでこの両方を回避します。
5 つのツールがあり、すべてオプションです:
- VS Code 拡張機能:
useIntlayerキーからそれを宣言するコンテンツファイルにジャンプし、コンポーネントからコンテンツを抽出し、コマンドパレットまたは専用の Intlayer タブからビルド、fill、test、push、pull を実行します。 - 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はハードコードされた文字列にフラグを立て、静的辞書キーと未使用コンテンツのさらなるルールがあります。
