Масса и вес

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

Масса в CLDR представляется через стандартные идентификаторы единиц:

  • kilogram — килограмм
  • gram — грамм
  • pound — фунт
  • ounce — унция
  • ton (metric ton) — метрическая тонна

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


Подготовка данных CLDR для работы с массой

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

Минимальный набор данных:

  • cldr-core
  • cldr-units-full
  • cldr-numbers-full
  • cldr-localenames-full
  • cldr-misc-full

Также требуется загрузка соответствующих JSON-файлов для выбранной локали.

Пример инициализации:

import Globalize from "globalize";
import likelySubtags from "cldr-core/supplemental/likelySubtags.json";
import unitData from "cldr-units-full/main/ru/units.json";
import numbers from "cldr-numbers-full/main/ru/numbers.json";
import plurals from "cldr-core/supplemental/plurals.json";

Globalize.load(likelySubtags, unitData, numbers, plurals);

Globalize.locale("ru");

Ключевой момент: без загрузки cldr-units-full форматирование единиц массы невозможно.


Форматирование массы через unitFormatter

Globalize предоставляет специализированный механизм форматирования единиц измерения — unitFormatter.

Базовый пример работы с килограммами:

const formatMass = Globalize.unitFormatter({
  unit: "kilogram",
  style: "long"
});

formatMass(5);
// "5 килограммов"

В этом примере:

  • unit определяет физическую величину
  • style: "long" задаёт полное текстовое представление
  • числовое значение автоматически адаптируется к правилам локали

Краткий и компактный стиль отображения

Помимо полного текстового представления, поддерживаются альтернативные стили форматирования:

const formatMassShort = Globalize.unitFormatter({
  unit: "kilogram",
  style: "short"
});

formatMassShort(5);
// "5 кг"

И компактный формат:

const formatMassNarrow = Globalize.unitFormatter({
  unit: "kilogram",
  style: "narrow"
});

formatMassNarrow(5);
// "5kg"

Разница между стилями определяется CLDR-локализацией и может существенно варьироваться в зависимости от языка.


Работа с граммами и производными единицами

Globalize поддерживает различные уровни детализации единиц массы:

const formatGrams = Globalize.unitFormatter({
  unit: "gram",
  style: "long"
});

formatGrams(250);
// "250 граммов"

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


Фунты и унции в локализованной системе

Для систем, использующих имперские единицы, применяются другие идентификаторы:

const formatPounds = Globalize.unitFormatter({
  unit: "pound",
  style: "long"
});

formatPounds(10);
// "10 фунтов"
const formatOunces = Globalize.unitFormatter({
  unit: "ounce",
  style: "long"
});

formatOunces(12);
// "12 унций"

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


Локализация множественных форм и грамматика

Globalize не использует универсальные правила формирования слов. Вместо этого применяется система plural rules из CLDR.

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

  • 1 килограмм
  • 2 килограмма
  • 5 килограммов

Эти формы не вычисляются вручную — они берутся из данных:

const formatKg = Globalize.unitFormatter({
  unit: "kilogram",
  style: "long"
});

formatKg(1);
formatKg(2);
formatKg(5);

Результаты зависят исключительно от локали ru.


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

Globalize поддерживает составные единицы, позволяя выражать массу в комбинированном виде:

const formatCompound = Globalize.unitFormatter({
  unit: "kilogram",
  style: "long",
  form: "compound"
});

formatCompound(1.5);
// возможный результат: "1 килограмм и 500 граммов"

Поддержка составных единиц зависит от данных CLDR и не гарантирована для всех локалей.


Нормализация значений и ограничения формата

Globalize не занимается нормализацией массы. Значения передаются в библиотеку в уже приведённом виде.

Пример неправильного ожидания:

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

Корректный подход:

const kg = 2.5;
const grams = kg * 1000;

const formatGrams = Globalize.unitFormatter({
  unit: "gram",
  style: "long"
});

formatGrams(grams);

Различия локалей при отображении массы

Один и тот же код может давать разные результаты:

  • в русской локали: «5 килограммов»
  • в английской: “5 kilograms”
  • в немецкой: “5 Kilogramm”

Это объясняется тем, что CLDR хранит:

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

Производительность форматирования единиц

Создание форматтера — операция затратная, так как происходит сборка правил из CLDR.

Оптимальная практика:

  • создавать formatter один раз
  • переиспользовать его для множества значений
const formatKg = Globalize.unitFormatter({
  unit: "kilogram",
  style: "long"
});

// многократное использование
formatKg(1);
formatKg(10);
formatKg(100);

Частые ошибки при работе с массой в Globalize

Некорректная инициализация CLDR:

// ошибка: отсутствуют cldr-units
Globalize.load(numbers);

Использование несуществующих единиц:

unit: "kg" // неверно
unit: "kilogram" // корректно

Попытка автоматического пересчёта:

  • Globalize не выполняет conversion layer
  • библиотека работает только на уровне представления

Использование массы в интерфейсах и данных

Форматирование массы через Globalize применяется в системах, где важна локализация отображения:

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

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

  • числовая модель (сырой вес)
  • представление (локализованная строка через Globalize)