Сделайте на контекстах.
Для бэкэнда используйте Babel (для двух языков два контекста с соответствующими настройками — cultureKey, error_page, site_start) и вот такой плагин для переключения на фронтэнде (вешается на событие OnHandleRequest):
<?php
if ($modx->event->name != "OnHandleRequest" || $modx->context->key == 'mgr') {return;}
if (isset($_GET['lang']) && $_GET['lang'] != $_SESSION['lang']) {
if ($_GET['lang'] == 'en') {
$_SESSION['lang'] = 'en';
}
else {
$_SESSION['lang'] = 'ru';
}
}
if ($_SESSION['lang'] == 'en') {
$modx->switchContext('en');
}
Сниппет, выводящий ссылки переключения языков:
<?php
$link = $modx->makeUrl($modx->resource->id, '', '', 'full');
if ($modx->getOption('cultureKey') == 'ru') {
return '<span class="lang-active">Рус</span> <a href="'.$link.'?lang=en">Eng</a>';
}
if ($modx->getOption('cultureKey') == 'en') {
return '<a href="'.$link.'?lang=ru">Рус</a> <span class="lang-active">Eng</span>';
}
И еще делаю чанк «lang»:
[[++cultureKey:is=`ru`:then=`[[+ru]]`]][[++cultureKey:is=`en`:then=`[[+en]]`]]
C его помощью можно не плодить шаблоны и чанки, а разные языковые строки в них выводить так:
[[$lang? &ru=`Русский контент` &en=`English content`]]
Плюс — все предельно просто, минус — нужно следить, чтобы псевдонимы «парных» страниц в разных яз. версиях были одинаковыми.