Локаль определяет язык, региональные настройки и правила форматирования данных. В экосистеме FormatJS локаль влияет на:
FormatJS опирается на международные стандарты ECMAScript
Internationalization API (Intl) и использует языковые теги
BCP 47.
Пример локали:
'en'
'ru'
'ru-RU'
'en-US'
'kk-KZ'
'zh-Hans-CN'
Языковой тег состоит из нескольких частей.
Общая структура:
language-script-region-variant
Пример:
zh-Hans-CN
Разбор:
| Часть | Значение |
|---|---|
| zh | китайский язык |
| Hans | упрощённая письменность |
| CN | Китай |
Язык — обязательная часть локали.
Примеры:
| Код | Язык |
|---|---|
| en | английский |
| ru | русский |
| de | немецкий |
| fr | французский |
| kk | казахский |
Использование в FormatJS:
<IntlProvider locale="ru">
Регион уточняет особенности языка.
Например:
en-US
en-GB
pt-BR
pt-PT
Хотя язык одинаковый, различаются:
Пример:
new Intl.NumberFormat('en-US').format(1000000)
// 1,000,000
new Intl.NumberFormat('de-DE').format(1000000)
// 1.000.000
Некоторые языки имеют несколько систем письма.
Примеры:
zh-Hans
zh-Hant
sr-Cyrl
sr-Latn
| Тег | Значение |
|---|---|
| zh-Hans | китайский, упрощённый |
| zh-Hant | китайский, традиционный |
| sr-Cyrl | сербский, кириллица |
| sr-Latn | сербский, латиница |
Дополнительные модификаторы локали.
Пример:
de-DE-1996
Обозначает немецкий язык с орфографической реформой 1996 года.
В веб-разработке используется редко.
Главный компонент FormatJS — IntlProvider.
Пример:
import { IntlProvider } from 'react-intl'
<IntlProvider locale="ru">
<App />
</IntlProvider>
Локаль автоматически используется всеми компонентами:
FormattedMessageFormattedDateFormattedNumberFormattedRelativeTimeFormattedPluralЧаще всего локаль определяется:
Accept-Language.Пример:
const locale = navigator.language
console.log(locale)
// ru-RU
Несколько предпочтительных языков:
console.log(navigator.languages)
Результат:
['ru-RU', 'en-US', 'en']
Если перевод отсутствует, FormatJS может использовать запасной язык.
Пример:
<IntlProvider
locale="kk"
defaultLocale="en"
messages={messages}
>
<App />
</IntlProvider>
Здесь:
locale="kk" — активная локаль;defaultLocale="en" — резервная локаль.Многие системы локализации используют постепенное упрощение локали.
Пример:
ru-KZ
↓
ru
↓
en
Алгоритм:
ru-KZ;ru;Сообщения обычно организуются по языковым тегам.
Структура проекта:
locales/
en.json
ru.json
kk.json
Пример:
{
"app.title": "Главная"
}
Подключение:
import ru from './locales/ru.json'
<IntlProvider locale="ru" messages={ru}>
Даже внутри одного языка возможны отличия.
Пример английского:
| Локаль | Слово |
|---|---|
| en-US | color |
| en-GB | colour |
Пример:
en-US.json
en-GB.json
FormatJS использует Intl.NumberFormat.
Пример:
<FormattedNumber value={1234567.89} />
Результат зависит от локали.
1,234,567.89
1 234 567,89
1.234.567,89
Валюта зависит не только от языка, но и от региона.
Пример:
<FormattedNumber
value={1000}
style="currency"
currency="USD"
/>
$1,000.00
1 000,00 $US
Разные страны используют разные правила записи дат.
Пример:
<FormattedDate
value={new Date()}
year="numeric"
month="long"
day="numeric"
/>
May 28, 2026
28 мая 2026 г.
28. Mai 2026
Формат времени также зависит от локали.
12-часовой формат:
3:45 PM
24-часовой формат:
15:45
Разные языки имеют разные формы множественного числа.
Русский язык:
| Число | Форма |
|---|---|
| 1 | товар |
| 2 | товара |
| 5 | товаров |
Английский:
| Число | Форма |
|---|---|
| 1 | item |
| остальные | items |
FormatJS использует правила Intl.PluralRules.
Пример:
<FormattedPlural
value={count}
one="товар"
few="товара"
many="товаров"
other="товара"
/>
Некоторые языки пишутся справа налево.
RTL-языки:
Примеры локалей:
ar
he
fa
Для RTL необходимо:
Пример:
const isRTL = ['ar', 'he', 'fa'].includes(locale)
Использование:
<html dir={isRTL ? 'rtl' : 'ltr'}>
Пользовательские локали могут быть записаны по-разному.
Примеры:
ru-ru
RU_ru
en_us
Корректный формат:
ru-RU
en-US
Современный API ECMAScript предоставляет объект
Intl.Locale.
Пример:
const locale = new Intl.Locale('ru-RU')
console.log(locale.language)
console.log(locale.region)
Результат:
ru
RU
Некоторые окружения не поддерживают все локали.
Проверка:
Intl.NumberFormat.supportedLocalesOf([
'ru',
'kk',
'fr'
])
Приведение локали к стандартному виду.
Пример:
Intl.getCanonicalLocales('EN_us')
Результат:
['en-US']
BCP 47 поддерживает расширения.
Пример:
en-US-u-ca-buddhist
Разбор:
| Часть | Значение |
|---|---|
| u | Unicode extension |
| ca | calendar |
| buddhist | буддийский календарь |
Пример:
new Intl.DateTimeFormat(
'th-TH-u-ca-buddhist'
).format(new Date())
Пример:
ar-EG-u-nu-arab
Использование арабских цифр.
При выборе локали браузер ищет наиболее подходящий вариант.
Например:
Запрошено: en-AU
Доступно:
- en-US
- en-GB
Будет выбран ближайший вариант.
Intl использует два режима сопоставления локалей.
Строгое сопоставление.
Более гибкий поиск.
Пример:
new Intl.DateTimeFormat(
['en-AU'],
{ localeMatcher: 'lookup' }
)
Поддержка локалей зависит от сборки Node.js.
Проверка:
process.versions.icu
Для полноценной интернационализации требуется Full ICU.
Проверка:
Intl.DateTimeFormat.supportedLocalesOf([
'ru',
'zh',
'ar'
])
Старые браузеры могут не поддерживать:
Intl.RelativeTimeFormat;Intl.DisplayNames;Intl.ListFormat;Intl.PluralRules.FormatJS предоставляет polyfill-пакеты.
Пример:
npm install @formatjs/intl-pluralrules
Пример:
import '@formatjs/intl-pluralrules/polyfill'
import '@formatjs/intl-pluralrules/locale-data/ru'
Большие приложения загружают переводы динамически.
Пример:
async function loadLocale(locale) {
const messages = await import(
`./locales/${locale}.json`
)
return messages.default
}
Пример:
const [locale, setLocale] = useState('ru')
Переключение:
setLocale('en')
Популярные способы хранения:
Пример:
/ru/products
/en/products
/kk/products
Преимущества:
Браузер отправляет список предпочитаемых языков.
Пример заголовка:
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Упрощённый пример:
const header =
'ru-RU,ru;q=0.9,en;q=0.8'
const locales = header
.split(',')
.map(item => item.split(';')[0])
Неправильно:
english
russian
ru_RU
Правильно:
en
ru
ru-RU
Неправильно:
RU
US
KZ
Это коды стран, а не языков.
Плохо:
const date = '05/12/2026'
Правильно:
new Intl.DateTimeFormat(locale)
Лучше:
en-US
ru-RU
kk-KZ
Пример:
export const SUPPORTED_LOCALES = [
'en',
'ru',
'kk'
]
Всегда должна существовать базовая локаль.
Пример:
const DEFAULT_LOCALE = 'en'
Необходимо проверять:
Локаль:
kk-KZ
Особенности:
KZT);Пример валюты:
new Intl.NumberFormat('kk-KZ', {
style: 'currency',
currency: 'KZT'
})
API для локализованных названий языков и стран.
Пример:
const languageNames =
new Intl.DisplayNames(['ru'], {
type: 'language'
})
console.log(languageNames.of('en'))
Результат:
английский
Локализованное объединение списков.
Пример:
new Intl.ListFormat('ru').format([
'JavaScript',
'TypeScript',
'Rust'
])
Результат:
JavaScript, TypeScript и Rust
Форматирование относительного времени.
Пример:
new Intl.RelativeTimeFormat('ru').format(
-1,
'day'
)
Результат:
1 день назад
Корректная локализация:
Неправильная локализация приводит к: