Чи можна використовувати Intlayer без глобального провайдера?
Так. getIntlayer і getDictionary є звичайними функціями, яким не потрібен провайдер, і useIntlayer теж працює поза провайдером.
Скопіюйте код у буфер обміну
Яка локаль використовується?
Явно передана локаль завжди має пріоритет. Інакше локаль визначається в такому порядку:
- Локаль поточного запиту, на сервері, коли його обробляє інтеграція Intlayer: middleware
express-intlayer,fastify-intlayer,hono-intlayer,adonis-intlayer,elysia-intlayer,remix-intlayerтаastro-intlayerабоIntlayerProviderу React Server Components. - Локаль, збережена в браузері (cookie,
localStorage,sessionStorage), яку зберігає ваш перемикач мови. defaultLocaleз вашої конфігурації.
Кожен запит визначається за його власними cookies і заголовками та зберігається в області видимості цього запиту. Одночасні користувачі з різними локалями ніколи не ділять одну локаль.
Те саме визначення застосовується до getDictionary, до викликів, переписаних оптимізацією збірки, а також до useIntlayer і useDictionaryDynamic, відрендерених поза провайдером.
Server Components у Next.js
У Next.js локаль запиту можна прочитати лише асинхронно, через headers() і cookies(). Використовуйте getIntlayerAsync, яка чекає на неї так само, як getLocale() з next-intlayer/server:
Скопіюйте код у буфер обміну
Читання заголовків переводить маршрут у динамічний рендеринг. Якщо IntlayerProvider уже надає локаль, заголовки не читаються і маршрут залишається статичним.
Продуктивність: з провайдером чи без
Контент однаковий. Різниця стосується реактивності та вартості рендерингу.
Відкрийте таблицю в модальному вікні, щоб чітко переглянути всі дані
| З провайдером | Без провайдера | |
|---|---|---|
| Зміна локалі | Компоненти перерендерюються на місці, без перезавантаження | Нічого не перерендерюється; нова локаль з'являється під час наступного виклику (навігація, перезавантаження) |
| Вартість читання | Звернення до контексту та підписка на локаль | Мемоізований виклик функції, той самий об'єкт для тієї самої key + locale |
| Вартість зміни | Перерендеринг кожного споживача | Немає |
| Серверний рендеринг | Сервер і браузер рендерять ту саму локаль | Поза інтеграцією запитів сервер рендерить defaultLocale, а браузер збережену локаль: можливий hydration mismatch |
| Бандл | Код провайдера | Близько 100 байт (gzip) для читання збереженої локалі, кешується до наступної зміни |
Залиште провайдер для інтерактивних застосунків, які змінюють локаль на місці або рендеряться на сервері. Обходьтеся без нього в бекендах, скриптах, статичних сторінках, де локаль береться з URL (передавайте її явно), або в коді, який читає контент один раз.
Докладніше див. getIntlayer.