Чи можна використовувати Intlayer без глобального провайдера?

    Так. getIntlayer і getDictionary є звичайними функціями, яким не потрібен провайдер, і useIntlayer теж працює поза провайдером.

    ts
    import { getIntlayer } from "intlayer";
    
    const { title } = getIntlayer("app"); // Локаль не передано
    

    Яка локаль використовується?

    Явно передана локаль завжди має пріоритет. Інакше локаль визначається в такому порядку:

    1. Локаль поточного запиту, на сервері, коли його обробляє інтеграція Intlayer: middleware express-intlayer, fastify-intlayer, hono-intlayer, adonis-intlayer, elysia-intlayer, remix-intlayer та astro-intlayer або IntlayerProvider у React Server Components.
    2. Локаль, збережена в браузері (cookie, localStorage, sessionStorage), яку зберігає ваш перемикач мови.
    3. defaultLocale з вашої конфігурації.

    Кожен запит визначається за його власними cookies і заголовками та зберігається в області видимості цього запиту. Одночасні користувачі з різними локалями ніколи не ділять одну локаль.

    Те саме визначення застосовується до getDictionary, до викликів, переписаних оптимізацією збірки, а також до useIntlayer і useDictionaryDynamic, відрендерених поза провайдером.

    Server Components у Next.js

    У Next.js локаль запиту можна прочитати лише асинхронно, через headers() і cookies(). Використовуйте getIntlayerAsync, яка чекає на неї так само, як getLocale() з next-intlayer/server:

    tsx
    import { getIntlayerAsync } from "intlayer";
    
    export const generateMetadata = async () => {
      const { title } = await getIntlayerAsync("app"); // Локаль запиту
    
      return { title };
    };
    

    Читання заголовків переводить маршрут у динамічний рендеринг. Якщо IntlayerProvider уже надає локаль, заголовки не читаються і маршрут залишається статичним.

    Продуктивність: з провайдером чи без

    Контент однаковий. Різниця стосується реактивності та вартості рендерингу.

    З провайдеромБез провайдера
    Зміна локаліКомпоненти перерендерюються на місці, без перезавантаженняНічого не перерендерюється; нова локаль з'являється під час наступного виклику (навігація, перезавантаження)
    Вартість читанняЗвернення до контексту та підписка на локальМемоізований виклик функції, той самий об'єкт для тієї самої key + locale
    Вартість зміниПеререндеринг кожного споживачаНемає
    Серверний рендерингСервер і браузер рендерять ту саму локальПоза інтеграцією запитів сервер рендерить defaultLocale, а браузер збережену локаль: можливий hydration mismatch
    БандлКод провайдераБлизько 100 байт (gzip) для читання збереженої локалі, кешується до наступної зміни

    Залиште провайдер для інтерактивних застосунків, які змінюють локаль на місці або рендеряться на сервері. Обходьтеся без нього в бекендах, скриптах, статичних сторінках, де локаль береться з URL (передавайте її явно), або в коді, який читає контент один раз.

    Докладніше див. getIntlayer.