DLE Multi-Language
Полное руководство по использованию модуля мультиязычности для DLE: теги шаблонов, условные блоки, SEO (hreflang и sitemap), AI-перевод, переключатель языков и справочник настроек.
1. Теги шаблонов
Все теги модуля доступны в шаблонах .tpl и подставляются DLE при формировании страницы.
1.1 Информация о языке
| Тег | Описание | Пример вывода |
|---|---|---|
| {lang-code} | ISO-код активного языка (строчные буквы) | en, es, ru |
| {lang-folder} | Папка языкового пакета DLE | English, 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} | Название категории на активном языке |
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.html | https://site.com/en/news/123.html | https://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=word | https://site.com/en/?do=search... | https://site.com/es/?do=search... |
| Sitemap | https://site.com/sitemap.xml | https://site.com/sitemap-en.xml | https://site.com/sitemap-es.xml |
{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" />
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.xml | uploads/sitemap_en.xml |
/google_news_es.xml | uploads/google_news_es.xml |
/static_pages_ru.xml | uploads/static_pages_ru.xml |
/category_pages_de.xml | uploads/category_pages_de.xml |
/tags_pages_fr.xml | uploads/tags_pages_fr.xml |
/news_pages_en.xml | uploads/news_pages_en.xml |
/news_pages2_en.xml | uploads/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;
}
}
Разбор директив
rewrite— директива ядра Nginx для внутренней переадресации URI.^/sitemap_([a-z0-9]+)\.xml$— регулярное выражение с якорями^и$. Скобки( )создают захватывающую группу, результат которой доступен как$1.([a-z0-9]+)— один и более строчный символ латиницы или цифра (ISO-код языка, напримерen,es,hy).(\d+)— одна и более цифра (номер страницы sitemap новостей:2,3,4...)./uploads/sitemap_$1.xml— целевой URI с подстановкой захваченной группы.last— флаг, который завершает обработку текущего набора директивrewriteи запускает новый поиск location для переписанного URI. Файл.xmlвuploads/будет отдан статикой.
Отличия от Apache-правил
| Apache (.htaccess) | Nginx |
|---|---|
RewriteRule | rewrite |
Относительный путь: uploads/... | Абсолютный путь от корня сайта: /uploads/... |
Флаг [L] — остановить обработку | Флаг last — перезапуск поиска location |
Шаблон не обязан начинаться с / | Шаблон начинается с /, так как совпадает с URI |
\d*? — ноль и более цифр (ленивый) | \d+ — одна и более цифра (не допускает пустой номер) |
Применение конфигурации
После добавления правил проверьте синтаксис и перезагрузите Nginx без простоя:
sudo nginx -t sudo systemctl reload nginx
.htaccess.
https://site.com/sitemap_en.xml — должен отдаваться содержимое файла uploads/sitemap_en.xml без видимой переадресации (URL в адресной строке остаётся коротким).
5. Перевод новостей
5.1 Поля для перевода в редакторе
При добавлении или редактировании новости в нижней части страницы появляются вкладки для каждого языка. Каждая вкладка содержит:
- Заголовок (
title_{iso}) - Короткая новость (
short_story_{iso}) — с визуальным редактором - Полная новость (
full_story_{iso}) — с визуальным редактором - Meta Title (
metatitle_{iso}) - Meta Description (
descr_{iso}) - Ключевые слова (
keywords_{iso}) - Теги (
tags_{iso}) - XFields — если настроен маппинг xf_groups
5.2 AI-перевод новости (одна кнопка)
На каждой языковой вкладке есть кнопка «Перевести с оригинала (AI)». При нажатии:
- Читаются все заполненные поля оригинала (язык по умолчанию)
- Длинный HTML-контент разбивается на куски по ~3500 символов
- Каждый кусок отправляется в AI (OpenAI / Claude / Gemini / DeepSeek)
- AI сохраняет HTML-теги и переводит только видимый текст
- Прогресс отображается в реальном времени
- Готовые переводы заполняются в поля вкладки
5.3 Критерии «переведённой» новости
Настраивается в Настройки модуля → Критерии перевода. По умолчанию достаточно заполнить только title. Можно добавить short_story и/или full_story.
6. Категории и статические страницы
6.1 Категории
В форме категорий (Управление → Категории) под каждым стандартным полем появляются переводы для каждого языка:
| Поле | Колонка в БД |
|---|---|
| Название категории | name_{iso} |
| Полное описание | fulldescr_{iso} |
| Meta Title | metatitle_{iso} |
| Meta Description | descr_{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}, находит оригинал и переводит значение.
8. AI-перевод
8.1 Поддерживаемые провайдеры
| Провайдер | Модели | Примечание |
|---|---|---|
| OpenAI | GPT-4o, GPT-4o mini и другие | Лучшее качество для HTML-контента (рекомендован) |
| Anthropic Claude | Claude Opus, Claude Sonnet | Отличное качество, точное сохранение HTML |
| Google Gemini | Gemini Pro, Flash, Flash-Lite | Быстрый, экономичный |
| DeepSeek | DeepSeek V3, V4 | Низкая стоимость, хорошее качество |
8.2 Настройка AI
- Перейдите в Multi-Language → Настройки AI
- Выберите провайдера и модель
- Введите API-ключ
- Сохраните настройки
8.3 Как работает перевод HTML-контента
- Разбивает длинный HTML на куски по 3500 символов по тегам
</p>,</div>,<br> - Каждый кусок переводится отдельным запросом к AI
- Результаты склеиваются в исходном порядке
- AI инструктируется сохранять все 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, Русский, Հայերեն | |
code | ISO-код заглавными: 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
Задаёт физический размер элементов переключателя.
| Значение | По умолчанию | Высота | Шрифт | Флаг |
|---|---|---|---|---|
sm | 28px | 12px | 16×11px | |
md | да | 36px | 14px | 20×14px |
lg | 44px | 16px | 24×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_size | 20 | Ширина флага в пикселях. Высота считается автоматически: flag_size × 0.7. Для flag_size="20" высота = 14px. |
flag_path | public/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/"}
onerror). Флаги по умолчанию расположены в public/adminpanel/images/lang/{iso}.svg.
9.8 Параметры current и active_label
| Параметр | По умолчанию | Значения | Описание |
|---|---|---|---|
current | show | show / hide | Показывать ли текущий язык в списке. При hide активный язык исчезает из списка — остаются только другие языки. |
active_label | show | show / 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".
| Параметр | По умолчанию | Значения | Описание |
|---|---|---|---|
position | bottom-left | bottom-left, bottom-right, top-left, top-right | Откуда разворачивается выпадающий список относительно кнопки. bottom-left — список раскрывается вниз от левого края кнопки. |
animation | fade | fade, 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_breakpoint | 768 | Ширина экрана в пикселях, ниже которой активируется мобильный вид. При window.innerWidth <= N показывается мобильная версия. |
mobile_type | select | Тип переключателя для мобильных устройств. 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"}
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-code | ISO-код (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-desktop | Desktop-вид в 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-shadow | 0 4px 16px rgba(0,0,0,.12) | Тень выпадающего меню |
--ml-radius | 8px | Скругление внешних углов |
--ml-radius-sm | 6px | Скругление элементов внутри |
--ml-transition | 0.18s ease | Скорость переходов |
--ml-font | inherit | Шрифт |
--ml-font-size | 14px | Размер шрифта |
--ml-h | 36px | Высота элементов |
--ml-px | 12px | Горизонтальный padding |
--ml-gap | 6px | Зазор между флагом и текстом |
--ml-flag-w | 20px | Ширина флага (из size) |
--ml-flag-h | 14px | Высота флага (из 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} | en | ISO-код строчными буквами |
{ls-CODE} | EN | ISO-код заглавными буквами |
{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. Управляется через интерфейс, ручное редактирование не рекомендуется.
| Ключ | Тип | Описание |
|---|---|---|
enable | 0 / 1 | Включить/выключить модуль |
default_lang | string | ISO-код языка по умолчанию, например ru |
default_lang_folder | string | Папка языкового пакета DLE для языка по умолчанию |
langs | array | Список языков: [iso => folder] |
hide_untranslated_list | 0 / 1 | Скрывать непереведённые материалы из списков |
untranslated_full_action | string | fallback / strict / 404 / redirect_main |
translation_criteria | array | Поля, обязательные для перевода: ['title'], ['title','short_story'] |
xf_groups | array | Маппинг XFields-групп: [iso => group_key] |
ai.provider | string | openai / claude / gemini / deepseek |
ai.openai_api_key | string | API-ключ OpenAI |
ai.openai_model | string | Название модели OpenAI |
ai.claude_api_key | string | API-ключ Anthropic |
ai.gemini_api_key | string | API-ключ Google Gemini |
ai.deepseek_api_key | string | API-ключ DeepSeek |
12. Решение проблем
Новость не показывается на языке X
- Убедитесь, что поля критериев перевода заполнены для этого языка (Настройки → Критерии перевода)
- Проверьте режим поведения непереведённого контента в Настройки модуля
- В режиме
strictматериал не попадёт в список, пока не будет переведён
AI-перевод не работает / ошибка
- Проверьте правильность API-ключа в разделе Настройки AI
- Убедитесь, что на аккаунте провайдера есть баланс
- Если ошибка
cURL error— сервер не имеет доступа к внешним API (проверьте curl / firewall / allow_url_fopen) - Если ответ AI не является валидным JSON — попробуйте другую модель или уменьшите размер текста
MySQL ошибка «Unknown column p.title_X in WHERE»
- Язык был добавлен в систему, но MySQL-колонки ещё не созданы
- Завершите процедуру добавления языка через интерфейс модуля — система создаст нужные колонки автоматически
{lang-select} не отображается / не стилизован
- Убедитесь, что файлы
public/adminpanel/multilang/css/ml_lang_select.cssиpublic/adminpanel/multilang/js/ml_lang_select.jsзагружены на сервер - Проверьте, что шаблон
.tplсодержит стандартные теги</head>и</body>— модуль инъектирует CSS/JS через них - Если нужно подключить CSS вручную — добавьте в шаблон:
<link rel="stylesheet" href="{home-url}public/adminpanel/multilang/css/ml_lang_select.css">
{lang-select-loop} цикл выводит неверные URL
- URL строятся на основе
REQUEST_URIпосле очистки языкового префикса — это нормально - Если URL дублирует слеши (
//) — обновите модуль до последней версии
Dropdown не открывается
- Убедитесь, что файл
ml_lang_select.jsзагружен и нет ошибок в консоли браузера - Проверьте, что нет конфликта
z-index— список выпадает сz-index: 9999, но элемент выше может перекрывать его - При использовании Bootstrap: если Bootstrap переопределяет класс
.open, добавьте уточняющий CSS:
.ml-switcher-dropdown.open .ml-dd-menu { display: block !important; }
Теги {lang-code}, {home-url} не заменяются в шаблоне
- Модуль выключен — включите его в Настройки → Включить модуль
- Убедитесь, что модуль корректно установлен и все файлы загружены на сервер
Языковой переключатель показывает неправильный язык как активный
- Проверьте, что URL-префикс языка совпадает с ISO-кодом в настройках (Управление языками)
- Очистите кеш DLE и браузера
engine/modules/multilang/admin/help.php · Все изменения в настройках применяются немедленно без перезапуска сервера.