Компонент FormatJS IntlProvider является центральным
элементом архитектуры библиотеки react-intl и отвечает за передачу
контекста интернационализации во всё дерево React-компонентов. Он
инкапсулирует локаль, набор сообщений, параметры форматирования и
дополнительные настройки, обеспечивая единообразное поведение
локализации без необходимости прокидывать данные через props на каждом
уровне.
IntlProvider формирует контекст, в котором выполняются
все операции форматирования текста, чисел, дат и множественных форм. Он
опирается на механизм React Context API и предоставляет доступ к объекту
intl всем дочерним компонентам, включая FormattedMessage,
useIntl, injectIntl и другие инструменты
библиотеки.
Ключевая идея заключается в централизованном управлении локализацией:
Компонент обычно располагается на верхнем уровне приложения, оборачивая корневой компонент.
import { IntlProvider } from "react-intl";
const messages = {
greeting: "Привет, мир",
farewell: "До свидания"
};
function App() {
return (
<IntlProvider locale="ru" messages={messages}>
<Main />
</IntlProvider>
);
}
В этом контексте любые дочерние компоненты получают доступ к переводу без дополнительной передачи данных.
IntlProvider создаёт объект intl, который включает:
Этот объект вычисляется один раз при изменении входных props и кэшируется для оптимизации производительности. Внутри используется мемоизация, чтобы предотвратить лишние пересоздания форматтеров, основанных на ICU MessageFormat.
Определяет текущую локаль интерфейса. Используется всеми форматтерами для выбора правил языка.
<IntlProvider locale="en">
Значение влияет на:
Объект переводов, где ключи соответствуют идентификаторам сообщений.
const messages = {
welcome: "Добро пожаловать",
items: "У вас {count} товаров"
};
При изменении объекта messages происходит пересборка контекста intl.
Используется как резервная локаль при отсутствии перевода в текущем наборе messages.
<IntlProvider locale="ru" defaultLocale="en">
В случае отсутствия ключа в русских переводах будет использован английский вариант.
Определяет временную зону для форматирования дат.
<IntlProvider locale="ru" timeZone="Europe/Moscow">
Используется внутри formatDate, formatTime
и formatRelativeTime.
Позволяет задавать именованные правила форматирования.
const formats = {
number: {
currency: {
style: "currency",
currency: "RUB"
}
}
};
Используется как централизованный реестр шаблонов форматирования.
Хотя IntlProvider сам по себе не предоставляет API для
прямого использования, он является источником данных для хука
useIntl.
import { useIntl } from "react-intl";
function Header() {
const intl = useIntl();
return <h1>{intl.formatMessage({ id: "welcome" })}</h1>;
}
Все методы intl зависят от конфигурации, заданной в
IntlProvider.
При изменении props locale и messages
происходит пересоздание контекста. Это позволяет реализовать
переключение языка без перезагрузки приложения.
<IntlProvider locale={currentLocale} messages={currentMessages}>
<App />
</IntlProvider>
Важно учитывать, что изменение объекта messages должно быть иммутабельным, иначе возможны лишние перерисовки.
Допускается использование нескольких провайдеров, каждый из которых переопределяет контекст в своей области дерева компонентов.
<IntlProvider locale="ru" messages={ruMessages}>
<Page>
<IntlProvider locale="en" messages={enMessages}>
<Widget />
</IntlProvider>
</Page>
</IntlProvider>
Внутренний провайдер полностью перекрывает внешний в своей области видимости.
Если ключ отсутствует в messages:
Такой механизм предотвращает “тихие” ошибки локализации.
IntlProvider оптимизирует работу через:
Особое внимание уделяется уменьшению затрат при частом переключении локали.
При SSR IntlProvider используется для синхронизации
локали между сервером и клиентом.
const html = renderToString(
<IntlProvider locale="ru" messages={messages}>
<App />
</IntlProvider>
);
Ключевой аспект — совпадение данных на сервере и клиенте для предотвращения гидрационных расхождений.
При гидратации React важно, чтобы:
Несоответствие приводит к повторному рендеру и возможным визуальным скачкам интерфейса.
const formats = {
date: {
short: {
year: "numeric",
month: "short",
day: "numeric"
}
}
};
<IntlProvider locale="ru" formats={formats}>
Отдельные части приложения могут использовать собственные локали, например виджеты или встроенные панели.
IntlProvider часто связывается с глобальным состоянием
(Redux, Zustand, Context), где locale хранится как часть
пользовательских настроек.
Хотя основная роль компонента — передача контекста, он напрямую влияет на правила обработки грамматики.
Пример множественных форм:
const messages = {
items: "У вас {count, plural, one {# товар} few {# товара} many {# товаров} other {# товара}}"
};
Форматирование зависит от locale, заданного в
IntlProvider.
Все дочерние компоненты автоматически получают доступ к:
Это исключает необходимость ручного прокидывания i18n-данных через props-цепочки.
Такие ошибки приводят к деградации производительности и нестабильному поведению интерфейса.