evoBabel
evoBabel - мультиязычные сайты для modx evolution (версия 0.2)
author webber (web-ber12@yandex.ru)
Состав:
-
- Папка assets/snippets/evoBabel, содержащая основной сниппет snippet.evoBabel.php (создание языковых версий) и необходимый для работы файл evoBabel.class.php
-
- Сниппет evoBabel - для вывода результатов работы в ТВ ресурса
-
- Сниппет lang - для выдачи перевода на нужном языке на сайте
-
- Плагин evoBabel - для правильной отдачи 404 страницы, синхронизации значений выбранных ТВ, чтения в сессию актуальных переводов
-
- Плагин evoBabelPlaceholders - для парсинга языковых плейсхолдеров парсинга языковых плейсхолдеров вида [%Главная страница%] вместо сниппета [[lang? &a=
Главная страница
]]
-
- Модуль lexicon для evoBabel (файлы и текст модуля)
Возможности:
-
- создание неграниченного количества языковых версий сайта
при этом каждая версия хранится в своем дереве, что не ограничивает нас никак
т.е. структура сайта на разных языках может отличаться (в отличие от YAMS), нет проблем с плейсхолдерами, другими сниппетами и т.п.
-
- ресурсы разных языковых версий связаны между собой - что позволяет при навигации переключаться на нужную языковую версию ресурса
-
- Возможна синхронизация значений нужных ТВ параметров для разных версий ресурса (id нужных ТВ и id нужных шаблонов задается в настройках плагина evoBabel)
-
- Переводы в отдельном модуле Lexicon без перезагрузки и сразу для всех языков. Есть фильтрация, возможность добавления и удаления нужного языка там же
Установка:
-
- Скачиваем архив со сниппетом
-
- Помещаем в папку assets/snippets/ соответствующие папки
-
- Создаем шаблон "Язык" и запоминаем его id - мы будем присваивать его каждой корневой папке языка
-
- Создаем в корне сайта один (или несколько) папок для языков - например RU,EN и т.п. с шаблоном "Язык". Алиасы данных папок будут алиасами языков (ru,en,fr и т.п.)
-
- Пусть у нас основным языком будет RU, создаем в папке RU главную страницу (задаем ее стартовой для сайта в конфигурации MODx)
-
- ID данной страницы вносим в поле description нашего ресурса RU, поле longtitle ресурса RU пишем слово "Русский" - там будет содержаться название нашего языка для вывода в переключалке языков
-
7 Создаем новый TV-параметр (назовем его relation, заголовок - Языковые версии ресурса) с типом ввода Custom Input и в поле возможные значения вписываем код @EVAL return $modx->runSnippet("evoBabel");
id именно этого TV и нужно вносить в настройки модуля как id TV, используемого для хранения связей.
-
8 Прикрепляем данный TV ко всем шаблонам кроме Языка.
-
- Создаем новый сниппет evoBabel и помещаем в него код из соответствующего файла в папке install
-
- Создаем новый сниппет lang и копируем код из соответствующего файла в папке install
-
- Создаем новый плагин evoBabel, копируем код из соответствующего файла в папке install
-
- В конфигурации плагина вставляем
&synch_TV=ids TV для синхронизации;text; &synch_template=ids шаблонов для синхронизации;text; &config=Файл шаблонов;text;assets/snippets/evoBabel/config/config.php
и указываем нужные id TV и шаблонов для синхронизации через запятую,
-
- Системные события для плагина OnPageNotFound, OnDocFormSave, OnBeforeEmptyTrash, OnEmptyTrash, OnWebPageInit,OnDocDuplicate
-
- Создаем новый модуль evoBabelLexicon и помещаем в него код из соответствующего файла в папке install
-
- На вкладке конфигурация в режиме редактирования модуля отмечаем галочку "Включить общие параметры"
-
- В строку "конфигурация модуля" на той же вкладке "конфигурация вставляем
&lang_template_id=id шаблона языка;text; &rel_tv_id=id TV языковых связей;text; &currlang=язык по умолчанию;text;ru &show_panel=Показывать панель;text;1 &publish=Публиковать (0 -нет, 1 - да);text;0
и вносим в появившееся поле нужный нам id шаблона языка, id TV для хранения языковых связей и название языка по умолчанию согласно алиасу корневой папки
-
- Сохраняем модуль и опять открываем на редактирование. После чего переходим на вкладку "Зависимости" и открываем ссылку "Управление зависимостями". На открывшейся странице добавляем к зависимостям плагин evoBabel и сниппеты evoBabel, lang.
-
- Опять возвращаемся к редактированию созданных сниппетов evoBabel, lang и плагина evoBabel. На вкладке "Свойства" в выпадающием списке "Импортировать общие параметры модуля" выбираем название нашего модуля.
-
- Создаем плагин evoBabelPlaceholder (событие OnParseDocument) и помещаем в него код из папки install для соответствующего плагина
(данный плагин используется для установки языковых плейсхолдеров [%плейсхолдер%] вместо запуска сниппета lang и необязателен
Настройка админки завершена. Теперь в каждом ресурсе мы должны получить в панели "Языковые версии" название текущего языка и список доступных языков.
Если перевод уже создан - то будет кнопка "перейти", если еще нет - кнопка "создать".
Использование на сайте - тут вообще все просто
-
- В нужном месте шаблона размещаем плейсхолдеры [+activeLang+] - для отдельного вывода текущего языка и [+switchLang+] - для вывода переключалки языков
-
- Сами переводы в шаблонах и чанках получаем с помощью сниппета lang
//использование в шаблонах чанках и т.п.
// [[lang? &a=
Главная страница
]] - выведет перевод слов Главная страница для текущего языка из его чанка
// использование в сниппетах
// [[DocLister? &parents=[[lang? &a=
Папка каталог]]
...другие параметры ..]]
// если вы установили плагин evoBabelPlaceholder то вместо вызова [[lang? &a=Главная страница
]] можно использовать языковой плейсхолдер [%Главная страница%]
Пример работы
Пример работы
Предупреждения и ограничения:
-
- Модуль поставляется "как есть", перед установкой изучите инструкцию и сделайте дамп базы сайта
-
- При запуске модуля создается новая таблица "префикс_lexicon" в базе данных.
-
- Устарело. Актуально для версии 0.1 Поле description ресурса используется для хранения языковых связей. Если вы используете данное поле для других целей - предварительно необходимо вынести информацию из него в другое поле либо в TV параметр
Важно:
если у вас на странице на главной вкладке только один tv-параметр и это параметр смены языков, то из-за особенностей modx единственный
tv с типом ввода custom input не показывается.
Для решения данной проблемы просто создайте еще один произвольный tv например с именем okLang и типом текст, а затем скройте его
через managermanager просто прописав правило mm_hideFields('okLang', '', ''); в чанке правил mm_rules