Термины интернационализации

Интернационализация (i18n) представляет собой набор концепций и стандартов, позволяющих адаптировать программное обеспечение к различным языкам, регионам и культурным особенностям без изменения исходного кода. В экосистеме JavaScript эта область тесно связана с библиотеками форматирования и локализации, среди которых FormatJS занимает ключевое место.

Основой подхода FormatJS является использование стандартизированных терминов и моделей, определённых в ICU (International Components for Unicode), CLDR (Common Locale Data Repository) и спецификациях ECMAScript Internationalization API.


Locale (локаль)

Локаль — базовая единица интернационализации, определяющая языковые и региональные настройки пользователя.

Локаль обычно представляется строкой вида:

  • en — английский язык (обобщённо)
  • en-US — английский (США)
  • fr-FR — французский (Франция)
  • ru-RU — русский (Россия)

Структура локали соответствует BCP 47 (IETF language tag), которая включает:

  • язык (language subtag)
  • регион (region subtag)
  • скрипт (script subtag, опционально)
  • варианты (variants)

Примеры:

  • zh-Hans-CN — китайский, упрощённая письменность, Китай
  • sr-Latn-RS — сербский, латиница, Сербия

В FormatJS локаль используется как ключевой параметр для выбора перевода и правил форматирования чисел, дат и сообщений.


Language Tag (языковой тег)

Языковой тег — формализованная строка, идентифицирующая язык и его вариации.

Он стандартизирован BCP 47 и используется в:

  • HTML (lang="ru")
  • HTTP заголовке Accept-Language
  • JavaScript Intl API

Языковой тег важен для:

  • выбора словарей переводов
  • определения правил множественного числа
  • выбора форматов даты и времени

FormatJS использует язык как часть системы разрешения сообщений и форматирования через ICU-подобные структуры.


CLDR (Common Locale Data Repository)

CLDR — крупнейшая база локализационных данных, используемая в ICU и FormatJS.

CLDR содержит:

  • правила множественного числа
  • форматы дат и времени
  • числовые форматы
  • валютные обозначения
  • списки региональных предпочтений

Пример данных CLDR:

  • как писать дату в ru-RU: dd.MM.yyyy
  • как отображать валюту: 1 234,56 ₽
  • правила plural forms для русского языка

FormatJS опирается на CLDR при обработке:

  • Intl.NumberFormat
  • Intl.DateTimeFormat
  • Intl.PluralRules

ICU MessageFormat

ICU MessageFormat — синтаксис шаблонов сообщений, используемый для интернационализированных строк.

Он позволяет описывать динамические сообщения с условиями, переменными и множественными формами.

Пример:

{count, plural,
  one {# файл}
  few {# файла}
  many {# файлов}
  other {# файлов}
}

Ключевые элементы ICU:

  • plural — выбор формы слова по числу
  • select — выбор варианта по значению
  • number/date/time — форматирование значений
  • вложенные конструкции

FormatJS использует ICU через библиотеку intl-messageformat, обеспечивая:

  • компиляцию сообщений
  • runtime-форматирование
  • поддержку разных локалей

Plural Rules (правила множественного числа)

Plural Rules определяют, как слово изменяется в зависимости от числа.

В разных языках количество форм различается:

  • английский: 2 формы (one, other)
  • русский: 3 формы (one, few, many)
  • арабский: 6 форм

Пример для русского:

  • 1 файл
  • 2 файла
  • 5 файлов

FormatJS использует Intl.PluralRules для определения формы:

const pr = new Intl.PluralRules('ru-RU');
pr.select(1); // "one"
pr.select(2); // "few"
pr.select(5); // "many"

Number Formatting (форматирование чисел)

Форматирование чисел включает локализацию:

  • разделителей тысяч
  • десятичных знаков
  • валют
  • процентов

Примеры:

  • 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);

Date and Time Formatting

Форматирование даты и времени зависит от региона:

  • порядок компонентов даты
  • 12/24-часовой формат
  • обозначение месяца

Примеры:

  • 12/31/2026 (en-US)
  • 31.12.2026 (ru-RU)
  • 31 décembre 2026 (fr-FR)

FormatJS использует:

  • Intl.DateTimeFormat
  • ICU шаблоны дат
new Intl.DateTimeFormat('ru-RU', {
  dateStyle: 'long'
}).format(new Date());

Time Zone (часовой пояс)

Часовой пояс влияет на отображение времени в разных регионах.

Примеры:

  • UTC
  • Europe/Moscow
  • Asia/Almaty

FormatJS поддерживает:

  • конвертацию времени
  • отображение локального времени пользователя
new Intl.DateTimeFormat('en-US', {
  timeZone: 'Asia/Almaty',
  timeStyle: 'short'
}).format(new Date());

Collation (сортировка строк)

Collation — правила сортировки текста.

Разные языки сортируют символы по-разному:

  • в немецком “ä” может сортироваться как “ae”
  • в шведском “å” идёт после “z”

FormatJS использует:

  • Intl.Collator
['ä', 'a', 'z'].sort(new Intl.Collator('de').compare);

Message Descriptor (дескриптор сообщения)

В FormatJS сообщение описывается через структуру:

  • id — уникальный идентификатор
  • defaultMessage — текст по умолчанию
  • description — контекст для переводчика

Пример:

{
  id: 'cart.items',
  defaultMessage: 'В корзине {count} товаров',
  description: 'Количество товаров в корзине'
}

Эта структура используется в:

  • react-intl
  • extraction tooling
  • системах переводов

Variable Interpolation (подстановка переменных)

Интерполяция позволяет вставлять динамические значения в текст.

Пример:

Здравствуйте, {name}

В FormatJS:

formatMessage({
  id: 'greeting',
  defaultMessage: 'Здравствуйте, {name}'
}, { name: 'Алексей' });

Fallback Locale (резервная локаль)

Fallback locale — механизм выбора языка при отсутствии перевода.

Пример цепочки:

  • ru-KZruen

Если перевод не найден:

  • используется базовая локаль
  • затем язык по умолчанию

FormatJS поддерживает стратегию fallback через конфигурацию провайдеров.


RTL (Right-to-Left)

RTL-языки пишутся справа налево:

  • арабский
  • иврит

Особенности:

  • инверсия интерфейса
  • изменение направления текста
  • зеркалирование UI

FormatJS учитывает направление через:

  • dir="rtl"
  • ICU layout rules

ICU Expressions (ICU-выражения)

ICU-выражения позволяют комбинировать:

  • числа
  • условия
  • множественные формы
  • форматирование дат

Пример:

{gender, select,
  male {Он добавил {count} файл}
  female {Она добавила {count} файл}
  other {Пользователь добавил {count} файл}
}

Это основа гибкой локализации в FormatJS.


Internationalization API (Intl)

ECMAScript Internationalization API предоставляет стандартные инструменты:

  • Intl.NumberFormat
  • Intl.DateTimeFormat
  • Intl.PluralRules
  • Intl.Collator

FormatJS расширяет эти возможности, добавляя:

  • ICU MessageFormat
  • управление переводами
  • интеграцию с React
  • extraction сообщений

Role of FormatJS in i18n terminology system

FormatJS объединяет перечисленные термины в единую систему:

  • CLDR определяет данные
  • ICU задаёт синтаксис сообщений
  • Intl API обеспечивает runtime
  • FormatJS связывает всё в прикладной слой

Документация и спецификация доступны на официальном ресурсе: FormatJS Documentation