evoBabel

    evoBabel - мультиязычные сайты для modx evolution (версия 0.2)

    author webber (web-ber12@yandex.ru)

    Состав:


      1. Папка assets/snippets/evoBabel, содержащая основной сниппет snippet.evoBabel.php (создание языковых версий) и необходимый для работы файл evoBabel.class.php
      1. Сниппет evoBabel - для вывода результатов работы в ТВ ресурса
      1. Сниппет lang - для выдачи перевода на нужном языке на сайте
      1. Плагин evoBabel - для правильной отдачи 404 страницы, синхронизации значений выбранных ТВ, чтения в сессию актуальных переводов
      1. Плагин evoBabelPlaceholders - для парсинга языковых плейсхолдеров парсинга языковых плейсхолдеров вида [%Главная страница%] вместо сниппета [[lang? &a=Главная страница]]
      1. Модуль lexicon для evoBabel (файлы и текст модуля)

    Возможности:


      1. создание неграниченного количества языковых версий сайта при этом каждая версия хранится в своем дереве, что не ограничивает нас никак т.е. структура сайта на разных языках может отличаться (в отличие от YAMS), нет проблем с плейсхолдерами, другими сниппетами и т.п.
      1. ресурсы разных языковых версий связаны между собой - что позволяет при навигации переключаться на нужную языковую версию ресурса
      1. Возможна синхронизация значений нужных ТВ параметров для разных версий ресурса (id нужных ТВ и id нужных шаблонов задается в настройках плагина evoBabel)
      1. Переводы в отдельном модуле Lexicon без перезагрузки и сразу для всех языков. Есть фильтрация, возможность добавления и удаления нужного языка там же

    Установка:


      1. Скачиваем архив со сниппетом
      1. Помещаем в папку assets/snippets/ соответствующие папки
      1. Создаем шаблон "Язык" и запоминаем его id - мы будем присваивать его каждой корневой папке языка
      1. Создаем в корне сайта один (или несколько) папок для языков - например RU,EN и т.п. с шаблоном "Язык". Алиасы данных папок будут алиасами языков (ru,en,fr и т.п.)
      1. Пусть у нас основным языком будет RU, создаем в папке RU главную страницу (задаем ее стартовой для сайта в конфигурации MODx)
      1. ID данной страницы вносим в поле description нашего ресурса RU, поле longtitle ресурса RU пишем слово "Русский" - там будет содержаться название нашего языка для вывода в переключалке языков
    • 7 Создаем новый TV-параметр (назовем его relation, заголовок - Языковые версии ресурса) с типом ввода Custom Input и в поле возможные значения вписываем код @EVAL return $modx->runSnippet("evoBabel"); id именно этого TV и нужно вносить в настройки модуля как id TV, используемого для хранения связей.

    • 8 Прикрепляем данный TV ко всем шаблонам кроме Языка.

      1. Создаем новый сниппет evoBabel и помещаем в него код из соответствующего файла в папке install
      1. Создаем новый сниппет lang и копируем код из соответствующего файла в папке install
      1. Создаем новый плагин evoBabel, копируем код из соответствующего файла в папке install
      1. В конфигурации плагина вставляем
        &synch_TV=ids TV для синхронизации;text; &synch_template=ids шаблонов для синхронизации;text; &config=Файл шаблонов;text;assets/snippets/evoBabel/config/config.php

        и указываем нужные id TV и шаблонов для синхронизации через запятую,

      1. Системные события для плагина OnPageNotFound, OnDocFormSave, OnBeforeEmptyTrash, OnEmptyTrash, OnWebPageInit,OnDocDuplicate
      1. Создаем новый модуль evoBabelLexicon и помещаем в него код из соответствующего файла в папке install
      1. На вкладке конфигурация в режиме редактирования модуля отмечаем галочку "Включить общие параметры"
      1. В строку "конфигурация модуля" на той же вкладке "конфигурация вставляем
        &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 для хранения языковых связей и название языка по умолчанию согласно алиасу корневой папки

      1. Сохраняем модуль и опять открываем на редактирование. После чего переходим на вкладку "Зависимости" и открываем ссылку "Управление зависимостями". На открывшейся странице добавляем к зависимостям плагин evoBabel и сниппеты evoBabel, lang.
      1. Опять возвращаемся к редактированию созданных сниппетов evoBabel, lang и плагина evoBabel. На вкладке "Свойства" в выпадающием списке "Импортировать общие параметры модуля" выбираем название нашего модуля.
      1. Создаем плагин evoBabelPlaceholder (событие OnParseDocument) и помещаем в него код из папки install для соответствующего плагина (данный плагин используется для установки языковых плейсхолдеров [%плейсхолдер%] вместо запуска сниппета lang и необязателен

    Настройка админки завершена. Теперь в каждом ресурсе мы должны получить в панели "Языковые версии" название текущего языка и список доступных языков. Если перевод уже создан - то будет кнопка "перейти", если еще нет - кнопка "создать".

    Использование на сайте - тут вообще все просто


      1. В нужном месте шаблона размещаем плейсхолдеры [+activeLang+] - для отдельного вывода текущего языка и [+switchLang+] - для вывода переключалки языков
      1. Сами переводы в шаблонах и чанках получаем с помощью сниппета lang //использование в шаблонах чанках и т.п. // [[lang? &a=Главная страница]] - выведет перевод слов Главная страница для текущего языка из его чанка // использование в сниппетах // [[DocLister? &parents=[[lang? &a=Папка каталог]] ...другие параметры ..]] // если вы установили плагин evoBabelPlaceholder то вместо вызова [[lang? &a=Главная страница]] можно использовать языковой плейсхолдер [%Главная страница%]

    Пример работы


    Пример работы

    Предупреждения и ограничения:


      1. Модуль поставляется "как есть", перед установкой изучите инструкцию и сделайте дамп базы сайта
      1. При запуске модуля создается новая таблица "префикс_lexicon" в базе данных.
      1. Устарело. Актуально для версии 0.1 Поле description ресурса используется для хранения языковых связей. Если вы используете данное поле для других целей - предварительно необходимо вынести информацию из него в другое поле либо в TV параметр

    Важно:


    если у вас на странице на главной вкладке только один tv-параметр и это параметр смены языков, то из-за особенностей modx единственный tv с типом ввода custom input не показывается. Для решения данной проблемы просто создайте еще один произвольный tv например с именем okLang и типом текст, а затем скройте его через managermanager просто прописав правило mm_hideFields('okLang', '', ''); в чанке правил mm_rules