Вертикальная письменность представляет собой систему отображения текста, при которой символы располагаются сверху вниз, а строки следуют справа налево или слева направо в зависимости от традиции письма. Наиболее устойчиво вертикальная ориентация используется в восточноазиатских письменностях: японской, китайской и корейской традициях. При этом современный веб-стек должен учитывать не только визуальную сторону отображения, но и локализационные свойства текста, которые формализуются через 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 (справа налево)Хотя вертикальная письменность напрямую не представлена отдельным значением, она комбинируется с горизонтальным направлением строки. Например:
Вертикальная письменность не определяется напрямую через
Intl, однако локаль предоставляет ключевые сигналы:
const locale = new Intl.Locale("zh-Hant-TW");
const info = locale.getTextInfo();
В данном случае важно не само значение direction, а
сочетание:
zh, ja, ko)Эти параметры позволяют системе предположить, поддерживается ли вертикальный режим отображения.
Скрипты (writing systems) определяют, как символы ведут себя при изменении направления текста. Например:
В 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;
}
В этом взаимодействии:
Вертикальная письменность тесно связана с bidi-алгоритмом Unicode (bidirectional text algorithm), поскольку в одном документе могут смешиваться:
Intl API помогает корректно интерпретировать общий контекст локали, но не заменяет Unicode bidi алгоритм.
Пример смешанного текста:
Поведение определяется комбинацией:
Intl.DisplayNames используется для отображения
локализованных названий языков, регионов и скриптов.
const dn = new Intl.DisplayNames(["ja"], { type: "language" });
dn.of("en");
Хотя этот API не управляет вертикальной письменностью, он важен для интерфейсов, где язык отображается в разных направлениях письма. Например, в японских интерфейсах список языков может быть выстроен вертикально, но сами названия остаются локализованными через Intl.
Числа в вертикальной письменности представляют отдельную сложность. В зависимости от локали и движка:
const nf = new Intl.NumberFormat("ja-JP");
nf.format(123456);
Intl не меняет ориентацию, но гарантирует корректную локализацию числовых представлений:
Вертикальная композиция этих чисел реализуется уже на уровне рендеринга.
При вертикальной письменности критически важно корректное разбиение текста на:
const segmenter = new Intl.Segmenter("ja", { granularity: "grapheme" });
for (const segment of segmenter.segment("こんにちは世界")) {
console.log(segment.segment);
}
В вертикальном рендеринге сегментация влияет на:
Особенно важно для CJK, где отсутствуют пробелы между словами.
Современные UI-фреймворки используют Intl как источник «семантической локали», а не визуального стиля.
Типичный pipeline:
Intl.Locale определяет язык и регион
определяется базовое направление (ltr /
rtl)
проверяется принадлежность к CJK-наборам
выбирается режим layout:
CSS применяет writing-mode
При работе с вертикальной письменностью возникают специфические случаи:
Обычно:
Intl API не управляет этими аспектами напрямую, но локаль определяет предпочтения окружения, в котором они интерпретируются.
Несмотря на широкий набор возможностей интернационализации, отсутствуют следующие функции:
Intl выполняет роль метаданных локали, а не системы визуализации текста.
Основная ответственность распределяется между:
Вертикальная письменность в веб-приложениях возникает на пересечении трёх слоёв:
Такое разделение позволяет поддерживать единообразную модель интернационализации, где текст остаётся абстрактным объектом до момента визуализации, а направление письма определяется контекстом локали и стилями отображения.