DLE Multi-Language

Полное руководство по использованию модуля мультиязычности для DLE: теги шаблонов, условные блоки, SEO (hreflang и sitemap), AI-перевод, переключатель языков и справочник настроек.

1. Теги шаблонов

Все теги модуля доступны в шаблонах .tpl и подставляются DLE при формировании страницы.

1.1 Информация о языке

ТегОписаниеПример вывода
{lang-code}ISO-код активного языка (строчные буквы)en, es, ru
{lang-folder}Папка языкового пакета DLEEnglish, Spanish
{home-url}URL главной страницы с языковым префиксомhttps://site.com/en/
{lang-name}Название языка (папки пакета)English

1.2 Строки языкового файла

Для вывода строки из .lng языкового пакета DLE используйте:

{lang=ключ}

Например, если в website.lng есть строка read_more = "Читать далее", то в испанском пакете она может быть "Leer más". В шаблоне:

<a href="{full-link}">{lang=read_more}</a>

Модуль автоматически подставит строку из пакета активного языка. Переводить ключи можно в разделе Редактор переводов.

1.3 Теги SEO в новостях

При просмотре новости на языке en DLE автоматически подставит переведённые значения в стандартные теги:

Стандартный тег DLEЧто выводится
{title}Заголовок новости на активном языке
{short-story}Короткое описание на активном языке
{full-story}Полный текст на активном языке
{metatitle}Meta Title на активном языке
{metatags}Ключевые слова на активном языке
{descr}Meta Description на активном языке
{tags}Теги новости на активном языке
{category}Название категории на активном языке
Примечание
Стандартные теги DLE не нужно менять — модуль перехватывает вывод и автоматически заменяет значения на переведённые.

2. Условные теги [if_lang] / [not_lang]

Позволяют показывать или скрывать блоки контента в зависимости от активного языка.

2.1 [if_lang=...] — Только для указанных языков

[if_lang=en]This block is shown only in English[/if_lang]

[if_lang=en,es,fr]Блок виден только на английском, испанском и французском[/if_lang]

2.2 [not_lang=...] — Скрыть для указанных языков

[not_lang=ru]This block is hidden for Russian language[/not_lang]

[not_lang=en,es]Этот блок не виден для English и Spanish[/not_lang]

2.3 Пример использования в шаблоне

[if_lang=en]<a href="/en/support">Support</a>[/if_lang]
[if_lang=ru]<a href="/support">Поддержка</a>[/if_lang]
[if_lang=es]<a href="/es/soporte">Soporte</a>[/if_lang]

[if_lang=en,de]
<div class="partner-block">...</div>
[/if_lang]
Совет
Условные теги работают в любых .tpl-шаблонах DLE: main, short story, full story, category, static pages и т.д.

3. Структура URL

Модуль использует префикс языка в URL для маршрутизации. Язык по умолчанию работает без префикса.

3.0 Таблица URL

СтраницаЯзык по умолчанию (ru)Английская версияИспанская версия
Главнаяhttps://site.com/https://site.com/en/https://site.com/es/
Новостьhttps://site.com/news/123.htmlhttps://site.com/en/news/123.htmlhttps://site.com/es/news/123.html
Категорияhttps://site.com/category/https://site.com/en/category/https://site.com/es/category/
Поискhttps://site.com/?do=search&story=wordhttps://site.com/en/?do=search...https://site.com/es/?do=search...
Sitemaphttps://site.com/sitemap.xmlhttps://site.com/sitemap-en.xmlhttps://site.com/sitemap-es.xml
Примечание
Ссылки внутри шаблонов DLE (теги {full-link}, {category-url} и т.д.) автоматически получают языковой префикс. Переписывать шаблоны не нужно.

3.1 Поведение при отсутствии перевода

Настраивается в разделе Настройки модуля → Поведение непереведённого контента:

РежимПоведение
fallbackПоказывает оригинал (язык по умолчанию) вместо перевода
strictСкрывает материал из списка, но показывает оригинал при прямом переходе
404Возвращает 404 при отсутствии перевода
redirect_mainПеренаправляет на главную страницу языка

4. SEO: hreflang и sitemap

4.1 Hreflang теги

Модуль автоматически добавляет теги <link rel="alternate" hreflang="..."> в <head> каждой страницы. Пример для новости с переводами на EN, ES и RU (по умолчанию):

<link rel="alternate" hreflang="x-default" href="https://site.com/news/123.html" />
<link rel="alternate" hreflang="ru" href="https://site.com/news/123.html" />
<link rel="alternate" hreflang="en" href="https://site.com/en/news/123.html" />
<link rel="alternate" hreflang="es" href="https://site.com/es/news/123.html" />
Совет
Если включена опция «Скрывать непереведённые материалы», hreflang будет добавлен только для языков, где перевод существует.

4.2 XML Sitemap

Для каждого языка генерируется отдельный sitemap через стандартные средства DLE (Инструменты → Google Sitemap). Для каждого языка запускайте генерацию отдельно, выбрав нужный язык. Файлы сохраняются в каталоге uploads/ с суффиксом языка (например, uploads/sitemap_en.xml, uploads/google_news_es.xml и т.д.).

Чтобы sitemap-файлы были доступны по коротким адресам в корне сайта (/sitemap_en.xml вместо /uploads/sitemap_en.xml) — необходимо настроить правила переадресации на уровне веб-сервера.

4.3 Правила .htaccess (Apache)

Откройте файл .htaccess в корне сайта и добавьте следующие правила после строки RewriteEngine On:

# DLE Multi-Language Sitemap Rules
RewriteRule ^sitemap_([a-z0-9]+)\.xml$ uploads/sitemap_$1.xml [L]
RewriteRule ^google_news_([a-z0-9]+)\.xml$ uploads/google_news_$1.xml [L]
RewriteRule ^static_pages_([a-z0-9]+)\.xml$ uploads/static_pages_$1.xml [L]
RewriteRule ^category_pages_([a-z0-9]+)\.xml$ uploads/category_pages_$1.xml [L]
RewriteRule ^tags_pages_([a-z0-9]+)\.xml$ uploads/tags_pages_$1.xml [L]
RewriteRule ^news_pages(\d*?)_([a-z0-9]+)\.xml$ uploads/news_pages$1_$2.xml [L]

После добавления правил следующие URL будут автоматически проксироваться в каталог uploads/:

Публичный URLФактический путь
/sitemap_en.xmluploads/sitemap_en.xml
/google_news_es.xmluploads/google_news_es.xml
/static_pages_ru.xmluploads/static_pages_ru.xml
/category_pages_de.xmluploads/category_pages_de.xml
/tags_pages_fr.xmluploads/tags_pages_fr.xml
/news_pages_en.xmluploads/news_pages_en.xml
/news_pages2_en.xmluploads/news_pages2_en.xml

4.4 Правила Nginx

Если ваш сервер работает на Nginx, добавьте в конфигурационный блок server {} вашего сайта следующие правила:

# DLE Multi-Language Sitemap Rules
rewrite ^/sitemap_([a-z0-9]+)\.xml$ /uploads/sitemap_$1.xml last;
rewrite ^/google_news_([a-z0-9]+)\.xml$ /uploads/google_news_$1.xml last;
rewrite ^/static_pages_([a-z0-9]+)\.xml$ /uploads/static_pages_$1.xml last;
rewrite ^/category_pages_([a-z0-9]+)\.xml$ /uploads/category_pages_$1.xml last;
rewrite ^/tags_pages_([a-z0-9]+)\.xml$ /uploads/tags_pages_$1.xml last;
rewrite ^/news_pages(\d+)_([a-z0-9]+)\.xml$ /uploads/news_pages$1_$2.xml last;

Как подключить правила в Nginx

Правила размещаются внутри секции server { ... } для вашего домена, обычно в файле /etc/nginx/sites-available/ваш-сайт.conf или /etc/nginx/conf.d/ваш-сайт.conf. Расположение — до основного location / { try_files ... }, иначе fallback на index.php перехватит запрос раньше.

Пример полной секции:

server {
    listen 80;
    server_name site.com www.site.com;
    root /var/www/site.com;
    index index.php index.html;

    # DLE Multi-Language Sitemap Rules
    rewrite ^/sitemap_([a-z0-9]+)\.xml$ /uploads/sitemap_$1.xml last;
    rewrite ^/google_news_([a-z0-9]+)\.xml$ /uploads/google_news_$1.xml last;
    rewrite ^/static_pages_([a-z0-9]+)\.xml$ /uploads/static_pages_$1.xml last;
    rewrite ^/category_pages_([a-z0-9]+)\.xml$ /uploads/category_pages_$1.xml last;
    rewrite ^/tags_pages_([a-z0-9]+)\.xml$ /uploads/tags_pages_$1.xml last;
    rewrite ^/news_pages(\d+)_([a-z0-9]+)\.xml$ /uploads/news_pages$1_$2.xml last;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Разбор директив

Отличия от Apache-правил

Apache (.htaccess)Nginx
RewriteRulerewrite
Относительный путь: uploads/...Абсолютный путь от корня сайта: /uploads/...
Флаг [L] — остановить обработкуФлаг last — перезапуск поиска location
Шаблон не обязан начинаться с /Шаблон начинается с /, так как совпадает с URI
\d*? — ноль и более цифр (ленивый)\d+ — одна и более цифра (не допускает пустой номер)

Применение конфигурации

После добавления правил проверьте синтаксис и перезагрузите Nginx без простоя:

sudo nginx -t
sudo systemctl reload nginx
Внимание
Если сервер проксирует запросы через Nginx → Apache (например, на ISPmanager или хостинге с фронтендом Nginx), правила размещайте там, где Nginx сам обрабатывает статику. Если Nginx лишь передаёт всё в Apache — используйте вариант .htaccess.
Проверка
Откройте в браузере https://site.com/sitemap_en.xml — должен отдаваться содержимое файла uploads/sitemap_en.xml без видимой переадресации (URL в адресной строке остаётся коротким).

5. Перевод новостей

5.1 Поля для перевода в редакторе

При добавлении или редактировании новости в нижней части страницы появляются вкладки для каждого языка. Каждая вкладка содержит:

5.2 AI-перевод новости (одна кнопка)

На каждой языковой вкладке есть кнопка «Перевести с оригинала (AI)». При нажатии:

  1. Читаются все заполненные поля оригинала (язык по умолчанию)
  2. Длинный HTML-контент разбивается на куски по ~3500 символов
  3. Каждый кусок отправляется в AI (OpenAI / Claude / Gemini / DeepSeek)
  4. AI сохраняет HTML-теги и переводит только видимый текст
  5. Прогресс отображается в реальном времени
  6. Готовые переводы заполняются в поля вкладки
Важно
AI-перевод перезаписывает уже введённые переводы. Всегда сохраняйте новость после перевода.

5.3 Критерии «переведённой» новости

Настраивается в Настройки модуля → Критерии перевода. По умолчанию достаточно заполнить только title. Можно добавить short_story и/или full_story.

6. Категории и статические страницы

6.1 Категории

В форме категорий (Управление → Категории) под каждым стандартным полем появляются переводы для каждого языка:

ПолеКолонка в БД
Название категорииname_{iso}
Полное описаниеfulldescr_{iso}
Meta Titlemetatitle_{iso}
Meta Descriptiondescr_{iso}
Ключевые словаkeywords_{iso}

Кнопка-магия рядом с полем «Название» переводит все поля категории через AI за один клик.

6.2 Параметры сайта

В разделе Параметры → Системные настройки доступны переводы для:

ПолеКолонка в конфиге
Заголовок главной страницыhome_title_{iso}
Краткое название сайтаshort_title_{iso}
Описание сайтаdescription_{iso}
Ключевые слова сайтаkeywords_{iso}
Текст оффлайн-страницыoffline_reason_{iso}

7. XFields (дополнительные поля)

Модуль поддерживает перевод XFields через механизм «групп»: для каждого языка создаётся отдельная группа XFields с переведёнными полями.

7.1 Настройка маппинга

В Настройки модуля → Маппинг XFields укажите соответствие языка → группы XFields:

en => group_en
es => group_es
de => group_de

Группы создаются стандартными средствами DLE в разделе XFields. Поля группы должны иметь те же ключи, что и у оригинала.

7.2 AI-перевод XFields

На языковой вкладке редактора новости XField-поля обнаруживаются автоматически. При нажатии кнопки AI-перевода модуль находит поля с суффиксом _{iso}, находит оригинал и переводит значение.

Примечание
XFields с типом «список» или «checkbox» лучше не переводить автоматически — значения могут быть ключами, а не текстом.

8. AI-перевод

8.1 Поддерживаемые провайдеры

ПровайдерМоделиПримечание
OpenAIGPT-4o, GPT-4o mini и другиеЛучшее качество для HTML-контента (рекомендован)
Anthropic ClaudeClaude Opus, Claude SonnetОтличное качество, точное сохранение HTML
Google GeminiGemini Pro, Flash, Flash-LiteБыстрый, экономичный
DeepSeekDeepSeek V3, V4Низкая стоимость, хорошее качество

8.2 Настройка AI

  1. Перейдите в Multi-Language → Настройки AI
  2. Выберите провайдера и модель
  3. Введите API-ключ
  4. Сохраните настройки

8.3 Как работает перевод HTML-контента

9. {lang-select} — Переключатель языка

Вставьте тег в любой .tpl-шаблон. Модуль автоматически подключит CSS и JS — ничего дополнительно в <head> прописывать не нужно.

9.1 Быстрый старт

{lang-select}
{lang-select type="dropdown"}
{lang-select type="select"}
{lang-select type="auto"}

CSS и JS файлы (ml_lang_select.css и ml_lang_select.js) подключаются автоматически через </head> и </body> при первом использовании тега на странице.

9.2 Параметр type

Определяет внешний вид и поведение переключателя.

ЗначениеПо умолчаниюОписание
linksдаГоризонтальный ряд ссылок-кнопок. Простой и универсальный. Подходит для хедера и футера.
dropdownКнопка с выпадающим списком. Активный язык виден в кнопке. Компактно, популярный вариант.
selectНативный <select>. Оформлен кастомным CSS. Лёгкий, доступный, работает без JS.
autoУмный адаптивный режим: на широких экранах — dropdown, на мобильных — select (или links). Управляется через mobile_breakpoint и mobile_type.
{lang-select type="links"}
{lang-select type="dropdown"}
{lang-select type="select"}
{lang-select type="auto"}

9.3 Параметр show

Что показывать внутри каждого элемента. Можно комбинировать через запятую — порядок важен.

ЗначениеПо умолчаниюОписание
flagдаФлаг страны в виде SVG-изображения
nameдаНазвание языка на английском: English, Spanish, Russian
nativeНазвание языка на родном языке: English, Español, Русский, Հայերեն
codeISO-код заглавными: EN, ES, RU
{lang-select show="flag,name"}
{lang-select show="flag"}
{lang-select show="flag,native"}
{lang-select show="flag,code"}
{lang-select show="code"}
{lang-select show="flag,native,code"}
Совет
Для мобильного меню рекомендуется show="flag,code" — компактно и понятно. Для select — show="native".

9.4 Параметр size

Задаёт физический размер элементов переключателя.

ЗначениеПо умолчаниюВысотаШрифтФлаг
sm28px12px16×11px
mdда36px14px20×14px
lg44px16px24×17px
{lang-select type="dropdown" size="sm"}
{lang-select type="dropdown" size="md"}
{lang-select type="dropdown" size="lg"}

9.5 Параметр theme

Цветовая тема переключателя. Все цвета реализованы через CSS-переменные и легко переопределяются.

ЗначениеПо умолчаниюОписание
lightдаБелый фон, тёмный текст, светлая рамка. Подходит для светлых шаблонов.
darkТёмный фон (#1f2937), светлый текст. Для тёмных шаблонов или хедера с тёмным фоном.
transparentПрозрачный фон, нет рамки, текст наследуется от родителя. Максимальная интеграция в дизайн.
{lang-select type="dropdown" theme="light"}
{lang-select type="dropdown" theme="dark"}
{lang-select type="dropdown" theme="transparent"}
Совет
При theme="transparent" цвет текста наследуется от родительского элемента. Удобно использовать в навигации, где уже задан нужный цвет.

9.6 Параметры class и id

Добавляют CSS-класс и HTML-атрибут id к корневому элементу переключателя. Используются для точечной стилизации или для JS-привязки.

{lang-select type="dropdown" class="my-lang-switcher"}
{lang-select type="dropdown" class="header-lang pull-right"}
{lang-select type="dropdown" id="top-lang-switcher"}
{lang-select type="auto" class="site-lang" id="main-lang"}

После этого можно стилизовать через CSS:

.my-lang-switcher {
    margin-left: auto;
}
.my-lang-switcher .ml-dd-trigger {
    border-radius: 20px;
}

9.7 Параметры flag_size и flag_path

ПараметрПо умолчаниюОписание
flag_size20Ширина флага в пикселях. Высота считается автоматически: flag_size × 0.7. Для flag_size="20" высота = 14px.
flag_pathpublic/adminpanel/images/lang/Путь к папке с SVG-флагами относительно корня сайта. Файлы должны называться {iso}.svg.
{lang-select show="flag" flag_size="32"}
{lang-select flag_path="templates/Default/images/flags/"}
{lang-select flag_path="https://cdn.example.com/flags/"}
Примечание
Если SVG-файл флага не найден, изображение скрывается автоматически (через onerror). Флаги по умолчанию расположены в public/adminpanel/images/lang/{iso}.svg.

9.8 Параметры current и active_label

ПараметрПо умолчаниюЗначенияОписание
currentshowshow / hideПоказывать ли текущий язык в списке. При hide активный язык исчезает из списка — остаются только другие языки.
active_labelshowshow / hideТолько для type="dropdown". Показывать ли активный язык в кнопке-триггере. При hide кнопка не появляется — список висит постоянно.
{lang-select type="links" current="hide"}
{lang-select type="dropdown" active_label="hide"}
{lang-select type="dropdown" current="hide"}

9.9 Параметры position и animation

Только для type="dropdown" и type="auto".

ПараметрПо умолчаниюЗначенияОписание
positionbottom-leftbottom-left, bottom-right, top-left, top-rightОткуда разворачивается выпадающий список относительно кнопки. bottom-left — список раскрывается вниз от левого края кнопки.
animationfadefade, slide, noneАнимация появления списка. fade — плавное появление. slide — появление со смещением. none — без анимации.
{lang-select type="dropdown" position="bottom-right"}
{lang-select type="dropdown" position="top-left"}
{lang-select type="dropdown" animation="none"}
{lang-select type="dropdown" position="top-right" animation="slide"}

9.10 Параметр open_on

Только для type="dropdown". Определяет, по какому событию открывается список.

ЗначениеПо умолчаниюОписание
clickдаСписок открывается по клику на кнопку. Закрывается при клике на кнопку повторно или при клике вне меню.
hoverСписок открывается при наведении мыши. Закрывается через 150 мс после ухода мыши с элемента. Удобно для десктопных навигаций.
{lang-select type="dropdown" open_on="click"}
{lang-select type="dropdown" open_on="hover"}

9.11 Параметр keyboard

Только для type="dropdown". Включает полную клавиатурную навигацию (доступность / accessibility).

ЗначениеПо умолчаниюОписание
yesдаВключена. Поддерживает: навигация, Escape закрыть, Enter/Space открыть/выбрать, Home/End первый/последний, Tab закрыть.
noОтключена. Только мышь/тач.
{lang-select type="dropdown" keyboard="yes"}
{lang-select type="dropdown" keyboard="no"}

9.12 Параметры mobile_breakpoint и mobile_type

Только для type="auto". Управляют адаптивным поведением.

ПараметрПо умолчаниюОписание
mobile_breakpoint768Ширина экрана в пикселях, ниже которой активируется мобильный вид. При window.innerWidth <= N показывается мобильная версия.
mobile_typeselectТип переключателя для мобильных устройств. select — нативный список, links — горизонтальные ссылки.
{lang-select type="auto"}
{lang-select type="auto" mobile_breakpoint="1024"}
{lang-select type="auto" mobile_type="links"}
{lang-select type="auto" mobile_breakpoint="640" mobile_type="select" show="flag,code"}
Совет
При type="auto" в HTML рендерятся обе версии (desktop + mobile), а JS переключает видимость по ширине экрана. При отключённом JS всегда виден desktop-вид.

9.13 Параметры names, order и exclude

ПараметрПо умолчаниюОписание
namesПереопределить отображаемые названия языков. Формат: iso:Название,iso2:Название2. Переопределяет стандартные названия из базы данных модуля.
orderЗадать порядок языков. Формат: en,ru,hy,es. Языки, не указанные в списке, добавляются в конец в исходном порядке.
excludeИсключить языки из переключателя. Формат: ar,zh. Полезно, если какой-то язык в системе есть, но в переключателе нужно его спрятать.
{lang-select names="ru:Русский,en:English,hy:Հայ"}
{lang-select order="en,ru,hy"}
{lang-select exclude="ar"}
{lang-select type="dropdown" order="en,hy,ru" names="hy:ՀՅ,ru:РУ,en:EN" exclude="es"}

9.14 Параметр placeholder

Только для type="select". Добавляет первый <option> с указанным текстом и пустым значением. Полезно для декоративных select.

{lang-select type="select" placeholder="Выберите язык"}
{lang-select type="select" placeholder="🌐 Language"}
Примечание
При выборе placeholder ничего не происходит, так как его value="". Реальный выбор языка происходит только при выборе языка с URL.

9.15 Полный пример со всеми параметрами

{lang-select
    type="dropdown"
    show="flag,name"
    size="md"
    theme="light"
    class="header-lang-switcher"
    id="main-lang"
    flag_size="20"
    flag_path="public/adminpanel/images/lang/"
    current="show"
    active_label="show"
    position="bottom-right"
    animation="fade"
    open_on="click"
    keyboard="yes"
    mobile_breakpoint="768"
    mobile_type="select"
    names="en:English,ru:Русский,hy:Հայ"
    order="hy,ru,en"
    exclude=""
    placeholder=""
}
Совет
Параметры можно записывать в одну строку или в несколько — результат одинаковый. Многострочная запись удобнее для чтения.

9.16 CSS кастомизация

Переключатель построен на CSS Custom Properties (переменных). Переопределив переменные на нужном классе, можно полностью изменить внешний вид без редактирования исходного CSS.

Структура классов

КлассОписание
.ml-switcherБазовый класс, общий для всех типов
.ml-switcher-linksТип links
.ml-switcher-dropdownТип dropdown
.ml-switcher-selectТип select
.ml-switcher-autoТип auto (обёртка)
.ml-dd-triggerКнопка-триггер dropdown
.ml-dd-menuВыпадающий список dropdown
.ml-itemОтдельный элемент (ссылка)
.ml-item.activeАктивный (текущий) язык
.ml-flagИзображение флага
.ml-lang-nameНазвание языка (English)
.ml-lang-nativeНативное название (Русский)
.ml-lang-codeISO-код (EN)
.ml-select-elНативный <select>
.ml-caretСтрелка в кнопке dropdown
.ml-sz-sm / .ml-sz-md / .ml-sz-lgРазмерные классы
.ml-theme-light / .ml-theme-dark / .ml-theme-transparentТемы
.ml-dd-bl / .ml-dd-br / .ml-dd-tl / .ml-dd-trПозиция dropdown (bottom-left и т.д.)
.ml-anim-fade / .ml-anim-slide / .ml-anim-noneАнимации
.openДобавляется к dropdown при открытии
.ml-auto-desktopDesktop-вид в type=auto
.ml-auto-mobileМобильный вид в type=auto

CSS-переменные

Все переменные задаются на .ml-switcher или .ml-switcher-auto и наследуются дочерними элементами:

ПеременнаяПо умолчаниюОписание
--ml-bg#ffffffФон кнопки/списка
--ml-bg-hover#f3f4f6Фон при наведении
--ml-bg-active#e8edffФон активного элемента
--ml-text#374151Цвет текста
--ml-text-hover#111827Цвет текста при наведении
--ml-text-active#3b5bdbЦвет текста активного языка
--ml-border#e5e7ebЦвет рамки
--ml-shadow0 4px 16px rgba(0,0,0,.12)Тень выпадающего меню
--ml-radius8pxСкругление внешних углов
--ml-radius-sm6pxСкругление элементов внутри
--ml-transition0.18s easeСкорость переходов
--ml-fontinheritШрифт
--ml-font-size14pxРазмер шрифта
--ml-h36pxВысота элементов
--ml-px12pxГоризонтальный padding
--ml-gap6pxЗазор между флагом и текстом
--ml-flag-w20pxШирина флага (из size)
--ml-flag-h14pxВысота флага (из size)

Пример 1 — Полностью кастомная тема через переменные

{lang-select type="dropdown" class="my-switcher"}
.my-switcher {
    --ml-bg: #2d3748;
    --ml-bg-hover: #4a5568;
    --ml-bg-active: #3182ce;
    --ml-text: #e2e8f0;
    --ml-text-hover: #ffffff;
    --ml-text-active: #ffffff;
    --ml-border: #4a5568;
    --ml-shadow: 0 8px 24px rgba(0,0,0,.4);
    --ml-radius: 12px;
    --ml-transition: 0.25s cubic-bezier(.4,0,.2,1);
}

Пример 2 — Пилюли (pill-style links)

{lang-select type="links" class="pill-lang"}
.pill-lang {
    --ml-radius: 50px;
    --ml-radius-sm: 50px;
    gap: 4px;
    border: none;
    background: transparent;
    padding: 0;
}
.pill-lang .ml-item {
    border: 2px solid var(--ml-border);
    border-radius: 50px;
    transition: all 0.2s;
}
.pill-lang .ml-item.active {
    background: #3b82f6;
    border-color: #3b82f6;
    color: #fff;
}

Пример 3 — Флаги-кружки

{lang-select type="links" show="flag" class="circle-flags" flag_size="28"}
.circle-flags .ml-flag {
    border-radius: 50% !important;
    width: 28px !important;
    height: 28px !important;
    object-fit: cover;
    border: 2px solid transparent;
    transition: border-color 0.2s;
}
.circle-flags .ml-item.active .ml-flag {
    border-color: #3b82f6;
    box-shadow: 0 0 0 2px rgba(59,130,246,.3);
}
.circle-flags {
    border: none;
    background: transparent;
    gap: 6px;
}

Пример 4 — Dropdown в стиле сайта

{lang-select type="dropdown" class="nav-lang" position="bottom-right" animation="slide"}
.nav-lang .ml-dd-trigger {
    background: transparent;
    border: none;
    color: inherit;
    font-weight: 600;
    letter-spacing: .05em;
    text-transform: uppercase;
}
.nav-lang .ml-dd-trigger:hover {
    background: rgba(255,255,255,.1);
}
.nav-lang .ml-dd-menu {
    min-width: 180px;
    border-radius: 12px;
    overflow: hidden;
    border: none;
}
.nav-lang .ml-dd-menu .ml-item {
    padding: 10px 16px;
    border-radius: 0;
}
.nav-lang .ml-dd-menu .ml-item:first-child { border-radius: 12px 12px 0 0; }
.nav-lang .ml-dd-menu .ml-item:last-child { border-radius: 0 0 12px 12px; }

10. {lang-select-loop} — Кастомный шаблон

Когда стандартных типов недостаточно, используйте тег-цикл: он итерирует по всем языкам и заполняет ваш HTML-шаблон данными каждого языка. Полный контроль над разметкой.

{lang-select-loop}
    <a href="{ls-url}" class="lang-btn {ls-active}" hreflang="{ls-code}">
        {ls-flag} {ls-name-native}
    </a>
{/lang-select-loop}

10.1 Параметры loop-тега

Тег поддерживает те же параметры, что и {lang-select}, применимые к итерации: show, flag_size, flag_path, current, names, order, exclude.

{lang-select-loop current="hide"}...{/lang-select-loop}

{lang-select-loop order="en,hy,ru" exclude="es"}...{/lang-select-loop}

{lang-select-loop flag_size="28"}...{/lang-select-loop}

10.2 Теги внутри loop

Внутри {lang-select-loop}...{/lang-select-loop} доступны следующие теги:

ТегПример значенияОписание
{ls-url}/en/news/URL текущей страницы для этого языка. Для языка по умолчанию — без префикса, для остальных — с префиксом /iso/
{ls-code}enISO-код строчными буквами
{ls-CODE}ENISO-код заглавными буквами
{ls-name}EnglishНазвание языка на английском
{ls-name-en}EnglishВсегда название на английском (даже если show=native)
{ls-name-native}ՀայերենНазвание на родном языке
{ls-flag}<img class="ml-flag" ...>Готовый HTML тег <img> с флагом. Атрибут onerror скрывает флаг, если файл не найден
{ls-flag-url}https://site.com/public/.../en.svgТолько URL флага (без тега img)
{ls-active}activeСтрока "active" для активного языка, пустая строка для остальных
{ls-selected}selectedАтрибут "selected" для <option> активного языка
{ls-current}1Строка "1" если это текущий язык, "0" если нет
{ls-index}0Порядковый номер (с нуля): 0, 1, 2...
{ls-count}3Общее количество языков в цикле
{ls-odd}oddСтрока "odd" для нечётных элементов (1, 3, 5...), пустая строка для чётных
{ls-even}evenСтрока "even" для чётных элементов (0, 2, 4...), пустая строка для нечётных

10.3 Условные блоки внутри loop

Внутри цикла можно использовать условные блоки — контент внутри появляется только при выполнении условия:

ТегОписание
[if_ls_active]...[/if_ls_active]Показать только для активного (текущего) языка
[if_ls_inactive]...[/if_ls_inactive]Показать для всех языков, кроме активного
[if_ls_first]...[/if_ls_first]Показать только для первого языка в списке
[if_ls_last]...[/if_ls_last]Показать только для последнего языка
[if_ls_odd]...[/if_ls_odd]Показать для нечётных элементов (index 1, 3, 5...)
[if_ls_even]...[/if_ls_even]Показать для чётных элементов (index 0, 2, 4...)

10.4 Примеры loop

Пример 1 — Кастомный нативный <select>

<select onchange="location.href=this.value" class="my-lang-select">
    {lang-select-loop show="native"}
        <option value="{ls-url}" {ls-selected} lang="{ls-code}">
            {ls-name-native}
        </option>
    {/lang-select-loop}
</select>

Пример 2 — Иконки-флаги с tooltip

<nav class="flags-nav">
    {lang-select-loop}
        <a href="{ls-url}"
           class="flag-link [if_ls_active]is-active[/if_ls_active]"
           title="{ls-name-native}"
           hreflang="{ls-code}"
           aria-label="{ls-name}">
            {ls-flag}
            [if_ls_active]
                <span class="current-dot"></span>
            [/if_ls_active]
        </a>
    {/lang-select-loop}
</nav>

Пример 3 — Список с разделителем между элементами

<div class="inline-langs">
    {lang-select-loop}
        [if_ls_active]
            <strong>{ls-CODE}</strong>
        [/if_ls_active]
        [if_ls_inactive]
            <a href="{ls-url}">{ls-CODE}</a>
        [/if_ls_inactive]
        [if_ls_inactive][if_ls_last][/if_ls_last]<span class="sep"> | </span>[/if_ls_inactive]
    {/lang-select-loop}
</div>

Пример 4 — Bootstrap dropdown

<div class="dropdown">
    <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">
        {lang-select-loop current="show"}
            [if_ls_active]{ls-flag} {ls-CODE} <span class="caret"></span>[/if_ls_active]
        {/lang-select-loop}
    </button>
    <ul class="dropdown-menu">
        {lang-select-loop current="hide"}
            <li><a href="{ls-url}">{ls-flag} {ls-name-native}</a></li>
        {/lang-select-loop}
    </ul>
</div>

Пример 5 — Список с данными языков

<ul class="lang-list">
    {lang-select-loop order="en,ru,hy"}
        <li class="{ls-odd}[if_ls_active] active-lang[/if_ls_active]">
            <span class="num">{ls-index}</span>
            {ls-flag}
            <a href="{ls-url}" hreflang="{ls-code}">
                <b>{ls-name-native}</b>
                <small>({ls-name-en})</small>
            </a>
            [if_ls_active]<i class="fa fa-check"></i>[/if_ls_active]
        </li>
    {/lang-select-loop}
</ul>

11. Справочник настроек

Файл конфигурации: engine/data/multilang.php. Управляется через интерфейс, ручное редактирование не рекомендуется.

КлючТипОписание
enable0 / 1Включить/выключить модуль
default_langstringISO-код языка по умолчанию, например ru
default_lang_folderstringПапка языкового пакета DLE для языка по умолчанию
langsarrayСписок языков: [iso => folder]
hide_untranslated_list0 / 1Скрывать непереведённые материалы из списков
untranslated_full_actionstringfallback / strict / 404 / redirect_main
translation_criteriaarrayПоля, обязательные для перевода: ['title'], ['title','short_story']
xf_groupsarrayМаппинг XFields-групп: [iso => group_key]
ai.providerstringopenai / claude / gemini / deepseek
ai.openai_api_keystringAPI-ключ OpenAI
ai.openai_modelstringНазвание модели OpenAI
ai.claude_api_keystringAPI-ключ Anthropic
ai.gemini_api_keystringAPI-ключ Google Gemini
ai.deepseek_api_keystringAPI-ключ DeepSeek

12. Решение проблем

Новость не показывается на языке X

AI-перевод не работает / ошибка

MySQL ошибка «Unknown column p.title_X in WHERE»

{lang-select} не отображается / не стилизован

<link rel="stylesheet" href="{home-url}public/adminpanel/multilang/css/ml_lang_select.css">

{lang-select-loop} цикл выводит неверные URL

Dropdown не открывается

.ml-switcher-dropdown.open .ml-dd-menu { display: block !important; }

Теги {lang-code}, {home-url} не заменяются в шаблоне

Языковой переключатель показывает неправильный язык как активный

DLE Multi-Language  ·  engine/modules/multilang/admin/help.php  ·  Все изменения в настройках применяются немедленно без перезапуска сервера.