Автоматический выбор единиц

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

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

В CLDR для каждой локали могут быть заданы:

  • предпочтительная система измерений (метрическая или имперская)
  • правила отображения единиц (полная форма, сокращённая, узкая)
  • шаблоны для единственного, двойственного и множественного числа
  • формат комбинированных единиц (например, «5 км 200 м»)

Globalize не «угадывает» единицы самостоятельно — он следует данным CLDR, обеспечивая предсказуемое поведение при смене локали.

Система измерений и её выбор

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

  • длина: километры или мили
  • температура: градусы Цельсия или Фаренгейта
  • объём: литры или галлоны
  • масса: килограммы или фунты

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

Например, при локали en-US расстояния могут отображаться в милях, а при fr-FR — в километрах. Это не просто перевод единиц, а переключение логики представления.

Нормализация единиц и преобразование масштаба

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

Типичный пример — длина:

  • 1200 meters → 1.2 km
  • 1500 meters → 1.5 km
  • 300 meters → 300 m

В CLDR описаны пороги масштабирования, при которых происходит переход между единицами. Globalize использует эти данные при форматировании через механизм unit formatting.

При этом важно, что преобразование не является произвольным: оно строго следует правилам системы единиц и их десятичным соотношениям. Это позволяет избежать расхождений между локалями и обеспечивает математическую согласованность.

Форматы отображения: длинный, короткий и узкий стиль

Единицы измерения могут отображаться по-разному в зависимости от контекста интерфейса:

  • long: полная форма («5 километров»)
  • short: сокращённая форма («5 км»)
  • narrow: минималистичная форма («5км»)

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

Автоматический выбор здесь проявляется в том, что разработчику не нужно вручную определять строки для каждой локали и каждого формата. Достаточно указать стиль, а библиотека подставит соответствующий шаблон из CLDR.

Множественные формы и грамматическая согласованность

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

В разных языках правила различаются:

  • в английском: 1 mile, 2 miles
  • в русском: 1 километр, 2 километра, 5 километров
  • в арабском и других языках количество форм может быть значительно больше

CLDR содержит правила plural categories, а Globalize использует их для выбора правильной формы единицы.

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

Контекстный выбор единиц

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

Например:

  • расстояние в навигации: «2 км до цели»
  • расстояние в статистике: «2000 м суммарно»
  • спортивные результаты: «5 km run»

CLDR различает категории единиц (length, speed, duration и т. д.), а также предоставляет паттерны их использования. Globalize, опираясь на эти данные, обеспечивает контекстно корректное отображение.

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

Комбинированные единицы и разбиение значений

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

Примеры:

  • время: 1 час 15 минут
  • расстояние: 3 км 200 м
  • масса: 2 кг 350 г

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

При этом автоматический выбор единиц включает:

  • определение основной единицы
  • разбиение остатка на вспомогательные единицы
  • применение локализованных соединительных шаблонов

Автоматическое округление и выбор точности

При переходе между единицами возникает необходимость округления. Например, значение 1499 meters может быть представлено как:

  • 1500 m (без смены единицы)
  • 1.5 km (с переключением единицы)

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

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

Взаимодействие с числовым форматированием

Форматирование единиц в Globalize неразрывно связано с числовыми форматами:

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

Таким образом, итоговая строка формируется из двух слоёв данных:

  1. числового форматирования
  2. единичного шаблона

Автоматический выбор единиц учитывает оба слоя одновременно.

Механизм построения итоговой строки

Процесс формирования результата можно представить как последовательность шагов:

  1. определение локали
  2. выбор системы измерений
  3. преобразование исходного значения в базовую единицу
  4. подбор оптимального масштаба
  5. выбор стиля отображения (long/short/narrow)
  6. применение правил множественности
  7. подстановка локализованного шаблона
  8. объединение с числовым форматом

Каждый этап опирается на данные CLDR, а не на жёстко зашитую логику библиотеки.

Роль CLDR в унификации поведения

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

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

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