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

Mem: 3.75 mb, MySQL: 0.0018 s, 2 req., PHP: 0.0370 s, all: 0.0388 s, cache.