Основной точкой входа в архитектуре FormatJS является провайдер интернационализации, предоставляющий доступ ко всем API форматирования через React-контекст.
Компонент из react-intl отвечает за инициализацию и распространение i18n-контекста.
Сигнатура:
<IntlProvider
locale={string}
messages={Record<string, string>}
defaultLocale?: string
timeZone?: string
formats?: object
textComponent?: React.ComponentType
wrapRichTextChunksInFragment?: boolean
onError?: (err: Error) => void
>
Параметры:
"en", "ru", "fr-CA").Контекст, создаваемый провайдером, содержит объект intl,
доступный во всех дочерних компонентах.
Возвращает объект IntlShape, предоставляющий доступ ко
всем функциям форматирования.
Сигнатура:
const intl = useIntl();
IntlShape включает:
formatMessageformatDateformatTimeformatDateTimeformatNumberformatPluralformatRelativeTimeformatDisplayNamelocalemessagesОсновной метод интерполяции локализованных строк.
Сигнатура:
intl.formatMessage(
descriptor: MessageDescriptor,
values?: Record<string, string | number | Date | React.ReactNode>
): string
MessageDescriptor:
{
id: string;
defaultMessage?: string;
description?: string;
}
Пример использования:
intl.formatMessage(
{ id: "user.greeting", defaultMessage: "Hello, {name}" },
{ name: "Alex" }
);
Поддерживает:
Базовый слой форматирования основан на ICU MessageFormat.
Hello, {name}
{count, plural,
one {1 item}
other {# items}
}
{gender, select,
male {He}
female {She}
other {They}
}
Balance: {amount, number, currency}
Методы для локализованного форматирования дат.
intl.formatDate(value, options?)
Параметры:
value: Date | number | stringoptions: Intl.DateTimeFormatOptionsПример:
intl.formatDate(new Date(), {
year: "numeric",
month: "long",
day: "2-digit"
});
intl.formatTime(value, options?)
Использует Intl.DateTimeFormat под капотом.
Комбинированное форматирование даты и времени.
intl.formatDateTime(value, options?)
Унифицированное числовое форматирование через
Intl.NumberFormat.
intl.formatNumber(value, options?)
Примеры:
intl.formatNumber(1200, {
style: "currency",
currency: "USD"
});
intl.formatNumber(0.25, {
style: "percent"
});
intl.formatNumber(1000000);
Метод выбора формы слова на основе количества.
intl.formatPlural(value, options?)
Возвращает:
"zero" | "one" | "two" | "few" | "many" | "other"
Пример:
intl.formatPlural(3, {
one: "item",
other: "items"
});
Относительное время (вчера, 2 часа назад).
intl.formatRelativeTime(value, unit, options?)
Параметры:
value: numberunit: "second" | "minute" | "hour" | "day" | "month" | "year"Пример:
intl.formatRelativeTime(-5, "day");
Форматирование локализованных названий языков, регионов и валют.
intl.formatDisplayName(value, type)
type:
"language""region""currency""script"Пример:
intl.formatDisplayName("en", "language");
Низкоуровневый доступ используется вне React-дерева.
import { createIntl, createIntlCache } fr om "react-intl";
Сигнатура:
const intl = createIntl({
locale: "en",
messages: {}
}, cache);
Кэширование форматтеров для повышения производительности.
const cache = createIntlCache();
Структура описания сообщений является базовым контрактом системы.
type MessageDescriptor = {
id: string;
defaultMessage?: string;
description?: string;
};
Утилита группировки сообщений.
defineMessages({
title: {
id: "page.title",
defaultMessage: "Home"
},
subtitle: {
id: "page.subtitle",
defaultMessage: "Welcome"
}
});
API позволяет вставлять React-узлы в локализованные строки.
intl.formatMessage(
{
id: "terms",
defaultMessage: "Accept the <b>terms</b>"
},
{
b: (chunks) => <strong>{chunks}</strong>
}
);
Поддерживаемые конструкции:
Глобальный обработчик ошибок форматирования.
<IntlProvider
locale="en"
messages={{}}
onEr ror={(err) => {
console.log(err);
}}
/>
Типовые ошибки:
Ключевой объект API:
type IntlShape = {
locale: string;
messages: Record<string, string>;
formatMessage: Function;
formatNumber: Function;
formatDate: Function;
formatTime: Function;
formatDateTime: Function;
formatPlural: Function;
formatRelativeTime: Function;
formatDisplayName: Function;
}
Каждый метод является обёрткой над стандартными ECMA-402 Intl API с дополнительным слоем ICU логики.
Внутри системы используется компилятор сообщений, реализованный в пакете messageformat.
Он выполняет:
Пример внутреннего представления:
"Hello {name}"
→ AST → функции интерполяции
Локализация работает по цепочке:
ru-KZ)ru)Пример поведения:
Вся система опирается на стандартные API ECMAScript:
Intl.NumberFormatIntl.DateTimeFormatIntl.PluralRulesIntl.RelativeTimeFormatIntl.DisplayNamesFormatJS расширяет их, добавляя ICU слой и React-интеграцию.
Ключевые оптимизации:
Intl.* экземпляровcreateIntlCacheПаттерн:
const cache = createIntlCache();
const intl = createIntl(config, cache);
Поддерживаются строгие типы сообщений:
type Messages = {
"app.title": string;
"app.description": string;
};
Интеграция позволяет: