2010
YAMS — Yet Another Multilingual Solution — служит для создания многоязычных сайтов на базе Modx CMS.
Поиск по сайтам связанным с настройкой и работой с Modx уcпехом не увенчался. Вообще, никакой поиск успехом не увенчался, когда потребовалась информация на русском языке.
Пришлось разбираться с английской документацией и методом проб и ошибок делать проект.
Полностью переводить документацию не буду, расскажу в общих чертах, как его запустить и заставить работать.
Устанавливался YAMS на версию Modx Evolution 1.0.3, которая уже в дистрибутиве имеет предустановленный ManagerManager последней версии, без него YAMS просто не получится использовать.
Установка:
Надо скачать архив последней версии. Там что-то непонятное с версиями. Последняя версия почему-то не лежит на странице для скачки, а в списке Previous Releases, потому прямая ссылка на версию 1.1.7-alpha RC7, она пока последняя.
Распаковать архив и залить в папку assets/modules/yams, выставить права на папку yams 775.
Подключение модуля, плагина и сниппета:
Код модуля:
require_once ( $modx->config['base_path'] . 'assets/modules/yams/yams.module.inc.php' );
— Создать в администрационной части в разделе «Модули» новый модуль YAMS.
Описание: Yet Another Multilingual Solution Module
— Создать в администрационной части в разделе «Плагины» новый плагин YAMS.
Описание: Yet Another Multilingual Solution Plugin
Код плагина:
require ( $modx->config['base_path'] . 'assets/modules/yams/yams.plugin.inc.php');
В системных событиях плагина поставить галочки на:
OnLoadWebDocument
OnParseDocument
OnWebPageInit
OnWebPagePrerender
OnLoadWebPageCache
OnPageNotFound
OnBeforeDocFormSave
— Создать в администрационной части в разделе «Сниппеты» новый сниппет YAMS.
Описание: Yet Another Multilingual Solution Snippet
Код сниппета:
<?php
require ( $modx->config['base_path'] . 'assets/modules/yams/yams.snippet.inc.php' );
?>
После перезагрузить страницу, чтобы модуль заработал.
Настройка ManagerManager:
Независимо от того, что используется, в файле с правилами или чанке с правилами в конце надо прописать:
require ( $modx->config['base_path'] . 'assets/modules/yams/yams.mm_rules.inc.php' );
Собственно, YAMS готов к работе.
В «Инструментах» > «Конфигурации» включить Дружественные URL, разрешить вложенные URL, также использовать в связке с предыдущим параметром повторяющиеся псевдонимы, тогда путь до документа в адресной строке будет выглядеть:
site.com/en/catalogue/home-video
site.com/ru/catalogue/home-video
Настройка:
Во вкладке «Модули» > «YAMS» лежат все настройки.
Настройка языков:

Собственно, исчерпывающая страница, на которой показаны языки и как их добавлять. Теги, названия для отображения в самом же языке, в других языка, выбор письма справа налево или наоборот, теги (нужны для вызовов сниппета YAMS, обозначение, группы), системное название языка, имя сервера система подставляет автоматически. Set Default — поставить язык по умолчанию, чтобы с него открывался сайт.
Дальше идёт настройка сервера, после того, как созданы все необходимые языки, YAMS создаёт правила, которые надо вписать в .htaccess, чтобы правильно работали пути и редиректы.
Это находится на следующей вкладке:

Всё содержимое из этой вкладки просто скопировать в .htaccess
Другие настройки:

Эта вкладка содержит множество настроек будущего сайта. Такие, как типы редиректов, находится ли сайт в поддиректории или в корневой папке, разбивать ли языки при редактировании документов на табы, либо пускать списком на одной странице. По умолчанию сейчас стоит разбивка на табы, это и удобней, редиректы выставлены тоже по умолчанию нормально.
Последняя вкладка: Multilingual Templates
Нужна для того, чтобы YAMS перекраивал панель редактирования под многоязычный сайт.
YAMS заменяет стандартные поля Pagetitle, Longtitle, Content итд TV-параметрами с окончанием _ru, _en итд, то бишь, чтобы Pagetitle страницы был привязан именно к языку и полное название TV-параметра тогда выглядит pagetitle_ru.
Как только создаётся новый шаблон, во вкладке Multilingual Templates надо ему присвоить статус многоязычного.
Также можно создавать новые TV-параметры с нужным окончанием, они автоматически будут переноситься в соответствующий таб языков.
Не рекомендуется, даже больше, нельзя убирать поле Internal Name, оно нужно для отображения названия документа в дереве слева.
Создание шаблона:
Стандартный шаблон без дополнительных вызовов других сниппетов. YAMS автоматически определяет такие поля, как [*pagetitle*], [*longtitle*], [*content*]. То есть, достаточно вставить их в шаблон, сделать во вкладке Multilingual Templates шаблон многоязычным и при редактировании документа заполнить эти поля для каждого языка, при переключении языков на сайте, они будут меняться.
Механизм переключения языков:
Создаётся, например, чанк Languages, ставится в нужном месте в шаблоне и в чанк записывается:
[[YAMS? &get=`repeat` &repeattpl=`lang_tpl` ¤ttpl=`current_lang_tpl`]]
&repeattpl=`lang_tpl` — шаблон кнопки языка
¤ttpl=`current_lang_tpl` — шаблон кнопки текущего языка
Шаблон lang_tpl выглядит, например, вот так:
<a href="(yams_docr)">(yams_name)</a>
(yams_docr) — ссылка, сгенерированная до текущей страницы в этом или остальных языках
(yams_name) — имя языка, вписанное в табе Модули > Yams > Language Settings
¤ttpl — шаблон выбранного языка. Тоже самое, только можно добавить class="selected", ну, или что по вкусу, чтобы язык был виден, как текущий.
Точно таким же образом можно подставить и флажки вместо текста.
Wayfinder и YAMS
Вызов Wayfinder— a:
[[Wayfinder? &startId=`0` &useWeblinkUrl=`true` &rowTpl=`menu_tpl`]]
YAMS-у требуется, чтобы параметр &useWeblinkUrl был включён.
Чтобы Wayfinder правильно генерировал ссылки, всё в шаблоне работает через сниппет YAMS.
Шаблон одной кнопки — menu_tpl:
<li[+wf.id+][+wf.classes+]><a href="(yams_doc:[+wf.docid+])" [+wf.attributes+]>[[YAMS? &get=`content` &docid=`[+wf.docid+]` &from=`pagetitle`]]</a>[+wf.wrapper+]</li>
Ditto и YAMS:
С Ditto обстоит намного сложней, но без него никуда.
К вызову Ditto нужно подключать расширение:
&extenders=`@FILE assets/modules/yams/yams.extender.inc.php`
Если вызов некэшируемый [!Ditto!], то в параметрах вызова надо указывать id и язык:
&id=`(yams_id)` &language=`(yams_mname)`
А в шаблоне плейсхолдеры указываются тогда так:
[+(yams_id)_pagetitle+].
Если вызов кэшируемый [[Ditto]], то автор предлагает поместить в каждый язык по вызову Ditto, также в вызове прописать &id=`id` &language=`имя языка`.
И третий способ по пути наименьшего сопротивления, расширение подключать не нужно, в вызове Ditto чанк с шаблоном имеет окончание соответствующее языку:
[[Ditto? &tpl=`news_(yams_id)`]]
Существует два чанка news_ru, news_en. В зависимости от того, какой язык текущий, параметр (yams_id) подменяется обозначением языка.
А в самих чанках:
<h1>[+introtext_ru+]</h1><p>[+content_ru+]</p>
Это прямой вызов TV-параметров, заменивших встроенные поля.
Неудобен этот способ тем, что нужно создавать большое количество чанков, но работает без осечек, с некоторыми сниппетами, например, eForm-ом иначе и не получится.
Это общая информация, не вдаваясь в мелкие детали, чтобы собрать мультиязычный сайт её вполне достаточно.
Сначала пришлось набить шишек и довольно много с ним помучиться, тем более, что версии постарше не работали так, как нужно, но после нескольких осечек, уже проще разобраться, как работает YAMS и использовать его совершенно не проблематично.






Спасибо за обзор! Попробую воспроизвести )
На здороьве. :) Да, там, кстати, новая версия YAMS-а вышла: modxcms.com/extras/search.html?query=yams
Я пробую все как тут сделать, все понятно, только у меня не переключает язык, клацаешь на кнопки меняется адрес строки, с /en/minimal-base.html на ru/minimal-base.html но страница остается на английском. Меню остаеться в положении English
— English
Русский
в чем может быт ошибка.
А меню сделано Wayfinder-ом? Если да, то его тоже надо вызывать через YAMS. У меня там описано в посте, как это делается. Или текст в контенте тоже не меняется? Хотя достаточно просто вставить [*content*] и YAMS должен распознать. Судя по адресу, всё работает правильно, просто что-то недоделано.
Или просто надо сделать, чтобы кнопка «Русский» становилась выделенной? Тогда надо просто сделать шаблон для текущего пункта.
Если шаблон активной кнопки выглядит так: (yams_docr). То шаблон текущей кнопки может выглядеть вот так: —(yams_name)
в шаблоне вызов такой
{{Languages}}
[[Wayfinder? &startId=`0` &useWeblinkUrl=`true` &rowTpl=`menu_tpl`]]
чанки
current_lang_tpl, Languages, lang_tpl, menu_tpl, mm_rules
menu_tpl
(yams_name)
current_lang_tpl
(yams_name)
menu_tpl
[[YAMS? &get=`content` &docid=`[+wf.docid+]` &from=`pagetitle`]][+wf.wrapper+]
Спипет
YAMS
То ест все как вы описываете, но результата нет :(
Все делал по шагам и проверял не однократно, а что может быть не доделано, случайно нет догадок.
А может такое что не передаются данные по переключению языка хотя адрес меняется :(
А шаблон помечен, как Multilingual Templates?
Все помеченные, я единственное не настраивал Other Parameters
Нашел в чем была проблема
Всё содержимое из этой вкладки просто скопировать в .htaccess
Я добавлял а нужно было заменить :) все работает спасибо за помощь и перевод по установки.
Была мысль по поводу .htaccess-а, но сбило с толку всё-таки то, что редирект делался. :)
На здоровье, в общем, собственно, чтоб для того, чтобы могли читать и использовать писал. :)
Были проблемы с подключением YAMS из за включенной опции magic quotes в PHP.
Чтоб отключить автоматическое экранирование кавычек, в файле .htaccess добавляем строчку:
php_flag magic_quotes_gpc Off
Начиная с 6ой версии PHP эта функция будет убрана, т.к. полезность её весьма сомнительна. Если оффтоп сорри.
В хозяйстве пригодится. Спасибо. :)
Спасибо за отличную статью =) Попробуем использовать YAMS в ближайшем проекте, раньше просто делали 2 админки)
Не, две админки точно не вариант. Я делал папки языков и туда складывал, но это не очень хороший вариант, получалось, что нельзя сразу отредактировать один документ на всех языках, но две админки, это больше усложняет жизнь. :)