Актуальный релиз „DataLife Engine 19.1 Final“ buildid 108

подробнее о релизе

Главная страница / DataLife Engine / Хаки / Мультиязычный шаблон на DLE - заготовка для плагина

Мультиязычный шаблон на DLE - заготовка для плагина

03 апреля 2025 | 20:35 | Четверг
189
3
[ Рейтинг: 5 / Голосов: 1 ]
Мультиязычный шаблон на DLE - заготовка для плагина

Переводил недавно один шаблон с французского на русский, и подумал, почему бы не реализовать в DLE мультиязычность для шаблонов? Ведь многие текста - стандартные на всех языках, их нужно только перевести на нужный язык, это такие, как например, "ваше имя", "ваш e-mail" и т.д.. Таких стандартных встречающихся слов не много по всем файлам шаблона, и сделав один раз заготовку на все нужные языки, например, стандартные, которые есть в DLE - рус, енг, укр. Далее можно будет быстро переведя только строки в одном языковом файле - перевести шаблон в нужный язык.

Реализацию данного метода нашёл на одном форуме, но на DLE 18.0 пришлось пару переменных подправить, чтобы плагин заработал. Итак.

  1. Найти в файле engine/classes/templates.class.php
    		if( stripos( $content, "{include file=" ) !== false ) {
    			$this->include_mode = 'tpl';			
    			$content = preg_replace_callback( "#\\{include file=['\"](.+?)['\"]\\}#i", array( &$this, 'load_file'), $content );
    		
    		}
    ниже вставить
    if (strpos ( $content, "[lang=" ) !== false) {
                $content = preg_replace_callback ( "#\\[(lang)=(.+?)\\](.*?)\\[/lang\\]#is", array( &$this, 'check_lang'), $content );
            }
            
            if( strpos( $content, "{langstr=" ) !== false ) {
                $content = preg_replace_callback( "#\\{langstr=['\"](.+?)['\"]\\}#i", array( &$this, 'lang_include'), $content );
            } 
    Найти
    function check_device( $matches=array() ) {
    выше добавить
    function check_lang( $matches=array() ) {
            global $config;
            if ($config['langs']==$matches[2])
                return $matches[3];
            else
                return "";
        }
        
        function lang_include( $matches=array() ) {
            global $lang;
            return $lang[$matches[1]];
        } 
  2. В файле language/Russian/website.lng после 
    $lang = array (

    добавить

    'text4byroot'        => "Для многоязычности шаблона",

В шаблонах использовать переменную {langstr="text4byroot"}, которая выведет текст "Для многоязычности шаблона" в любом TPL файле шаблона. Так же доступен тег 

[lang=Russian]пиривеД[/lang]

который в зависимости от выбранного языка будет выводить указанный текст.

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

PS понятно, что иногда быстрее вручную перевести шаблон на нужный язык, но универсальный способ всегда лучше, тем более любой сможет редактирую один плагин перевести шаблон сразу на нужный язык.

Комментарии:
ℹ️
 

  1. Oleksii Panchenko 16 марта 2026 00:05
    Oleksii Panchenko
    [group=1]	<div class="block">
    		<h4 class="title">Смена языка</h4>
    		<div class="tag_list">
    		<form method="post" id="change_skin_form">
        <select name="skin_name" id="skin_name">
            <option value="Green">Русский</option>
            <option value="GreenEN">English</option>
            <option value="Red">Красный</option>
        </select>
        <input type="hidden" name="action_skin_change" value="yes">
    </form>
    <br />
    <!-- Подключите библиотеку в <head> -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/lipis/flag-icons@7.2.3/css/flag-icons.min.css"/>
    
    <div class="skin-links">
        <a href="#" data-skin="Green">
            <span class="fi fi-ru"></span> Русский
        </a> |
        <a href="#" data-skin="GreenEN">
            <span class="fi fi-gb"></span> English
        </a> |
        <a href="#" data-skin="Red">
            <span class="fi fi-pl"></span> Polski
        </a>
    </div>
    		</div>
    	</div>
    [/group]
    
    <script>
    // Список реально существующих шаблонов
    const availableSkins = ["Green", "GreenEN", "Red"];
    
    // Идентификаторы элементов DLE-блока
    const skinSelect = document.getElementById("skin_name");
    const skinForm   = document.getElementById("change_skin_form");
    
    // 1. Блокировка выбора из селекта
    if (skinSelect && skinForm) {
        skinSelect.addEventListener("change", function (e) {
            const selected = this.value;
    
            if (!availableSkins.includes(selected)) {
                e.preventDefault();
                alert("Этот шаблон пока недоступен.");
                this.value = "Green"; // откат на основной
                return;
            }
    
            // если шаблон существует – авто-сабмит
            skinForm.submit();
        });
    }
    
    // 2. Логика для ссылок <a data-skin="...">
    document.querySelectorAll(".skin-links [data-skin]").forEach(link => {
        link.addEventListener("click", function (e) {
            e.preventDefault();
    
            const skin = this.dataset.skin;
    
            if (!availableSkins.includes(skin)) {
                alert("Этот шаблон недоступен.");
                return;
            }
    
            if (skinSelect && skinForm) {
                skinSelect.value = skin;
                skinForm.submit();
            }
        });
    });
    </script>

    Я вот так сделал плюс автоматическая загрузка нужно шаблона по языку пользователя! 

    1. byroot AdMin 16 марта 2026 07:55
      byroot

      Хотел сделать немного для другого, чтоб через LNG файлы всё было, но сейчас есть тег для вывода данных из языкового файла:

      {lang text="LANG_PARAMETER"}

      Данный тег предназначен для вывода информации из языкового файла website.tpl, который в данный момент используется, где LANG_PARAMETER это значение параметра, который необходимо вывести. Например, тег {lang text="attach_images"} выведет надпись "Прикрепить изображения" из языкового пакета, в случае использования русского языка и если используется английский язык, то “Attach Images”
      --------------------
      🎬🎬🎬 Мои услуги по DLE 👉👉👉 https://byroot.ru/uslugi.html 🎬🎬🎬
  2. byroot AdMin 21 апреля 2025 00:54
    byroot

    В DLE 18.0, а может и раньше, - подобный код уже был. В PHP правки можно не делать, использовать стандартный функционал. Останется только файл website.lng наполнить нужными тегами.

    --------------------
    🎬🎬🎬 Мои услуги по DLE 👉👉👉 https://byroot.ru/uslugi.html 🎬🎬🎬
Модули для создания киносайта и не только на базе DataLife Engine, и многое другое...
Просто блог Евгения Попова, он же - byroot © 2015-2026 | Карта сайта