Mithril — лёгкий и современный JavaScript-фреймворк для построения одностраничных приложений (SPA). Он предоставляет мощные средства для управления виртуальным DOM, маршрутизацией и асинхронными запросами, одновременно оставаясь минималистичным по синтаксису. Поддержка языков с правосторонним письмом (RTL, Right-to-Left) — важный аспект при разработке интерфейсов для арабского, ивритского и других RTL-языков. Рассмотрим ключевые подходы и практические техники интеграции RTL в приложения на Mithril.
dirHTML предоставляет стандартный атрибут dir, который
может принимать значения:
ltr — слева направо (по умолчанию),rtl — справа налево,auto — браузер определяет направление по первым
символам текста.В Mithril атрибуты передаются напрямую в виртуальный DOM:
import m from "mithril";
const App = {
view: () =>
m("div", { dir: "rtl" },
m("h1", "مرحبا بالعالم"),
m("p", "هذا نص باللغة العربية مع دعم RTL")
)
};
m.mount(document.body, App);
Ключевой момент: установка dir="rtl" на
корневом контейнере приложения позволяет корректно отрисовывать все
вложенные элементы.
Часто требуется менять направление текста динамически в зависимости от выбранного языка. В Mithril это удобно реализовать через реактивные состояния:
import m from "mithril";
let currentDir = "ltr";
const toggleDir = () => {
currentDir = currentDir === "ltr" ? "rtl" : "ltr";
};
const App = {
view: () =>
m("div", { dir: currentDir },
m("button", { onclick: toggleDir }, "Переключить направление"),
m("p", currentDir === "rtl" ? "مرحبا بالعالم" : "Hello World")
)
};
m.mount(document.body, App);
Вывод: виртуальный DOM Mithril автоматически
обновляет атрибут dir, обеспечивая мгновенную смену
направления текста без ручного управления DOM.
Для полноценной поддержки RTL необходимо учитывать не только направление текста, но и расположение блоков, маргинов, паддингов и выравнивание:
.rtl {
text-align: right;
direction: rtl;
}
.ltr {
text-align: left;
direction: ltr;
}
.container {
padding: 16px;
margin: 8px;
}
В компоненте можно динамически назначать CSS-классы:
m("div", { class: currentDir === "rtl" ? "rtl container" : "ltr container" },
m("p", "Текст с поддержкой направления")
)
Совет: для комплексных интерфейсов рекомендуется создавать отдельные RTL- и LTR-версии стилей, либо использовать CSS-переменные для автоматического зеркалирования расположения элементов.
Mithril поддерживает маршрутизацию через m.route. Для
многоязычных приложений с RTL полезно задавать направление текста на
уровне маршрута:
import m from "mithril";
const routes = {
"/": { component: Home, dir: "ltr" },
"/ar": { component: Home, dir: "rtl" }
};
const Home = {
view: ({ attrs }) =>
m("div", { dir: attrs.dir },
m("h1", attrs.dir === "rtl" ? "مرحبا بالعالم" : "Hello World")
)
};
m.route(document.body, "/", routes);
Особенность: передача dir через
атрибуты маршрута позволяет централизованно управлять направлением
текста в зависимости от языка.
При интеграции библиотек и UI-компонентов, которые не поддерживают RTL из коробки, необходимо использовать CSS-трюки:
transform: scaleX(-1) — зеркалирование элементов.flex-direction: row-reverse.Пример для компонента с кнопками:
m("div", { style: { display: "flex", flexDirection: currentDir === "rtl" ? "row-reverse" : "row" } },
m("button", "Кнопка 1"),
m("button", "Кнопка 2")
)
Иногда внутри RTL-текста встречаются вставки LTR (например, URL,
номера, латиница). Для корректного отображения используют вложенные
элементы с dir="ltr":
m("p", { dir: "rtl" },
"موقعنا على الإنترنت: ",
m("span", { dir: "ltr" }, "https://example.com")
)
Принцип: комбинированные направления требуют явного
указания атрибута dir для всех вложенных блоков с
противоположным направлением.
dir и CSS — основные инструменты для управления
RTL.Mithril обеспечивает минималистичную, но гибкую основу для построения RTL-интерфейсов, где направление текста и расположение элементов управляются через виртуальный DOM и реактивное обновление атрибутов.