Гуру | Доброй ночи, жители этого мира! Уже второй день занимаюсь не тривиальной задачей - созданием информационного сайта, посвященного продвижению определенного продукта (в основном на ближнее зарубежье). Несмотря на довольно небольшой объем контента, делать статический сайт мне абсолютно не хотелось. При выборе движка я руководствовался в первую очередь удобностью и относительной легкостью, во вторую поддержкой нескольких языков. Таким образом 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/:Открываем /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 давно должны были реализовать - автоматическая генерация главного меню сайта, с выпадающими менюшками и неограниченным уровнем вложенности. Ибо добавлять пункты в админке + потом в шаблон это немного прошлый век. Если у кого есть что добавить, поделиться опытом или предложить улучшение или оптимизацию - велкам. Тут много букаф конец, а кто дочитал - молодец. Лайки ставить там -----\/ |
|