Вертикальная письменность

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

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


Локаль как источник информации о направлении письма

В экосистеме JavaScript ключевым инструментом для работы с языковыми характеристиками остаётся Intl.Locale. Этот объект описывает свойства локали, включая направление текста и особенности письменности.

const locale = new Intl.Locale("ja-JP");

Хотя сам по себе объект Locale не управляет отображением, он предоставляет метаданные, которые могут быть использованы движком или приложением для принятия решений о формате текста.

Одним из важных аспектов является текстовая информация, доступная через метод getTextInfo():

const locale = new Intl.Locale("ar-SA", { textInfo: "arab" });

const textInfo = locale.getTextInfo();
console.log(textInfo.direction);

Направление текста

Свойство direction возвращает логическое направление письма:

  • ltr — left-to-right (слева направо)
  • rtl — right-to-left (справа налево)

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

  • японский вертикальный текст: строки идут сверху вниз, блоки справа налево
  • традиционный китайский: аналогичная модель
  • современные веб-страницы могут переключаться между вертикальным и горизонтальным режимами через CSS, опираясь на локаль

Связь вертикальной письменности и Intl.Locale

Вертикальная письменность не определяется напрямую через Intl, однако локаль предоставляет ключевые сигналы:

const locale = new Intl.Locale("zh-Hant-TW");

const info = locale.getTextInfo();

В данном случае важно не само значение direction, а сочетание:

  • языка (zh, ja, ko)
  • письменности (Hans / Hant / Kana / Hangul)
  • культурного контекста региона

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


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

Скрипты (writing systems) определяют, как символы ведут себя при изменении направления текста. Например:

  • CJK-символы (Chinese, Japanese, Korean) сохраняют ориентацию при вертикальном письме
  • латиница часто поворачивается на 90 градусов или раскладывается по одному символу в строку
  • цифры могут сохранять горизонтальное положение или адаптироваться в зависимости от движка

В JavaScript скрипт напрямую не извлекается через базовый Intl.Locale, но его можно косвенно определить через BCP 47 теги:

const locale = new Intl.Locale("ja-JP-u-ca-japanese");

Расширения Unicode Extension Subtags позволяют уточнять поведение календарей, чисел и иногда текстового рендеринга.


Формирование вертикального текста на стороне приложений

Хотя Intl API не предоставляет прямого управления вертикальным layout, он играет роль в выборе стратегии отображения.

Типичный подход:

const locale = new Intl.Locale(navigator.language);

const isCJK = ["ja", "zh", "ko"].includes(locale.language);

if (isCJK) {
  document.body.classList.add("vertical-text");
}

CSS слой:

.vertical-text {
  writing-mode: vertical-rl;
  text-orientation: mixed;
}

В этом взаимодействии:

  • Intl API определяет языковую среду
  • CSS управляет визуальным представлением
  • Unicode обеспечивает корректное поведение символов

Разметка направлений текста и Unicode bidi-модель

Вертикальная письменность тесно связана с bidi-алгоритмом Unicode (bidirectional text algorithm), поскольку в одном документе могут смешиваться:

  • вертикальные блоки
  • горизонтальные вставки
  • RTL-фрагменты (например, арабский текст внутри японского)

Intl API помогает корректно интерпретировать общий контекст локали, но не заменяет Unicode bidi алгоритм.

Пример смешанного текста:

  • японский основной текст (vertical)
  • английские вставки (LTR)
  • числа (нейтральные символы)

Поведение определяется комбинацией:

  • Unicode Bidirectional Algorithm
  • CSS writing-mode
  • локализационных данных Intl

Intl.DisplayNames и косвенная поддержка письменности

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

const dn = new Intl.DisplayNames(["ja"], { type: "language" });

dn.of("en");

Хотя этот API не управляет вертикальной письменностью, он важен для интерфейсов, где язык отображается в разных направлениях письма. Например, в японских интерфейсах список языков может быть выстроен вертикально, но сами названия остаются локализованными через Intl.


Intl.NumberFormat и поведение чисел в вертикальном тексте

Числа в вертикальной письменности представляют отдельную сложность. В зависимости от локали и движка:

  • цифры могут оставаться горизонтальными внутри вертикального потока
  • либо располагаться по одной цифре на строку
const nf = new Intl.NumberFormat("ja-JP");

nf.format(123456);

Intl не меняет ориентацию, но гарантирует корректную локализацию числовых представлений:

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

Вертикальная композиция этих чисел реализуется уже на уровне рендеринга.


Intl.Segmenter и разбиение текста в вертикальных блоках

При вертикальной письменности критически важно корректное разбиение текста на:

  • слова
  • предложения
  • графемные кластеры
const segmenter = new Intl.Segmenter("ja", { granularity: "grapheme" });

for (const segment of segmenter.segment("こんにちは世界")) {
  console.log(segment.segment);
}

В вертикальном рендеринге сегментация влияет на:

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

Особенно важно для CJK, где отсутствуют пробелы между словами.


Локализация направления и интеграция с layout-системами

Современные UI-фреймворки используют Intl как источник «семантической локали», а не визуального стиля.

Типичный pipeline:

  1. Intl.Locale определяет язык и регион

  2. определяется базовое направление (ltr / rtl)

  3. проверяется принадлежность к CJK-наборам

  4. выбирается режим layout:

    • horizontal
    • vertical-rl
    • vertical-lr (редко)
  5. CSS применяет writing-mode


Особенности смешанного вертикального текста

При работе с вертикальной письменностью возникают специфические случаи:

Латиница внутри вертикального текста

Обычно:

  • поворачивается на 90 градусов
  • либо выводится побуквенно

Числа и даты

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

Emoji и символы

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

Intl API не управляет этими аспектами напрямую, но локаль определяет предпочтения окружения, в котором они интерпретируются.


Ограничения Intl API в контексте вертикальной письменности

Несмотря на широкий набор возможностей интернационализации, отсутствуют следующие функции:

  • нет прямого свойства «vertical writing mode»
  • нет API для определения ориентации символов в рендеринге
  • нет управления поворотом глифов
  • нет описания layout-логики строки

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

Основная ответственность распределяется между:

  • CSS Writing Modes
  • Unicode Standard
  • браузерными layout-движками
  • шрифтами OpenType

Координация Intl и рендеринга текста

Вертикальная письменность в веб-приложениях возникает на пересечении трёх слоёв:

  • Intl API — определение языка и культурного контекста
  • Unicode — правила поведения символов
  • Rendering engine — физическое расположение глифов

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