Интерфейсы, работающие с календарями, расписаниями, бронированием и планированием, требуют корректного отображения дат в соответствии с языком, регионом и культурными правилами пользователя. Формат даты, порядок компонентов, названия месяцев, начало недели, система календаря — всё это зависит от локали.
Библиотека React Aria предоставляет инфраструктуру для корректной локализации дат и календарных компонентов. Она использует международные стандарты и инструменты платформы, а также собственные абстракции для работы с календарными системами и форматированием.
Локаль (locale) — это набор правил, определяющих формат представления информации для определённого региона и языка. Обычно она обозначается строкой вида:
language-REGION
Примеры:
| Локаль | Язык | Регион |
|---|---|---|
| en-US | английский | США |
| en-GB | английский | Великобритания |
| fr-FR | французский | Франция |
| de-DE | немецкий | Германия |
| ru-RU | русский | Россия |
| ja-JP | японский | Япония |
Локаль влияет на:
Например:
| Локаль | Отображение даты |
|---|---|
| en-US | 03/12/2026 |
| en-GB | 12/03/2026 |
| de-DE | 12.03.2026 |
| ru-RU | 12.03.2026 |
React Aria автоматически учитывает локаль при форматировании дат.
Локализация строится на нескольких компонентах:
1. React Aria
Предоставляет доступность и взаимодействие компонентов.
2. React Stately
Управляет состоянием календарных компонентов.
3. Internationalized Date
Библиотека @internationalized/date предоставляет:
4. React Aria i18n
Пакет @react-aria/i18n обеспечивает:
Контекст локализации передаётся через I18nProvider.
import {I18nProvider} from '@react-aria/i18n'
<I18nProvider locale="ru-RU">
<App />
</I18nProvider>
Теперь все компоненты внутри дерева получают локаль
ru-RU.
Пример:
Часто локаль определяется автоматически.
navigator.language
Пример значения:
en-US
ru-RU
fr-FR
<I18nProvider locale={navigator.language}>
<App />
</I18nProvider>
Так интерфейс автоматически адаптируется под язык системы пользователя.
React Aria предоставляет хук useLocale.
import {useLocale} from '@react-aria/i18n'
function Example() {
let {locale, direction} = useLocale()
return (
<div>
Current locale: {locale}
</div>
)
}
Возвращаемые значения:
| Поле | Назначение |
|---|---|
| locale | текущая локаль |
| direction | направление текста |
Некоторые языки используют правостороннее направление письма.
Примеры:
| Язык | Направление |
|---|---|
| английский | LTR |
| русский | LTR |
| арабский | RTL |
| иврит | RTL |
useLocale возвращает:
direction: "ltr"
или
direction: "rtl"
Это позволяет автоматически адаптировать интерфейс.
React Aria использует собственную библиотеку для работы с датами:
@internationalized/date
Она решает ряд проблем стандартного Date:
Библиотека вводит типы:
| Тип | Назначение |
|---|---|
| CalendarDate | дата без времени |
| CalendarDateTime | дата + время |
| ZonedDateTime | дата + время + часовой пояс |
| Time | только время |
Форматирование выполняется через DateFormatter.
import {DateFormatter} from '@internationalized/date'
let formatter = new DateFormatter('ru-RU', {
dateStyle: 'long'
})
import {CalendarDate} from '@internationalized/date'
let date = new CalendarDate(2026, 3, 12)
formatter.format(date.toDate())
Результат:
12 марта 2026 г.
DateFormatter поддерживает стандарт
Intl.DateTimeFormat.
| Параметр | Описание |
|---|---|
| dateStyle | стиль даты |
| timeStyle | стиль времени |
| weekday | день недели |
| year | год |
| month | месяц |
| day | день |
Возможные значения:
short
medium
long
full
Пример:
new DateFormatter('ru-RU', {
dateStyle: 'short'
})
Результат:
12.03.26
new DateFormatter('ru-RU', {
dateStyle: 'long'
})
Результат:
12 марта 2026 г.
new DateFormatter('ru-RU', {
dateStyle: 'full'
})
Результат:
четверг, 12 марта 2026 г.
Можно задавать точные параметры.
new DateFormatter('ru-RU', {
day: 'numeric',
month: 'long',
year: 'numeric'
})
Результат:
12 марта 2026
React Aria автоматически локализует названия месяцев.
Пример:
| Локаль | Месяц |
|---|---|
| en-US | March |
| ru-RU | март |
| fr-FR | mars |
| de-DE | März |
Это особенно важно для календарных компонентов.
Локаль также определяет названия дней недели.
| Локаль | Monday |
|---|---|
| en-US | Monday |
| ru-RU | понедельник |
| fr-FR | lundi |
| de-DE | Montag |
В разных странах неделя начинается с разных дней.
| Регион | Первый день недели |
|---|---|
| США | воскресенье |
| Европа | понедельник |
| Ближний Восток | суббота |
React Aria определяет это автоматически на основе локали.
Не все страны используют григорианский календарь.
Поддерживаются:
| Календарь | Регион |
|---|---|
| Gregorian | большинство стран |
| Japanese | Япония |
| Buddhist | Таиланд |
| Islamic | исламские страны |
| Hebrew | Израиль |
import {CalendarDate} from '@internationalized/date'
let date = new CalendarDate(2026, 3, 12)
Эта дата интерпретируется в зависимости от выбранного календаря.
Иногда требуется стандартный объект Date.
date.toDate('UTC')
Результат:
JavaScript Date
React Aria поддерживает форматирование диапазонов.
let formatter = new DateFormatter('ru-RU', {
dateStyle: 'medium'
})
formatter.formatRange(
new Date(2026, 2, 10),
new Date(2026, 2, 15)
)
Результат:
10–15 мар. 2026
Это используется в:
Компоненты React Aria автоматически используют текущую локаль.
Пример:
Calendar
DatePicker
RangeCalendar
Они локализуют:
<I18nProvider locale="ru-RU">
<Calendar />
</I18nProvider>
Интерфейс будет отображать:
Март 2026
Пн Вт Ср Чт Пт Сб Вс
Локаль можно менять во время работы приложения.
const [locale, setLocale] = useState("en-US")
<I18nProvider locale={locale}>
<App />
</I18nProvider>
<button onCl ick={() => setLocale("ru-RU")}>
Русский
</button>
<button onCl ick={() => setLocale("en-US")}>
English
</button>
После переключения:
изменятся автоматически.
DateFormatter также форматирует время.
new DateFormatter('ru-RU', {
timeStyle: 'short'
})
Результат:
14:30
new DateFormatter('ru-RU', {
dateStyle: 'long',
timeStyle: 'short'
})
Результат:
12 марта 2026 г., 14:30
При работе с датами важно учитывать timezone.
React Aria поддерживает ZonedDateTime.
import {ZonedDateTime} from '@internationalized/date'
Это позволяет:
Для календарных компонентов лучше использовать:
CalendarDate
а не Date.
Это избегает проблем с часовыми поясами.
Рекомендуется задавать локаль на уровне приложения.
I18nProvider
Это гарантирует согласованность интерфейса.
Плохой подход:
12/03/2026
Правильный:
DateFormatter
Это автоматически адаптирует формат под локаль.
React Aria построен поверх:
Intl.DateTimeFormat
Это обеспечивает:
Date зависит от:
Это приводит к ошибкам в календарях.
Жёстко заданные форматы:
MM/DD/YYYY
работают только для США.
Некоторые разработчики всегда начинают неделю с понедельника, что неверно для ряда стран.
React Aria автоматически определяет правильное значение.
Корректная локализация обеспечивает:
Интерфейс становится культурно корректным и одинаково удобным для пользователей из разных стран.