Единицы измерения времени

Globalize опирается на данные CLDR (Unicode Common Locale Data Repository) и предоставляет слой интернационализации, который позволяет приводить единицы измерения времени к локально корректному виду. Работа с временными единицами в этой библиотеке включает форматирование длительностей, относительного времени, а также управление грамматическими формами (plural rules), которые критичны для языков с богатой морфологией.

Временные единицы в контексте локализации представляют собой набор стандартных категорий:

  • секунда
  • минута
  • час
  • день
  • неделя
  • месяц
  • год

Каждая из этих единиц существует в нескольких формах выражения:

  • в единственном числе
  • в множественных формах (различных для разных языков)
  • в контекстах относительного времени (например, «через 5 минут», «3 дня назад»)

Globalize не хранит собственных языковых правил. Вместо этого используется CLDR, где описаны:

  • правила множественного числа (plural rules)
  • локализованные шаблоны сообщений
  • сокращённые и полные формы единиц измерения
  • правила склонения в зависимости от числа и контекста

Подготовка данных CLDR

Перед использованием функций форматирования временных единиц требуется загрузка соответствующих наборов CLDR-данных. Они включают:

  • языковые данные (main)
  • правила множественных форм (supplemental/plurals)
  • метаданные единиц измерения (units)

Без этих данных форматирование временных интервалов невозможно, так как библиотека не содержит встроенных языковых правил.

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

Основная операция — преобразование числового значения и единицы времени в локализованную строку.

Типичный сценарий:

  • вход: число + единица измерения
  • выход: локализованная строка

Примеры логики:

  • 1 second → «1 секунда»
  • 2 seconds → «2 секунды»
  • 5 seconds → «5 секунд»

Разница между языками проявляется в правилах:

  • в английском достаточно различать singular/plural
  • в русском существует несколько форм множественного числа

Плюрализация и языковые правила

Ключевой механизм работы временных единиц — plural rules.

В русском языке выделяются категории:

  • one (1, 21, 31…)
  • few (2–4, 22–24…)
  • many (0, 5–20, 25–30…)

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

Пример логики:

  • 1 минута → one
  • 2 минуты → few
  • 5 минут → many

Каждая единица времени имеет набор форм, связанных с этими категориями.

Относительное время

Относительное время выражает временные интервалы относительно текущего момента:

  • «5 минут назад»
  • «через 2 часа»
  • «1 день назад»
  • «через 3 недели»

Внутри Globalize это реализуется через шаблоны сообщений CLDR, где используются переменные:

  • {0} — числовое значение
  • unit — единица времени
  • direction — прошлое или будущее

Структура формируется по правилам локали:

  • порядок слов
  • падежные формы
  • выбор предлогов

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

Длительность отличается от относительного времени тем, что не привязана к текущему моменту. Это чистая величина интервала:

  • 90 секунд → «1 минута 30 секунд»
  • 3600 секунд → «1 час»

В Globalize длительности могут формироваться:

  • в компактной форме (1 ч 30 мин)
  • в полной форме (1 час 30 минут)
  • в комбинированной форме (декомпозиция на несколько единиц)

При этом используется разбиение времени на компоненты:

  • секунды → минуты → часы → дни

Единицы измерения и локальные варианты

Каждая временная единица имеет несколько вариантов представления:

Полная форма

Используется в текстах и пояснениях:

  • «5 минут»
  • «2 часа»

Сокращённая форма

Используется в интерфейсах:

  • «5 мин»
  • «2 ч»

Узкая форма

Применяется в ограниченном пространстве:

  • «5м»
  • «2ч»

Globalize выбирает форму на основе параметров форматирования и локали.

API форматирования временных единиц

Работа с единицами времени осуществляется через единый механизм форматирования единиц измерения.

Логика использования включает:

  • выбор локали
  • выбор типа единицы
  • выбор ширины представления
  • применение plural rules

Внутренне библиотека обращается к CLDR-структурам:

  • unit patterns
  • unit short patterns
  • unit narrow patterns

Комбинирование временных единиц

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

Пример:

  • 1 час 45 минут 30 секунд

Алгоритм:

  1. Разделение общего количества секунд
  2. Выделение старших единиц
  3. Формирование строк для каждой единицы
  4. Объединение с учётом локальных правил

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

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

Локализационные особенности

Работа с временными единицами включает ряд языковых особенностей:

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

Например:

  • в русском «1 час» ≠ «2 час»
  • в арабских и некоторых азиатских языках могут использоваться иные категории множественности

Globalize не фиксирует эти правила, а полностью делегирует их CLDR.

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

Временные единицы применяются в разных сценариях:

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

В каждом случае требования к формату различаются:

  • точность (секунды vs минуты)
  • компактность
  • читаемость
  • локальная корректность

Согласование единиц в сложных структурах

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

  • единица + числительное
  • единицы между собой
  • порядок отображения

Например, в одном языке допустимо:

  • «1 час 5 минут»

В другом:

  • «5 минут и 1 час»

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

Роль CLDR в формировании временных единиц

CLDR определяет:

  • формы слов для каждой единицы времени
  • правила выбора форм по числу
  • шаблоны сообщений
  • контекстные варианты (standalone, formatting)

Структура данных включает:

  • unitPatterns
  • durationFormats
  • relativeTimePatterns

Globalize выступает как слой интерпретации этих данных.

Особенности обработки языков с богатой морфологией

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

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

Это требует:

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

Оптимизация представления времени

При отображении временных единиц часто применяется упрощение:

  • округление значений
  • сокращение количества единиц
  • выбор наиболее значимой единицы

Пример:

  • 59 секунд → «59 секунд»
  • 61 секунда → «1 минута»

Такая нормализация зависит от локали и контекста отображения.