グローバルな provider なしで Intlayer を使えますか?

    はい。getIntlayer と getDictionary は provider を必要としない通常の関数で、useIntlayer も provider の外で動作します。

    ts
    import { getIntlayer } from "intlayer";
    
    const { title } = getIntlayer("app"); // ロケールを渡していない
    

    どのロケールが使われますか?

    明示的に渡したロケールが常に優先されます。それ以外の場合、ロケールは次の順序で解決されます。

    1. 現在のリクエストのロケール。サーバー上で Intlayer のインテグレーションがリクエストを処理している場合です: express-intlayer、fastify-intlayer、hono-intlayer、adonis-intlayer、elysia-intlayer、remix-intlayer、astro-intlayer の middleware、または React Server Components の IntlayerProvider。
    2. ブラウザに保存されたロケール(cookie、localStorage、sessionStorage)。ロケールスイッチャーが保存するロケールです。
    3. 設定の defaultLocale。

    各リクエストは自身の cookies と headers から解決され、リクエスト専用のスコープに保持されます。異なるロケールを持つ同時アクセスのユーザー同士がロケールを共有することはありません。

    同じ解決は getDictionary、ビルド最適化によって書き換えられた呼び出し、そして provider の外でレンダリングされる useIntlayer と useDictionaryDynamic にも適用されます。

    Next.js の Server Components

    Next.js では、リクエストのロケールは headers() と cookies() を通じて非同期でしか読めません。next-intlayer/server の getLocale() と同じようにそれを待つ getIntlayerAsync を使ってください。

    tsx
    import { getIntlayerAsync } from "intlayer";
    
    export const generateMetadata = async () => {
      const { title } = await getIntlayerAsync("app"); // リクエストのロケール
    
      return { title };
    };
    

    headers を読むとルートは動的レンダリングに切り替わります。IntlayerProvider がすでにロケールを提供している場合、headers は読まれず、ルートは静的なままです。

    パフォーマンス: provider あり・なし

    コンテンツは同じです。違いはリアクティビティとレンダリングコストにあります。

    provider ありprovider なし
    ロケールの切り替えリロードなしでコンポーネントがその場で再レンダリングされる何も再レンダリングされない。新しいロケールは次の呼び出しで反映(ナビゲーション、リロード)
    読み取りのコストcontext の参照とロケールの購読メモ化された関数呼び出し。同じ key + locale には同じオブジェクト
    切り替えのコストすべての consumer の再レンダリングなし
    サーバーレンダリングサーバーとブラウザが同じロケールをレンダリングリクエストのインテグレーションの外では、サーバーが defaultLocale、ブラウザが保存済みロケールをレンダリング: hydration mismatch の可能性
    Bundleprovider のコード保存済みロケールの読み取りに約 100 バイト(gzip)。次の切り替えまでキャッシュ

    その場でロケールを切り替える、またはサーバーでレンダリングするインタラクティブなアプリでは provider を使い続けてください。バックエンド、スクリプト、URL からロケールを得る静的ページ(明示的に渡してください)、コンテンツを一度だけ読むコードでは provider なしで構いません。

    詳しくは getIntlayer を参照してください。