Я реализовывал мультиязычность через дулбирование TV и чанков (для глобальных редкоизменяемых данных).
Язык определяется через анализ имени 3 уровня.
Имя 3 уровня является окончанием к TV/чанку, соответствующего языка.
Например:
домены
site.com
eng.site.com
переменные TV
content
content_eng
Чанки
contact
contact_eng
TV-шки беруться так
$lang=$modx->runSnippet(’get_lang’);
$var=$modx->documentObject[$tvar.$lang];
if(is_array($var)) return $var[1];
else return $var;
Чанки так
$lang=$modx->runSnippet(’get_lang’);
return $modx->getChunk($chunk.$lang);
снипет get_lang сделан просто
switch ($_SERVER[’SERVER_NAME’]){
case "eng.site.ru":
case "www.eng.site.ru":
$lang="_eng";
break;
default:
$lang=null;
break;
}
return $lang;
Добавлять языки просто. Нужно добавить дубликат переменной/чанка с нужным окончание и отредактировать снипет get_lang.
Модерировать очень удобно. Пишешь оригинальный текст в одном поле. В других полях сразу перевод вставляешь.
Да, при такой схеме кеширование должно быть отключено. Производительность падает, но это решается кешированием SQL запросов. Это вообще необходимая вещь, потому что при росте страниц и структуры модх начинает загибаться. Кеширование я брал на этом форуме, и мне это понадобилось ещё до того как делал мультиязычность, так как сайт довольно большой.
Сам сайт с реализованной мультиязычностью таким способом
http://kedrvetv.ru/ . Потыкайтесь. Если производительность устроит, то можете смело применять аналогичную схему.