Можно ли использовать 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.