Интернационализация (i18n) представляет собой набор концепций и стандартов, позволяющих адаптировать программное обеспечение к различным языкам, регионам и культурным особенностям без изменения исходного кода. В экосистеме JavaScript эта область тесно связана с библиотеками форматирования и локализации, среди которых FormatJS занимает ключевое место.
Основой подхода FormatJS является использование стандартизированных терминов и моделей, определённых в ICU (International Components for Unicode), CLDR (Common Locale Data Repository) и спецификациях ECMAScript Internationalization API.
Локаль — базовая единица интернационализации, определяющая языковые и региональные настройки пользователя.
Локаль обычно представляется строкой вида:
en — английский язык (обобщённо)en-US — английский (США)fr-FR — французский (Франция)ru-RU — русский (Россия)Структура локали соответствует BCP 47 (IETF language tag), которая включает:
Примеры:
zh-Hans-CN — китайский, упрощённая письменность,
Китайsr-Latn-RS — сербский, латиница, СербияВ FormatJS локаль используется как ключевой параметр для выбора перевода и правил форматирования чисел, дат и сообщений.
Языковой тег — формализованная строка, идентифицирующая язык и его вариации.
Он стандартизирован BCP 47 и используется в:
lang="ru")Accept-LanguageЯзыковой тег важен для:
FormatJS использует язык как часть системы разрешения сообщений и форматирования через ICU-подобные структуры.
CLDR — крупнейшая база локализационных данных, используемая в ICU и FormatJS.
CLDR содержит:
Пример данных CLDR:
ru-RU: dd.MM.yyyy1 234,56 ₽FormatJS опирается на CLDR при обработке:
Intl.NumberFormatIntl.DateTimeFormatIntl.PluralRulesICU MessageFormat — синтаксис шаблонов сообщений, используемый для интернационализированных строк.
Он позволяет описывать динамические сообщения с условиями, переменными и множественными формами.
Пример:
{count, plural,
one {# файл}
few {# файла}
many {# файлов}
other {# файлов}
}
Ключевые элементы ICU:
FormatJS использует ICU через библиотеку
intl-messageformat, обеспечивая:
Plural Rules определяют, как слово изменяется в зависимости от числа.
В разных языках количество форм различается:
one, other)one, few,
many)Пример для русского:
FormatJS использует Intl.PluralRules для определения
формы:
const pr = new Intl.PluralRules('ru-RU');
pr.select(1); // "one"
pr.select(2); // "few"
pr.select(5); // "many"
Форматирование чисел включает локализацию:
Примеры:
1,234.56 (en-US)1 234,56 (fr-FR)1 234,56 (ru-RU)В FormatJS используется Intl.NumberFormat:
new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'RUB'
}).format(1234.56);
Форматирование даты и времени зависит от региона:
Примеры:
12/31/2026 (en-US)31.12.2026 (ru-RU)31 décembre 2026 (fr-FR)FormatJS использует:
Intl.DateTimeFormatnew Intl.DateTimeFormat('ru-RU', {
dateStyle: 'long'
}).format(new Date());
Часовой пояс влияет на отображение времени в разных регионах.
Примеры:
FormatJS поддерживает:
new Intl.DateTimeFormat('en-US', {
timeZone: 'Asia/Almaty',
timeStyle: 'short'
}).format(new Date());
Collation — правила сортировки текста.
Разные языки сортируют символы по-разному:
FormatJS использует:
Intl.Collator['ä', 'a', 'z'].sort(new Intl.Collator('de').compare);
В FormatJS сообщение описывается через структуру:
id — уникальный идентификаторdefaultMessage — текст по умолчаниюdescription — контекст для переводчикаПример:
{
id: 'cart.items',
defaultMessage: 'В корзине {count} товаров',
description: 'Количество товаров в корзине'
}
Эта структура используется в:
react-intlИнтерполяция позволяет вставлять динамические значения в текст.
Пример:
Здравствуйте, {name}
В FormatJS:
formatMessage({
id: 'greeting',
defaultMessage: 'Здравствуйте, {name}'
}, { name: 'Алексей' });
Fallback locale — механизм выбора языка при отсутствии перевода.
Пример цепочки:
ru-KZ → ru → enЕсли перевод не найден:
FormatJS поддерживает стратегию fallback через конфигурацию провайдеров.
RTL-языки пишутся справа налево:
Особенности:
FormatJS учитывает направление через:
dir="rtl"ICU-выражения позволяют комбинировать:
Пример:
{gender, select,
male {Он добавил {count} файл}
female {Она добавила {count} файл}
other {Пользователь добавил {count} файл}
}
Это основа гибкой локализации в FormatJS.
ECMAScript Internationalization API предоставляет стандартные инструменты:
Intl.NumberFormatIntl.DateTimeFormatIntl.PluralRulesIntl.CollatorFormatJS расширяет эти возможности, добавляя:
FormatJS объединяет перечисленные термины в единую систему:
Документация и спецификация доступны на официальном ресурсе: FormatJS Documentation