Понятие локали

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

В библиотеке Globalize работа с локалями является центральным механизмом, на котором строится вся система форматирования и парсинга данных. Локаль выступает не просто строковым идентификатором, а набором правил, согласованных с глобальными стандартами, основанными на данных Unicode CLDR, поддерживаемых Unicode Consortium.


Структура локали

Локаль в JavaScript обычно представляется строкой формата BCP 47, например:

  • en — английский язык без указания региона
  • en-US — английский (США)
  • en-GB — английский (Великобритания)
  • ru-RU — русский (Россия)
  • zh-Hans-CN — китайский (упрощённое письмо, Китай)

Такая строка состоит из нескольких компонентов:

Языковой код (language subtag) Определяет базовый язык, например ru, en, fr.

Региональный код (region subtag) Уточняет географическую или культурную специфику, например RU, US, FR.

Дополнительные модификаторы Могут включать:

  • вариант написания (script, например Latn, Cyrl)
  • расширения (extensions)
  • частные теги

Роль локали в международализации

Локаль определяет правила, по которым библиотека интерпретирует и форматирует данные.

Форматирование чисел

Разные локали используют различные разделители:

  • В en-US: 1,234.56
  • В ru-RU: 1 234,56

Различие касается:

  • разделителя тысяч
  • десятичного разделителя
  • группировки цифр

Форматирование валют

Локаль влияет на:

  • положение символа валюты
  • формат пробелов
  • округление

Примеры:

  • $1,000.00 (en-US)
  • 1 000,00 € (ru-RU)

Форматирование дат и времени

Локаль определяет:

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

Примеры:

  • MM/DD/YYYY (en-US)
  • DD.MM.YYYY (ru-RU)
  • YYYY-MM-DD (ISO-ориентированные локали)

Локаль как ключевой параметр Globalize

В Globalize локаль задаётся как глобальный или контекстный параметр, определяющий поведение всех операций форматирования.

Основные принципы:

  • все операции зависят от текущей активной локали
  • локаль может быть изменена динамически
  • данные CLDR используются как источник правил

Нормализация и выбор локали

При обработке локалей применяется нормализация:

  • приведение регистра (en-usen-US)
  • проверка корректности тегов
  • сопоставление с доступными данными CLDR

Если указанная локаль отсутствует, используется механизм fallback:

  1. Полная локаль (fr-CA)
  2. Базовый язык (fr)
  3. Системная локаль по умолчанию

Наследование локалей и fallback-цепочки

Модель локалей построена на иерархии:

en-US → en → root

Каждый уровень предоставляет набор правил:

  • более специфичные локали переопределяют базовые
  • отсутствующие данные наследуются из родительской локали

Это позволяет минимизировать дублирование и поддерживать согласованность данных.


CLDR как основа локалей

Данные локалей в Globalize основаны на Unicode CLDR (Common Locale Data Repository) — крупнейшем хранилище культурных правил форматирования.

CLDR включает:

  • числовые форматы
  • календарные системы
  • валютные правила
  • правила множественных форм
  • сортировки строк

Локаль и множественные формы

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

Примеры:

  • английский:

    • 1 item
    • 2 items
  • русский:

    • 1 элемент
    • 2 элемента
    • 5 элементов

Локаль определяет алгоритм выбора формы слова в зависимости от числа.


Динамическое переключение локали

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

  • языка интерфейса
  • региона пользователя
  • настроек устройства

Изменение локали приводит к:

  • пересчёту форматирования
  • обновлению отображаемых строк
  • смене правил интерпретации ввода

Локаль и парсинг данных

Локаль влияет не только на отображение, но и на интерпретацию входных данных.

Примеры различий:

  • число 1,234:

    • в en-US → 1234
    • в ru-RU → 1.234 (в зависимости от контекста)
  • дата 03/04/2025:

    • в en-US → 4 марта
    • в ru-RU → 3 апреля

Это делает локаль критическим параметром при обработке пользовательского ввода.


Кэширование и производительность локалей

Работа с локалями требует оптимизации:

  • парсинг CLDR данных выполняется один раз
  • результаты форматирования могут кэшироваться
  • повторное использование локали снижает нагрузку

Globalize использует предобработанные структуры данных, что уменьшает стоимость операций форматирования.


Совместимость локалей

BCP 47 локали поддерживают расширения:

  • u-nu-latn — система чисел
  • ca-gregory — календарь Григорианский
  • fw-mon — начало недели

Такие расширения позволяют более точно описывать культурные предпочтения, не ограничиваясь только языком и регионом.


Ограничения локалей

Несмотря на гибкость, локали имеют ограничения:

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

Практическое значение локали в архитектуре приложений

Локаль выступает фундаментальным параметром в системах, где требуется:

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

В архитектурном смысле локаль становится частью контекста выполнения приложения, влияя на все уровни представления данных.