Czy mogę używać Intlayer bez globalnego providera?

    Tak. getIntlayer i getDictionary to zwykłe funkcje, które nie potrzebują żadnego providera, a useIntlayer również działa poza nim.

    ts
    import { getIntlayer } from "intlayer";
    
    const { title } = getIntlayer("app"); // Bez przekazanego locale
    

    Które locale jest używane?

    Jawnie przekazane locale zawsze ma pierwszeństwo. W przeciwnym razie locale jest rozwiązywane w tej kolejności:

    1. Locale bieżącego żądania, na serwerze, gdy obsługuje je integracja Intlayer: middleware express-intlayer, fastify-intlayer, hono-intlayer, adonis-intlayer, elysia-intlayer, remix-intlayer i astro-intlayer lub IntlayerProvider w React Server Components.
    2. Locale zapisane w przeglądarce (cookie, localStorage, sessionStorage), które utrwala Twój przełącznik języka.
    3. defaultLocale z Twojej konfiguracji.

    Każde żądanie jest rozwiązywane na podstawie własnych cookies i nagłówków i przechowywane w zakresie tego żądania. Równocześni użytkownicy z różnymi locale nigdy nie współdzielą locale.

    To samo rozwiązywanie dotyczy getDictionary, wywołań przepisanych przez optymalizację builda oraz useIntlayer i useDictionaryDynamic renderowanych poza providerem.

    Server Components w Next.js

    W Next.js locale żądania można odczytać tylko asynchronicznie, przez headers() i cookies(). Użyj getIntlayerAsync, która czeka na nie tak samo jak getLocale() z next-intlayer/server:

    tsx
    import { getIntlayerAsync } from "intlayer";
    
    export const generateMetadata = async () => {
      const { title } = await getIntlayerAsync("app"); // Locale żądania
    
      return { title };
    };
    

    Odczyt nagłówków przełącza trasę na renderowanie dynamiczne. Gdy IntlayerProvider już dostarcza locale, nagłówki nie są odczytywane, a trasa pozostaje statyczna.

    Wydajność: z providerem czy bez

    Treść jest taka sama. Różnica dotyczy reaktywności i kosztu renderowania.

    Z provideremBez providera
    Zmiana localeKomponenty renderują się ponownie na miejscu, bez przeładowaniaNic nie renderuje się ponownie; nowe locale pojawia się przy następnym wywołaniu (nawigacja, przeładowanie)
    Koszt odczytuOdczyt kontekstu i subskrypcja localeMemoizowane wywołanie funkcji, ten sam obiekt dla tego samego key + locale
    Koszt zmianyPonowne renderowanie każdego konsumentaBrak
    Renderowanie na serwerzeSerwer i przeglądarka renderują to samo localePoza integracją żądań serwer renderuje defaultLocale, a przeglądarka zapisane locale: możliwy hydration mismatch
    BundleKod provideraOkoło 100 bajtów (gzip) na odczyt zapisanego locale, cache'owane do następnej zmiany

    Zostaw provider w interaktywnych aplikacjach, które zmieniają locale na miejscu lub renderują na serwerze. Zrezygnuj z niego w backendach, skryptach, stronach statycznych, których locale pochodzi z URL (przekaż je jawnie), lub w kodzie, który odczytuje treść tylko raz.

    Więcej szczegółów w getIntlayer.