Семантическая разметка

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

Принцип разделения данных и представления

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

Базовый принцип:

  • входные данные → семантическое значение
  • семантическое значение → локализованное представление

Например, число 1000 не является строкой "1000", а представляет числовую сущность, которая в разных локалях может быть отображена как:

  • 1,000 (en-US)
  • 1.000 (de-DE)
  • 1 000 (fr-FR)

Globalize использует CLDR (Unicode Common Locale Data Repository) как источник семантических правил.

Семантические категории данных

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

Числовые значения

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

  • форматирование
  • группировку разрядов
  • десятичные разделители
  • локальные правила округления
Globalize.numberFormatter()(12345.678);
// "12,345.678" (en-US)

Globalize.locale("de");
// "12.345,678"

Смысловой уровень: число остается числом, но его визуальное представление зависит от контекста локали.

Валютные значения

Валюта добавляет второй слой семантики — экономическую категорию.

Globalize.currencyFormatter("USD")(1000);
// "$1,000.00"

Globalize.locale("ja");
Globalize.currencyFormatter("JPY")(1000);
// "¥1,000"

Семантическая разметка включает:

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

Даты и время

Дата в семантической модели — это не строка, а временная точка с контекстом представления.

Globalize.dateFormatter({ datetime: "medium" })(new Date());

Семантика включает:

  • формат (short, medium, long, full)
  • локальные календарные правила
  • порядок компонентов (день/месяц/год)
  • 12/24-часовой формат

Семантика сообщений

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

Базовая интерполяция

Globalize.messageFormatter("welcome")({
  name: "Alex"
});

Шаблон:

Hello, {name}!

Здесь {name} — не просто подстановка, а семантический слот.

Параметризация и типизация значений

Семантическая разметка сообщений позволяет учитывать тип переменной:

  • строка
  • число
  • дата
  • множественное значение

Множественность как семантическая система

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

Globalize.messageFormatter("items")({
  count: 5
});

Пример шаблона:

{count, plural,
  one {# item}
  other {# items}
}

Семантика:

  • count — числовая сущность
  • правило выбора формы зависит от языка
  • # — представление значения в контексте формы

В разных локалях:

  • английский: one / other
  • русский: one / few / many / other
  • арабский: более сложная система категорий

Семантические правила локалей

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

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

Русский язык:

  • 1 → one (1 товар)
  • 2–4 → few (2 товара)
  • 5–20 → many (5 товаров)

Семантика здесь выражается не в строке, а в категории числа.

Семантическая обработка дат

Даты в Globalize включают несколько уровней интерпретации:

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

Globalize.relativeTimeFormatter("day")(1);
// "in 1 day"

Семантика:

  • направление (прошлое / будущее)
  • единица измерения (день, час, месяц)
  • локальные правила выражения

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

  • короткий: 12/01/24
  • средний: Dec 1, 2024
  • длинный: December 1, 2024
  • полный: Sunday, December 1, 2024

Каждый формат — это отдельная семантическая конфигурация.

Семантика валютных выражений

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

  • символ валюты
  • позицию символа (до или после числа)
  • пробелы и разделители
  • локальные правила округления
Globalize.currencyFormatter("EUR")(2500);
// "2,500.00 €"

Семантический уровень отделяет:

  • значение (2500)
  • валютный тип (EUR)
  • локаль (например, fr-FR)

Семантическая структура форматеров

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

семантическое значение → локализационная функция → строка представления

Типы форматеров:

  • numberFormatter
  • currencyFormatter
  • dateFormatter
  • messageFormatter
  • relativeTimeFormatter

Композиция семантических значений

Сложные сообщения часто комбинируют несколько типов данных:

Globalize.messageFormatter("invoice")({
  amount: 1234.56,
  currency: "USD",
  date: new Date()
});

Шаблон:

Invoice of {amount, number, currency} issued on {date, date, medium}

Семантика:

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

Нормализация данных перед разметкой

Перед применением семантической разметки данные приводятся к нормализованному виду:

  • числа → Number
  • даты → Date
  • валюты → код ISO
  • строки → UTF-16 безопасные последовательности

Это обеспечивает корректную работу CLDR-правил.

Семантические ошибки интерпретации

Нарушения семантической модели приводят к ошибкам локализации:

  • передача строки вместо числа
  • отсутствие локали
  • неверный код валюты
  • несоответствие типов в message-параметрах

Пример ошибки:

Globalize.currencyFormatter("USD")("1000"); // некорректный тип

Роль CLDR в семантической разметке

CLDR обеспечивает:

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

Globalize выступает как интерпретатор этих данных, превращая их в прикладную семантическую систему.

Абстракция локализации через семантические слои

Семантическая разметка строится в несколько уровней:

  1. Базовый уровень данных

    • числа
    • даты
    • строки
  2. Семантический уровень

    • типизация значений
    • категории (plural, currency, time)
  3. Локализационный уровень

    • правила языка
    • форматирование
  4. Представление

    • итоговая строка

Унификация семантики сообщений

Система сообщений объединяет все типы данных в единый механизм интерпретации, где строка становится декларацией, а не результатом.

{name} has {count, plural, one {1 message} other {# messages}}

Здесь:

  • {name} — строковая сущность
  • {count} — числовая семантика
  • plural — правило выбора формы

Семантическая устойчивость интерфейсов

Использование Globalize позволяет интерфейсам сохранять стабильную структуру независимо от языка:

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

Это достигается за счет строгой семантической модели данных и правил их интерпретации.