Направление текста является одним из базовых аспектов локализации пользовательских интерфейсов. В международных системах используются два основных типа направления письма:
Различие затрагивает не только отображение текста, но и структуру интерфейса: расположение элементов навигации, иконок, индикаторов прогресса, таблиц и даже поведения прокрутки.
В контексте JavaScript-библиотеки Globalize направление текста не является функцией форматирования чисел или дат напрямую. Однако оно тесно связано с данными CLDR (Unicode Common Locale Data Repository), на которых основана работа Globalize.
Globalize использует CLDR как базовый источник локализационных данных. В CLDR содержится отдельный раздел, описывающий ориентацию письма и макета интерфейса:
orientation
Пример структуры CLDR JSON:
{
"supplemental": {
"layout": {
"orientation": {
"characterOrder": {
"ar": "right-to-left",
"he": "right-to-left",
"en": "left-to-right",
"ru": "left-to-right"
}
}
}
}
}
Поле characterOrder определяет базовое направление
текста для локали. Эти данные не всегда загружаются автоматически в
Globalize, поэтому доступ к ним осуществляется через подключённые
JSON-файлы CLDR.
Перед использованием информации о направлении текста необходимо загрузить соответствующие CLDR-данные:
import Globalize from "globalize";
import likelySubtags from "cldr-data/supplemental/likelySubtags.json";
import orientation from "cldr-data/supplemental/layout.json";
Globalize.load(likelySubtags);
Globalize.load(orientation);
Дополнительно обычно подключаются языковые данные:
import numbers from "cldr-data/main/ar/numbers.json";
import currencies from "cldr-data/main/ar/currencies.json";
import caGregorian from "cldr-data/main/ar/ca-gregorian.json";
Globalize.load(numbers);
Globalize.load(currencies);
Globalize.load(caGregorian);
После загрузки данных можно работать с локалью:
const globalize = new Globalize("ar");
Globalize предоставляет доступ к объекту CLDR, через который можно извлекать данные из загруженного репозитория.
const cldr = Globalize.cldr;
const direction =
cldr.supplemental("layout/orientation/characterOrder");
console.log(direction.ar); // "right-to-left"
console.log(direction.en); // "left-to-right"
Логика определения направления строится на сопоставлении локали и
значения characterOrder.
На практике требуется функция, которая сопоставляет текущую локаль с направлением текста:
function getDirection(locale) {
const cldr = Globalize.cldr;
const orientation = cldr.supplemental("layout/orientation/characterOrder");
const baseLocale = locale.split("-")[0];
return orientation[baseLocale] || "left-to-right";
}
Использование:
getDirection("ar-EG"); // "right-to-left"
getDirection("en-US"); // "left-to-right"
В веб-интерфейсах направление текста контролируется атрибутом
dir:
dir="ltr"dir="rtl"Привязка CLDR-данных к DOM:
const locale = "ar";
const direction = getDirection(locale);
document.documentElement.setAttribute("dir", direction);
document.documentElement.setAttribute("lang", locale);
Это влияет на:
direction: rtlCSS поддерживает логические свойства, которые автоматически адаптируются к направлению текста.
.container {
text-align: start;
margin-inline-start: 10px;
padding-inline-end: 20px;
}
В LTR:
start = leftend = rightВ RTL:
start = rightend = leftGlobalize не управляет CSS напрямую, но через определение локали может быть связан с системой, которая динамически применяет классы или атрибуты.
Globalize используется как источник локали, а направление текста становится производным параметром:
const globalize = new Globalize("he");
const locale = globalize.cldr.locale.attributes.language.id;
const direction = getDirection(locale);
document.documentElement.dir = direction;
В многоязычных приложениях часто применяется централизованный контроллер локализации:
function applyLocale(locale) {
const g = new Globalize(locale);
const direction = getDirection(locale);
document.documentElement.setAttribute("lang", locale);
document.documentElement.setAttribute("dir", direction);
return g;
}
Важно учитывать, что направление текста не влияет на форматирование чисел и дат внутри Globalize:
Пример:
const g = new Globalize("ar");
g.formatNumber(1234567.89);
// "١٬٢٣٤٬٥٦٧٫٨٩"
Несмотря на RTL-локаль, числовые значения сохраняют корректное представление согласно CLDR.
В интерфейсах часто встречается смешанный текст:
Unicode Bidirectional Algorithm автоматически определяет порядок
отображения, но HTML-атрибут dir задаёт базовое
направление.
<p dir="rtl">
هذا نص يحتوي English words و 123 numbers
</p>
Globalize в данном случае отвечает только за локализацию данных, а не за алгоритм BiDi.
Направление текста влияет не только на строки, но и на визуальную структуру интерфейса:
Пример логического переключения:
const isRTL = getDirection(locale) === "right-to-left";
const icon = isRTL ? "arrow-left" : "arrow-right";
Globalize выполняет роль поставщика локализованных данных:
Direction текста извлекается из CLDR как дополнительный параметр локали и используется в UI-слое.
Архитектура обычно разделяется на уровни:
В одностраничных приложениях направление может меняться без перезагрузки:
function switchLocale(locale) {
const g = new Globalize(locale);
const direction = getDirection(locale);
document.documentElement.dir = direction;
document.documentElement.lang = locale;
updateApp(g);
}
Изменения затрагивают весь layout, поэтому часто требуется перерисовка компонентов интерфейса.
Распространённые проблемы:
dirmargin-left/rightGlobalize не предотвращает эти ошибки, но предоставляет корректную локализационную основу через CLDR.
Направление текста наследуется по DOM-иерархии:
<div dir="rtl">
<section>
<p>текст</p>
</section>
</div>
Все вложенные элементы автоматически получают RTL-направление, если не переопределено локально.
Типичная схема использования:
import Globalize from "globalize";
function initLocale(locale) {
const g = new Globalize(locale);
const dir = getDirection(locale);
document.documentElement.setAttribute("lang", locale);
document.documentElement.setAttribute("dir", dir);
return {
formatNumber: g.formatNumber.bind(g),
formatDate: g.formatDate.bind(g),
formatCurrency: g.formatCurrency.bind(g)
};
}
UI-слой использует возвращённые функции, а направление текста применяется глобально на уровне DOM.
CSS Flexbox и Grid адаптируются к direction:
flex-start и flex-end меняются
местамиgrid-column-start логически инвертируется.container {
display: flex;
justify-content: space-between;
}
В RTL и LTR поведение остаётся семантически корректным при использовании логических значений.
Direction текста в Globalize является не встроенной функцией форматирования, а производным значением из CLDR-данных. Он используется как связующий параметр между локализацией данных и визуальным представлением интерфейса, обеспечивая корректную адаптацию LTR и RTL языков в единой архитектуре приложения.