RTL поддержка

Polymer предоставляет гибкие механизмы для работы с текстом и интерфейсами, ориентированными на правосторонние языки (Right-to-Left, RTL), такими как арабский или иврит. RTL-поддержка затрагивает как стили, так и структуру компонентов, обеспечивая корректное отображение текста и элементов пользовательского интерфейса.


Определение направления текста

Для корректного отображения контента используется атрибут dir, который может принимать значения:

  • ltr — Left-to-Right, стандартное направление текста.
  • rtl — Right-to-Left, направление текста справа налево.
  • auto — автоматически определяется по языку содержимого.

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

<html lang="ar" dir="rtl">
  <body>
    <my-element></my-element>
  </body>
</html>

В Polymer компонентах атрибут dir можно наследовать от родительского элемента или задавать локально внутри тега:

<dom-module id="my-element">
  <template>
    <div dir="rtl">هذا نص باللغة العربية</div>
  </template>
  <script>
    class MyElement extends Polymer.Element {
      static get is() { return 'my-element'; }
    }
    customElements.define(MyElement.is, MyElement);
  </script>
</dom-module>

Встроенная поддержка RTL в компонентах

Polymer включает модули для автоматического управления стилями в зависимости от направления текста. Основные подходы:

  1. CSS-переменные: использование кастомных свойств для управления выравниванием, отступами и позиционированием.
:host([dir="rtl"]) {
  --padding-start: 16px;
  --padding-end: 0;
}

:host([dir="ltr"]) {
  --padding-start: 0;
  --padding-end: 16px;
}

.content {
  padding-left: var(--padding-start);
  padding-right: var(--padding-end);
}
  1. @apply и миксины: для переопределения стандартных стилей компонентов Polymer в RTL. Например, кнопки, карточки и панели навигации могут изменять выравнивание текста и иконок без изменения HTML-разметки.
:host([dir="rtl"]) {
  @apply --my-element-rtl-style;
}
  1. polymer-rtl пакет: раньше существовал модуль polymer-rtl, который автоматически зеркалировал компоненты и применял соответствующие стили. В современных версиях рекомендуется управлять RTL через CSS-переменные и атрибут dir.

Работа с Shadow DOM и локальными стилями

Polymer активно использует Shadow DOM, что изолирует стили компонента от глобальных. Для корректной RTL-поддержки:

  • Атрибут dir должен быть доступен внутри Shadow DOM.
  • Внутри шаблонов компонентов можно использовать селекторы :host([dir="rtl"]) для определения направления.

Пример:

<dom-module id="rtl-card">
  <template>
    <style>
      :host([dir="rtl"]) .title {
        text-align: right;
        margin-left: 0;
        margin-right: 20px;
      }
      :host([dir="ltr"]) .title {
        text-align: left;
        margin-left: 20px;
        margin-right: 0;
      }
    </style>
    <div class="title">عنوان</div>
  </template>
  <script>
    class RtlCard extends Polymer.Element {
      static get is() { return 'rtl-card'; }
    }
    customElements.define(RtlCard.is, RtlCard);
  </script>
</dom-module>

Динамическое переключение направления

В Polymer можно менять направление интерфейса в реальном времени, обновляя атрибут dir на корневом элементе или конкретном компоненте:

document.documentElement.setAttribute('dir', 'rtl');
// или для компонента
document.querySelector('my-element').setAttribute('dir', 'rtl');

При изменении атрибута, все CSS-переменные и правила, зависящие от направления, автоматически применяются.


Взаимодействие с внешними библиотеками

Если проект использует сторонние UI-библиотеки, важно учитывать:

  • RTL-совместимость компонентов.
  • Использование кастомных переменных для выравнивания элементов сторонних библиотек.
  • Переназначение стандартных CSS-свойств через :host([dir="rtl"]) для поддержания консистентного интерфейса.

Практические рекомендации

  • Всегда задавать dir на корневом уровне документа или контейнера.
  • Использовать CSS-переменные и миксины для глобальных и локальных изменений стилей.
  • Проверять компоненты с динамическим содержимым на корректное зеркальное отображение.
  • Shadow DOM не блокирует RTL, но требует использования :host([dir="rtl"]) вместо глобальных селекторов.

Поддержка RTL в Polymer обеспечивает полноценную адаптацию интерфейсов для правосторонних языков, сохраняя гибкость и модульность компонентов, что критично для международных приложений.