evoBabel
evoBabel - мультимовні сайти для modx evolution (версия 0.2)
author webber (web-ber12@yandex.ru)
Склад:
-
- Папка assets/snippets/evoBabel, що містить основний снsппет snippet.evoBabel.php (створення мовних версій) і необхідний для роботи файл evoBabel.class.php
-
- Сніпет evoBabel - для виведення результатів роботи в ТВ ресурсу
-
- Сніпет lang - для видачі перекладу потрібною мовою на сайті
-
- Плагін evoBabel - для правильної віддачі 404 сторінки, синхронізації значень обраних ТВ, читання в сесію актуальних перекладів
-
- Плагін evoBabel Placeholders - для парсинга мовних плейсхолдеров парсинга мовних плейсхолдеров виду [%Головна сторінка%] замість сніпета [[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 </ b> Поле description ресурсу використовується для зберігання мовних зв'язків. Якщо ви використовуєте дане поле для інших цілей - попередньо необхідно винести інформацію з нього в інше поле або в TV параметр
Важливо:
якщо у вас на сторінці на головній вкладці тільки один tv-параметр і це параметр зміни мов, то через особливості modx єдиний
tv з типом введення custom input не відображається.
Для вирішення даної проблеми просто створіть ще один довільний tv наприклад з ім'ям okLang і типом текст, а потім приховайте його
через managermanager просто прописавши правило mm_hideFields ('okLang', '', ''); в чанка правил mm_rules