Системы письма и направление текста

В интернационализации пользовательских интерфейсов ключевую роль играет корректная работа с системами письма (scripts) и направлением текста (text directionality). В JavaScript-экосистеме эти задачи часто решаются через Globalize, опирающийся на данные CLDR и стандарты Unicode.

Понятие системы письма в контексте локализации

Система письма представляет собой набор графических символов и правил их использования для записи языка. В рамках интернационализации это понятие расширяется до связки:

  • язык (locale language tag)
  • регион
  • письменность (script)
  • вариации отображения (orthographic variants)

Примеры:

  • латиница (Latin)
  • кириллица (Cyrillic)
  • арабское письмо (Arabic)
  • деванагари (Devanagari)
  • китайские иероглифы (Han)

В Unicode каждая письменность идентифицируется четырёхбуквенным кодом ISO 15924: Latn, Cyrl, Arab, Hani и др. Эти коды используются в CLDR и, следовательно, в Globalize для выбора локализованных правил отображения данных.

Globalize не «рисует» символы и не выполняет рендеринг текста, но определяет, как данные должны интерпретироваться и форматироваться в зависимости от языка и письменности.

Локали и script subtags

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

  • en — английский (по умолчанию латиница)
  • sr-Cyrl — сербский на кириллице
  • zh-Hans — упрощённый китайский (Simplified Han)
  • zh-Hant — традиционный китайский (Traditional Han)
  • ar — арабский язык (арабское письмо подразумевается)

Globalize использует данные CLDR, где script subtags играют важную роль при выборе:

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

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

Направление текста (Text Direction)

Направление текста — это фундаментальное свойство письменности, определяющее порядок отображения символов в строке.

Основные направления:

  • LTR (Left-to-Right) — слева направо
  • RTL (Right-to-Left) — справа налево
  • TTB (Top-to-Bottom) — вертикальное письмо (исторически и в некоторых восточноазиатских системах)

Примеры:

  • английский: LTR
  • русский: LTR
  • арабский: RTL
  • иврит: RTL
  • традиционный китайский (в исторических контекстах): TTB

Unicode задаёт алгоритм двунаправленного текста (Bidirectional Algorithm), который определяет порядок отображения смешанных строк, содержащих LTR и RTL сегменты.

Globalize не реализует bidi-алгоритм самостоятельно, но предоставляет данные, необходимые для интеграции с UI-слоем, где этот алгоритм уже применяется (например, браузерным движком).

Bidi-контекст и смешанные строки

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

  • английский текст внутри арабского интерфейса
  • числа внутри RTL-предложений
  • URL и email в любом контексте

Например:

مرحبا user123، لديك 5 رسائل جديدة

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

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

  • сильные символы (strong types)
  • нейтральные символы
  • слабые символы (например, цифры)

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

Globalize, работая поверх CLDR, предоставляет информацию о локали, которая позволяет корректно интерпретировать такие строки в связке с UI-слоем.

Роль CLDR в определении script и direction

CLDR содержит структурированные данные о локалях, включая:

  • default script для языка
  • directionality (LTR/RTL)
  • региональные вариации форматирования
  • предпочтительные календарные системы

Для арабского языка CLDR определяет:

  • script: Arabic
  • direction: RTL
  • специфические форматы чисел (в некоторых регионах — восточно-арабские цифры)

Для английского:

  • script: Latin
  • direction: LTR

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

Поддержка script в Globalize

Globalize опирается на CLDR JSON-данные, где присутствуют записи, связанные с языками и письменностями.

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

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

Пример структуры данных CLDR:

{
  "main": {
    "ar": {
      "identity": {
        "language": { "type": "ar" },
        "script": { "type": "Arab" },
        "territory": { "type": "EG" }
      }
    }
  }
}

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

Влияние script на форматирование чисел

Хотя числа универсальны, их представление зависит от письменности.

Примеры:

  • арабская запись: ١٢٣٤
  • латинская запись: 1234

Globalize, используя CLDR, может форматировать числа в зависимости от локали:

  • выбор набора цифр
  • разделители тысяч
  • десятичные разделители

Пример:

Globalize("ar").numberFormatter()(1234.56);

Результат зависит от локали и может использовать восточно-арабские цифры и запятые/точки в соответствии с региональными правилами.

Направление текста и пользовательский интерфейс

Направление текста влияет не только на строки, но и на:

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

Для RTL-интерфейсов:

  • кнопки «назад» и «вперёд» меняются местами
  • меню может открываться справа налево
  • логика визуального потока инвертируется

Globalize не управляет DOM, но его данные используются для принятия решений на уровне UI-фреймворков.

Переключение локалей и влияние на script

При смене локали меняется не только язык, но и:

  • script
  • direction
  • формат отображения данных

Пример сценариев:

  • en → латиница, LTR
  • ar → арабское письмо, RTL
  • he → иврит, RTL
  • ru → кириллица, LTR

Это требует от системы UI динамического пересчёта layout.

Смешанные направления и вложенные структуры

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

  • таблицы с RTL и LTR колонками
  • числовые данные внутри RTL текста
  • формулы и URL в арабском контексте

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

  • изоляцию направлений (bidi isolation)
  • маркировку направлений (LRM, RLM)
  • контекстное форматирование

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

Script extensions в локалях

Некоторые языки используют несколько письменностей:

  • сербский: Cyrillic и Latin
  • азербайджанский: Latin, Cyrillic, Arabic (исторически)
  • японский: Kanji + Hiragana + Katakana

CLDR учитывает такие случаи через расширенные локали:

  • sr-Cyrl
  • sr-Latn

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

Влияние направления текста на формат дат

Формат даты может визуально меняться в зависимости от script и direction:

  • LTR: 12/05/2026
  • RTL: визуальное расположение элементов может инвертироваться, хотя логическая структура остаётся неизменной

CLDR задаёт предпочтительные форматы:

  • порядок день/месяц/год
  • разделители
  • календарные системы (григорианский, исламский и др.)

Globalize применяет эти данные при форматировании:

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

Script-aware сортировка строк

Сортировка (collation) зависит от письменности:

  • латиница сортируется по ASCII/Unicode правилам
  • кириллица — по локализованным правилам
  • китайские иероглифы — по радикалам или пиньиню

CLDR предоставляет collation tables, которые Globalize использует для:

  • сравнения строк
  • сортировки списков
  • поиска и фильтрации

Это особенно важно в многоязычных интерфейсах, где смешиваются разные scripts.

Архитектурная роль Globalize в работе с script и direction

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

  • сырыми CLDR-данными
  • прикладным кодом интерфейса

Его задачи:

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

Вся логика script и direction остаётся декларативной: данные описываются в CLDR, а Globalize предоставляет API для их использования.

Связь script и семантики интерфейса

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

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

LTR интерфейсы обычно предполагают линейное движение слева направо, тогда как RTL требует зеркалирования структуры.

В многоязычных приложениях это приводит к необходимости:

  • зеркалирования layout
  • адаптации иконографии
  • перестройки навигации

Globalize обеспечивает корректность данных, но семантическая адаптация выполняется на уровне UI-слоя с учётом его локализованных данных.