Доброй ночи, жители этого мира!

Уже второй день занимаюсь не тривиальной задачей - созданием информационного сайта, посвященного продвижению определенного продукта (в основном на ближнее зарубежье). Несмотря на довольно небольшой объем контента, делать статический сайт мне абсолютно не хотелось. При выборе движка я руководствовался в первую очередь удобностью и относительной легкостью, во вторую поддержкой нескольких языков. Таким образом Joomla вылетела в трубу автоматом (я ее ненавижу, хотя там не сложно сделать мультиязычный сайт, но движок довольно тормознутый и админка ИМХО не удобная).

Вообщем, без особого обдумывания был выбран DLE. Это не новостной движок, как его позиционируют разработчики, а сравнительно простой конструктор, на основе которого можно сделать все что угодно включая торрент трекеры и онлайн кинотеатры. Выбрал скорее потому что мне не займет много времени что-нибудь в нем допилить, т.к. на основе этого движка я сделал не один десяток сайтов, включая 2 проекта с капитально перепиленным исходным кодом.
Взята была версия 10.3 (не буду объяснять, из каких соображений). Был приятно удивлен новым функционалом (последний раз работал, если я не ошибаюсь, с 9.4).

Если вы будете искать, как сделать многоязычный сайт на DLE, скорее всего вы сразу найдете следующее.

1. Довольно неплохой мануал, растиражированный многими сайтами, с вариациями, рерайтом и форками.
Основная идея - создание под каждый язык отдельной копии шаблона, с привязкой к каждому шаблону отдельного языкового файла в админке, а смена языков осуществляется стандартным комбобоксом для смены шаблонов.
Также требуется создание дополнительных полей заголовка, shot_story_en и long_story_en (пример для английского языка). Один из наиболее полных на офсайте.

2. Платный модуль ценой $7 (ссылку потерял), который добавляет много чего в админку, но полный функционал которого до конца я так и не дочитал.

Альтернативный вариант
Способ номер 1 мне не нравится по нескольким причинам.
1. Если надо сделать более чем 2-3 языка - дополнительные поля будут напрягать
2. Я уже имел дело с мультиязычностью на базе шаблонизатора (Smarty, разные шаблоны) и надоело для правки одной ссылки редактировать сразу десяток файлов. Шаблон ИМХО должен быть один.

Итак, делается вот что.

1. Устанавливается DLE, очищаются стандартные посты и категории, созданные по умолчанию. Включается ЧПУ.

2. Создаются категории Английская версия, Русская версия, Китайская версия или еще какая :) и альтернативными именами указываются либо English / Russian / ... либо en ru и т.д. Таким образом, доступ к ним будет по адресу /en/, /ru/ и так далее.

3. В /engine/init.php находим строку
@include (ENGINE_DIR . '/data/config.php');
Там читается конфигурация, в том числе заполняется язык.
После этого добавляется такой код:
PHP код:
$cat0=$_SERVER["REQUEST_URI"];
$cat0=explode("/",$cat0,3);
$cat0=$cat0[1];
switch (
$cat0) {
case 
"en":
    
$config['langs']="English";
    break;
case 
"ru":
    
$config['langs']="Russian";
    break;

Таким образом, нужный язык будет выбираться в зависимости от выбранной категории (другими словами раздела).
Берется это все из URL, но только в случае ЧПУ. Без него я не рассматриваю.

4. В каждую категорию добавляются дочерние категории, т. е. по сути это основные категории сайта, со своими мета заголовком и описанием. Проблема тут только одна - альтернативное имя, которое будет использоваться в URL, должно быть уникальным. Так построен движок DLE. Конечно, можно легко это исправить (в модуле админки - убрать проверку уникальности при добавлении + в движке подправить определение текущей категории, брать не только последний слеш, а и предыдущий для parent_id).
Потому мы берем внутреннее имя на выбранном языке но в транслите.

5. Для всех категорий при создании можно указать альтернативный шаблон short_story и full_story, эти файлы можно размножить и перевести.

6. Добавляем по одной публикации в каждый раздел. Вы ничем не ограничены и не обязаны делать перевод всех материалов на все языки. Для каждой языковой версии вполне может быть разный набор публикаций.

Смотрим, что остается на данный момент? Правильно. Весь шаблон помимо short_story и full_story.
Делаем с ним следующее.

Сейчас мы добавим в DLE поддержку нескольких тегов.
а) Текст который будет отображаться только в русской версии.
[lang=Russian]превед медвед[/lang]
б) Подгрузка текста из языкового файла DLE, который лежит в /languages/:
{langstr="ip_info"}
Открываем /engine/classes/templates.class.php, находим блок
PHP код:
if( strpos$this->template"{include file=" ) !== false ) {
            
$this->include_mode 'tpl';            
            
$this->template preg_replace_callback"#\\{include file=['\"](.+?)['\"]\\}#i", array( &$this'load_file'), $this->template );
        } 
(искать следует по ключевому слову {include, ибо в новых версиях могут что-то поменять)
После него вставляем следующее:

PHP код:
if (strpos $this->template"[lang=" ) !== false) {
            
$this->template preg_replace_callback "#\\[(lang)=(.+?)\\](.*?)\\[/lang\\]#is", array( &$this'check_lang'), $this->template );
        }
        
        if( 
strpos$this->template"{langstr=" ) !== false ) {
            
$this->template preg_replace_callback"#\\{langstr=['\"](.+?)['\"]\\}#i", array( &$this'lang_include'), $this->template );
        } 
Теперь нам надо объявить функции check_lang и lang_include.
Находим строчку
PHP код:
function check_device$matches=array() ) 
и ПЕРЕД ней вставляем
PHP код:
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]];
    } 
Эти функции и будут обрабатывать наши теги.
Все. Теперь все слова из шаблона бросаем в языковой файл /language/[ЯЗЫК]/website.lng (найдете, куда, это домашнее задание), а в шаблоне заменяем все слова на их кодовые имена, например, {langstr="ip_info"}

Вроде бы все. Понятное дело, что вместо подгрузки статического шаблона, в него вставляется куча переменных из массива, и это теоретически замедляет работу сайта, но ИМХО не слишком, и это намного удобнее чем редактировать десяток шаблонов.

Об особенностях работы с такими наворотами напишу через некоторое время. Возможно, найду и исправлю какие-то недочеты.
Также скоро распишу как сделать то что ИМХО создатели DLE давно должны были реализовать - автоматическая генерация главного меню сайта, с выпадающими менюшками и неограниченным уровнем вложенности. Ибо добавлять пункты в админке + потом в шаблон это немного прошлый век.

Если у кого есть что добавить, поделиться опытом или предложить улучшение или оптимизацию - велкам.
Тут много букаф конец, а кто дочитал - молодец. Лайки ставить там -----\/