Quote from: vbatushev at Jan 17, 2007, 06:18 AM
Мультиязычный сайт без создания папок для разных языков
Встала тут передо мной задача, господа, сделать двуязычный сайт – с русским и английским языком. При первом приближении к проблеме предлагаемые решения мне не понравились. Ну, право, что это за решение – сделать отдельные папки для разноязычных документов? Соответственно и шаблоны по другом и ваще – скачи туда-сюда. Негодица.
Однако! Набрел я на обсуждение этой проблемы вот здесь http://modxcms.com/forums/index.php/topic,1957.45.html Особенно заинтерсовался сообщением и сниппетом Djamoer’а (пост №57). И вот на его основе сделал себе решение.
Значит, так, нужно нам:
1. Сделать плагин (все права на него – Djamoer’а):
<?php
//
// [Plugin] LanguageVar
//
if(isset($_GET['lang']) && trim($_GET['lang']) != '') $_SESSION['lang'] = strtolower($_GET['lang']);
?>
Поставить ему системное событие на OnWebPagePrerender.
2. Создать сниппет:
<?php
//
// [Snippet] LangVar
//
// Usage: [!LangVar? &var=`content`&type=`snp||var`!]
//
$default_lang = 'ru';
if(!isset($type) || trim($type) == '') $type = 'var';
$type = strtolower($type);
if ($type == 'var') {
if(!isset($var) || trim($var) == '') $var = 'content';
}
$lang = '';
if(isset($lang) && trim($lang) != '') $lang = '_'.$lang;
else if(isset($_GET['lang']) && trim($_GET['lang']) != '') $lang = '_'.strtolower($_GET['lang']);
else if(isset($_SESSION['lang']) && trim($_SESSION['lang']) != '') $lang = '_'.strtolower($_SESSION['lang']);
else if(isset($_COOKIE['lang']) && trim($_COOKIE['lang']) != '') $lang = '_'.strtolower($_COOKIE['lang']);
if ($type == 'var') {
if($lang == '_'.$default_lang || !isset($modx->documentObject[$var.$lang]) || trim($modx->documentObject[$var.$lang][1]) == '') $lang = '';
if(isset($edit) && $edit = true) return '[*#'.$var.$lang.'*]';
else return '[*'.$var.$lang.'*]';
} else {
if ($lang == '') $lang = '_'.$default_lang;
return '{{'.$var.$lang.'}}';
}
?>
Параметров всего два. Первый название сниппета (без фигурных скобок) или переменной документа (content там или еще какой pagetitle). Второй – тип, эээ, ну не знаю, чего это тип, но значений только два – snp (сниппет) и var (переменная документа).
3. Создаем еще один сниппет:
<?php
// SetLangCookie snippet for ModX
// set cookie with language ID
// 08-28-2005
// [email protected]
if(isset($_GET['lang']) && trim($_GET['lang']) != '') {
$lang=strtolower($_GET['lang']);
setcookie("lang",$lang,time()+604800);
}
?>
Его надо будет вызывать в шаблоне тупо [!SetLangCookie!]. Не кэшируем!
4. Создаем TV. TV мы создаем какие хотим, только главное, чтобы они назывались соответственно. Например, "дублер" поля content должен зваться content_en (или content_fr, или что там вы будете передавать в качестве переключателя в поле &lang, но об этом ниже).
5. Создаем сниппеты. Тут все сниппеты называем по схеме: НазваниеСниппета_ИдентификаторЯзыка. Например, TopMenu_ru, TopMenu_en и т. д.
6. Делаем себе красивые иконки с флагами (или тырим их, где плохо/хорошо положено). Ссылочки на них оформлеяем как "index.php?id=[*id*]&lang=en" или там "index.php?id=[*id*]&lang=ru"
Ну, собственно, вроде и все 
Да. С переключением заголовков в меню, конечно, пурхалово. Потому как не понятно мне, как заставить WayFinder брать в качестве заголовков значения TV. Вышел из положения тем, что в русском он показывает pagetitle, в английском – menutitle. Это, конечно, не супер, но все же.
Как получилось – http://www.ibrainsoft.com
По поводу 5-ого пункта - сниппеты создаются на основе приведенного сниппета LangVar?
а в TV будет уже загоняться текст аглицкий или наш?
P.S.простите за тупление. Просто для проекта заказчика взял MODx. Все очевидное сделал, а под ночь мой мозг крючить начало)))
L.O.V.E is just a four letter word
Ошибка.
в предпоследней строке вместо return ’{{’.$var.$lang.’}}’; должно быть return ’[[’.$var.$lang.’]]’;