intlayer について
Intlayerを使った国際化、特にバージョン9.6とTanStack Startでの開発を支援するスキルです。パッケージのバージョン統一、現行API、ルーティング、検証手順に重点を置いています。
主な機能
- 01Intlayer 9.6とTanStack Startのガイド
- 02Intlayerパッケージのバージョン統一
- 03設定とコンテンツ実装の案内
- 04ロケールルーティングとSSRの案内
- 05CLI、CMS、コンパイラー、分析機能の資料
- 06実装変更の検証チェックリスト
活用シーン
- 01TanStack StartアプリへのIntlayer導入
- 02Intlayerのバージョンをまたぐコード更新
- 03ロケールルーティングやSSRの問題調査
- 04コンテンツ、ビルド、CLIの変更確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ dobroslavradosavljevic/ skills --skill intlayerインストール後、Claude Code で/intlayerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlreferences/cli-cms-ai.mdcompiler-compat.mdconfiguration.mdcontent-dictionaries.mdrouting-ssr-seo.mdsetup-tanstack-start.mdsource-map.md詳細
Intlayer
Intlayer の i18n に関する作業では、このスキルを使用してください。特に TanStack Start(@tanstack/react-start)と intlayer + react-intlayer + vite-intlayer を使用する Intlayer 9.6([email protected]。API は 9.5 系と同じ)が対象です。
intlayer / react-intlayer / vite-intlayer(およびすべての @intlayer/* / *-intlayer パッケージ)は、同じ正確なバージョンに固定してください(このスナップショットでは 9.6.0)。9.0~9.4 のドキュメントやパッケージを、9.5 以降の API(useExperiment、build.chunkGrouping、build.dictionariesPreload、CLI の --ci、vite-intlayer/nitro-handler)と混在させないでください。bunx intlayer upgrade(9.5.8 以降)でまとめてアップグレードしてください。
スナップショット:2026-10-01。バージョンが異なる場合は、source-map.md を参照して最新情報に更新してください。
ワークフロー
- コードを変更する前に、ローカル環境の Intlayer と Start の構成を確認してください。
intlayer、react-intlayer、vite-intlayer、@tanstack/react-start、@tanstack/react-routerのパッケージバージョン(すべての Intlayer パッケージのバージョンを一致させてください)。- 設定:
intlayer.config.tsのロケール、routing.mode、routing.enableProxy、routing.storage、content.contentDir、dictionary.importMode、dictionary.fill、compiler.enabled、build.optimize/minify/purge/chunkGrouping/dictionariesPreload、editor、analytics、ai、plugins。 - Vite:
intlayer()プラグイン(proxy.ignore、任意のcompatCallers)、tanstackStart({ router: { routeFileIgnorePattern } })、Nitro プラグイン。 - ルート:
src/routes/__root.tsxのシェルとIntlayerProvider、validatePrefixを含むsrc/routes/{-$locale}/のレイアウト。 - コンテンツ:
*.content.{ts,tsx,js,json,...}のディクショナリーと生成された.intlayer/の出力。 - ナビゲーション:
LocalizedLink、useLocalizedNavigate、その他の Link / navigate ラッパーは使用せず、ネイティブの TanStack Router API のみを使用してください。
- 最新の挙動、9.5 の API、CMS / エディター / アナリティクス、またはパッケージの不整合にタスクが関係する場合は、ドキュメントを最新情報に更新してください。source-map.md から確認を始めてください。
- インストール、設定、Vite プラグイン、プロバイダー、Nitro ハンドラー、TypeScript の include 設定については、setup-tanstack-start.md を使用してください。
intlayer.config.tsの設定項目(routing、dictionary、compiler、build、editor、analytics、AI、plugins)については、configuration.md を使用してください。- コンテンツ宣言、ノードヘルパー、コレクション / バリアント、フォーマッター、
useIntlayerについては、content-dictionaries.md を使用してください。 - ロケールルーティング、ネイティブのリンク / navigate、SSR の
getLocale/getIntlayerAsync、SEO のhead、サイトマップ、404 については、routing-ssr-seo.md を使用してください。 - CLI、fill、
--ci、CMS、ビジュアルエディター、ライブ同期、MCP、@intlayer/analyticsについては、cli-cms-ai.md を使用してください。 - コンパイラーによる抽出、バンドルの optimize / minify / purge、チャンクのグループ化 / プリロード、import モード、互換アダプター、
syncJSONについては、compiler-compat.md を使用してください。 - コマンド例では
bun/bunxを優先してください。Next.js や Solid Start のドキュメントよりも公式の Start ガイドを優先してください。ただし、Intlayer のLocalizedLink/useLocalizedNavigateの例はコピーせず、代わりにネイティブの TanStack RouterLink/useNavigateを使用してください。
実装時の判断
- TanStack Start では
intlayer+react-intlayer+vite-intlayerを使用します。next-intlayer/next-intlayer/serverまたはsolid-intlayerの API をインストールしたり、コピーしたりしないでください。tanstack-intlayerパッケージはありません。Start ではreact-intlayer/serverのIntlayerServerProviderを使用しないでください。 - Next.js 9.4+ では、
IntlayerClientProvider/IntlayerServerProviderはIntlayerProviderに統合されています。Start ではすでにreact-intlayerのIntlayerProviderを使用しています。 - ロケール検出/リダイレクトには、TanStack Router のミドルウェア API ではなく、Vite の
intlayer()プロキシを使用します。現在の設定型ではrouting.enableProxyのデフォルトは **undefined(自動)**です。プロキシが実行され、開発/プレビューでは URL 主導(保存済みロケールを無視)となり、本番環境ではストレージ主導の完全なリダイレクトが行われます。どの環境でもストレージ主導のリダイレクトを強制するにはtrueを設定し、プロキシを無効にするにはfalseを設定します。 - 本番環境の SSR プロキシは
vite-intlayer/nitro-handler(h3 v2 Web Fetch)です。intlayer()/intlayerProxyは、nitro/viteが挿入する.nitroプロパティ経由で自動登録します。Bun/Deno ではfromNodeMiddleware(createIntlayerProxyHandler(...))を設定しないでください。これはクラッシュします(event.nodeが未定義です)。本番環境でプロキシを実行する場合は、vite-intlayerをランタイムのdependenciesに含めてください。 - Link/navigate ラッパーは使用しないでください。 ロケールを注入するために TanStack の
Link/useNavigateをラップするLocalizedLink、useLocalizedNavigate、またはコンポーネント/フックを作成、維持、推奨しないでください。ネイティブのLinkとuseNavigateを、完全なtoパス(/{-$locale}/...)およびgetPrefix(locale).localePrefixのparams.localeとともに使用します。レビュー/移行時には、既存のラッパーを削除し、呼び出し箇所を書き換えてください。公式の Start ドキュメントと Start テンプレートにはまだラッパーが含まれていますが、これらのサンプルは無視してください。 - コンテンツファイルがルートとして扱われないよう、常に
.content.*に対してrouteFileIgnorePatternを設定してください。 - ロケールのルートスロットは
routing.modeに合わせてください。prefix-no-defaultでは{-$locale}、prefix-allでは$localeを優先し、no-prefix/search-paramsではスロットを削除します。 - クライアント UI:
react-intlayerのuseIntlayer/useLocale。ロケール対応のフォーマッター:react-intlayer/format。A/B:react-intlayer(またはreact-intlayer/analytics)のuseExperiment。サーバー関数、head、ローダー、React 以外のコード:intlayerのgetIntlayerAsync/getLocale。全ロケールを統合した辞書を使用しても問題ない場合に限り、同期版のgetIntlayerを使用してください。Start では常にロケールを明示的に渡してください。9.5.12 以降、省略したロケールはリクエストのロケール(Next.js のヘッダー/Cookie のみ)、次に保存済みロケール、最後にデフォルトの順に解決されるため、プロバイダー外では SSR とハイドレーションで不一致が生じる可能性があります。 - ルートの
headには 3 つの解決モードがあります(ルーティングのリファレンスを参照)。getIntlayerAsyncを優先してください。LCP に影響するメタデータは、staleTime: Infinityを指定してloaderで解決し、同期型のheadからloaderDataを読み取ります。辞書が非常に小さい場合を除き、9.4+ のheadで同期版のgetIntlayerを使用しないでください。 beforeLoadでは、Cookie/ヘッダーではなく、params.localeからvalidatePrefixを使ってロケールを検証してください(リクエストのロケールはすでにプロキシが処理しています)。.content.*は機能ごとに配置してください。src配下にある Start アプリでは、content.contentDirを明示的に設定してください(設定のデフォルトは["."]であり、Next.js 形式の./appではありません)。compiler.enabledのデフォルトはfalseです。値はfalse|true|"build-only"(開発時はスキップ)です。バンドルされたプロキシ/コンパイラー/チャンク/プリロードはintlayer()内に含まれます。プラグインの順序上必要な場合を除き、個別にintlayerProxy()/intlayerCompiler()/intlayerChunk()/intlayerPreload()を要求しないでください。- HTML 属性(
alt、title、aria-label)には、コンテンツノードの.value、.toString()、またはString(...)を使用してください。 - 識別子:
plural/enu(数量)、cond(ブール値)、gender、select(その他の任意の文字列、9.1)。実行時キー(node[status])を使ってコンテンツオブジェクトにインデックスアクセスしないでください。代わりにnode(status)を呼び出すと、コンパイラーが圧縮/削除できます。 - コレクションは
keyとitemを共有します。バリアントにはvariant: string | objectを使用します(9.1 では、従来の動的レコードがオブジェクトのバリアントに統合されています)。セレクター:{ locale, item, variant }。解決順序:variant → item。 editor.enabledがtrueの場合、build.minifyを有効にしないでください(フィールド名の変更がスキップされます)。importMode/minify/purge/chunkGrouping/dictionariesPreload にはbuild.optimizeが必要です(デフォルトのundefinedは本番環境のみを意味します)。dictionary.importMode: "dynamic"は 9.5 の Start で使用できます。chunkGrouping(デフォルトは true)とdictionariesPreload(デフォルトは true)によって、辞書ごとのウォーターフォールが解消されます。コレクション/バリアントは引き続き必要に応じて読み込まれます。- CLI:9.5.2 以降、
intlayer ci <cmd>は廃止されています。INTLAYER_PROJECT_CREDENTIALSを設定し、bunx intlayer <cmd> --ciを使用してください。エージェント/CI からはbunx intlayer initと、非対話型のサブコマンド(init skills、init mcp、…)を使用してください。ターミナルがない場合、--interactiveは失敗します(9.6)。 - 設定値の読み取りには、直接インポート(
import { defaultLocale, locales } from "intlayer")を使用してください。getConfiguration()は非推奨です(9.5.9)。
検証
リポジトリに既存のチェックがある場合は、そちらを優先してください。Intlayer と Start に関する重要な作業では、関連するチェックを含めてください。
.intlayer/**/*.tsを含めて型チェックし、ルートツリーを再生成します。- ロケールのスモークテスト:デフォルトロケール(プレフィックスなし、またはプレフィックス付き)、別のロケール、無効なプレフィックス → 404 リダイレクト、ロケールスイッチャー。
- ナビゲーションのスモークテスト:アプリ内リンクとプログラムによるナビゲーションで現在のロケールを維持します。ラッパーコンポーネントを使わずに、スイッチャーで
params.localeを更新します。 - SSR のスモークテスト:最初の HTML の
lang/dir、Cookie/Accept-Languageによるプロキシリダイレクト、サーバー関数のgetLocaleとgetIntlayerAsync。本番環境のプロキシを、対象の Nitro プリセットでテストします(Node と Bun の両方を使う場合は両方)。 - Head/メタデータのスモークテスト:
getIntlayerAsyncを使い、要求されたロケールのチャンクだけが読み込まれることを確認します。ローダーキャッシュパターンを使う場合は、loaderDataのオプショナルチェーンとstaleTimeを確認します。 - コンテンツのスモークテスト:キーの欠落、属性の文字列レンダリング、使用している場合はコレクション/バリアント/
plural/enu/select。 importMode: "dynamic"の場合の動的インポートのスモークテスト:ルート境界ごとにコンテンツリクエストが 1 回だけ発生すること、ウォームナビゲーションで Suspense によるちらつきが発生しないこと。- CLI:辞書を変更した場合は
bunx intlayer buildとbunx intlayer test(content testのエイリアス)を実行します。モノレポ CMS ではbunx intlayer fill --ciを使います(intlayer ci fillは使いません)。 - ローカライズされた SEO ルートを変更する場合は、サイトマップ/プリレンダーのスモークテストを実施します。
- CMS/エディター/分析機能が対象の場合:ライブ同期、
push/pull、useExperiment/useConversion、分析のアトリビューションに使うeditor.clientIdを確認します。
実行したチェックと実行しなかったチェック、および残っているバージョン依存の前提条件を報告してください。