Мультиязычность - что оптимальнее?

Здравствуйте, по роду занятий приходится делать в основном мультиязычные сайты. Пробовал и на revo и на evo.
Пройдя через все возможные глюки, неудобство и просто непонимание со стороны заказчика, в рамках изучения модх решил придумать что-то своё. В связи с этим хочу спросить совета у более опытных коллег для выявления оптимального варианта.
Часть рассмотренных проблем также взяты из большого количества постов на эту тему.


Речь идет о ветке ево — уж очень она симпатична мне.
Рассмотрю возможные варианты.

1) YAMS — хранение перевода в дополнительных полях (tv)

+++ все на одной странице
+ добавить новый язык просто

— сложность в настройке
— куча tv параметров
— сложная выборка всех этих tv
— проблем с Ditto и с Wayfinder
— проблема с пагинацией
— не работает со сборкой Dmi3yy

2) Дублирование дерева ресурсов
(по версии Dmi3yy — e-kao.ru/multilingual)

+ каждая версия может существенно отличаться
+ относительно просто в настройке
+ все сниппеты работают без проблем

— для перевода необходимо бегать по всему дереву
— больше 2-х языков уже превращается в головную боль
— секретарша возмущалось что «как-то все замудренно...»
— к готовому сайту это решение уже не применить

Как вариант можно дописать плагин на подобие Babel для рево (идея Dmi3yy), это немного облегчит задачу создания переведенного документа, но не на много.

3) Свой вариант
Хранить перевод в своей таблице с выводом всех полей для перевода во вкладках ресурса

+ все на одной странице
+ это СВОЕ
+ прикручивать можно к уже готовым сайтам

— продумать
— написать
— протестировать
— и пока непонятно как оно должно работать

Оптимально ли это и не получится ли такая же ерунда как и с хранением перевода в tv? Или это не так уж и страшно?

Жду вашей критики.

23 комментария

avatar
Ну второй вариант вполне можно и на готовый сайт применить (лично делал). Вам же ничего не мешает создать док и сделать его родителем нужных, выбрав их по ID.
avatar
да, я вот после написания всего этого тоже начинаю склонятся ко второму варианту. Видимо надо было давно как-то структурировать знания. Спасибо!
avatar
Посмотрите на досуге, как то немного переписывал сниппет, чтобы особенно не париться, если языков много.
Комментарий отредактирован 2013-07-22 21:31:24 пользователем a-sharapov
avatar
1. ямс — ужасно глючный, + использование кучи tv — плохо скажется на скорости отдачи страниц.
2. наиболее адекватный вариант. Можно обойтись одним лишним шаблоном и парой чанков.
3. геморно и долго)
avatar
Помнится, по 3-ему варианту предлагал решать проблему TimGS. Идея заключалась в модификации ядра, чтобы подменять таблицы на лету — это позволило бы избежать геморроя с компонентами (очевидно кроме работающих с БД напрямую). forums.modx.com/thread/?thread=76367&page=1 — вот, нашел даже обсуждение.
avatar
все в 100 раз проще )
avatar
например? :)
avatar
Скоро закончу узнаете. Интрига
avatar
читал, мудрено малость и непонятно что с seo
avatar
Не знаю, кому как, но мой выбор yams + пара плагинов для более легкой работы.

— сложность в настройке

Это плата за мощность. Решение реально годится на все случаи жизни, но надо один раз в нем разобраться как следует.

— куча tv параметров
— сложная выборка всех этих tv

Ни о чем. Кто вас заставляет делать все эти выборки? YAMS берет эту работу на себя.

— проблем с Ditto и с Wayfinder
— проблема с пагинацией

Руки. И языки. На все эти случаи есть мануалы. Хотя я согласен, что не все безоблачно. Именно для этого я использовал те самые пару плагинов. Получалось проще, чем в мануалах, хотя тоже иной раз приходится вникнуть.

— не работает со сборкой Dmi3yy

В этом пункте я лучше промолчу. А то он тут где-то неподалеку. Забанит к такой-то матери еще=)

Впрочем, если активно пользуетесь сборкой, то вам лучше YAMS не использовать. Более того, я не уверен, что в 1.0.10 все будет корректно работать.
avatar
да, мне YAMS тоже как-то ближе, удобнее конечному пользователю получается.
Сборку начал в последнее время использовать, уж очень удобно.
Наверное придется потратить пару дней, но таки разобраться.
Да и bumkaka интригу тут затевает, боюсь даже загадывать что там может быть…
В общем спасибо! буду дальше изучать YAMS.
avatar
Абсолютно так-же как и в посте выше
avatar
может выделите как-нибудь время расписать подробнее, а то постов на эту тему очень много.
avatar
Т.е. надо сделать их еще больше?

А время пока самый проблемный ресурс, увы.
avatar
Два раза создавал мультязычные сайты. На первом использовал YAMS — не понравилось, гибкости, чтоли, меньше. На втором уже использовал свое решение основанное на этих статьях:
modx.im/blog/triks/20.html
e-kao.ru/multilingual
e-kao.ru/multilingual-2

Сайт имеет следующую структуру:
Главная страница
-ru
--main.html
--…
-en
--main.html
--...


Главная страница пуста, на ней определяем язык пользователя — либо он уже сохранен в кукисах, либо по браузеру. Для этого используется сниппет LanguageDetect, который редиректит на главную соотвествующего языка:
<?php
$lang = isset($_COOKIE['lang']) ? $_COOKIE['lang'] : substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

switch ($lang) {
	case 'ru':
	case 'be':
	case 'uk':
	case 'ky':
	case 'ab':
	case 'mo':
	case 'kz':
  		$lang = 'ru';
  		break;
  default:
  		$lang = 'en';
}

header( 'Location: http://' . $_SERVER['SERVER_NAME'] . '/' . $lang . '/main.html', true, 301 );
?>

Затем в начале шаблона вызывается сниппет SetLanguage, которых сохраняет текущий язык в кукисы и создает плейсхолдер lang:
<?php
$pid = $modx->runSnippet('UltimateParent', array('topLevel' => 2));

$parent = $modx->getDocument($pid, 'alias');

$lang = $parent['alias'];

if ( !in_array($lang, array('ru', 'en')) ) {
	$lang = 'ru';
}

$modx->setPlaceholder('lang', $lang);

setcookie('lang', $lang, time() + 60 * 60 * 24 * 30, '/');
?>

И третий сниппет — немного переделанный сниппет Switch из этой статьи modx.im/blog/triks/20.html :
<?php
$lang = $modx->getPlaceholder('lang');

switch ($lang) {
	case 'en':
  		$output = $en;
  		break;
	default:
  		$output = $ru;
}

return $output;
?>

Работает он так [!Switch? &ru=`Русский текст` &en=`Eglish text`!]

Все остальное решается стандартными сниппетами.
avatar
К этому решению не хватает только плагина аля BEBEL в revo что б можно было легко связывать документы и перемещаться по языковым версиям не находя каждый раз документ
avatar
даааа
avatar
у меня была мысль написать но все нету проекта под это дело что б и окупилось время на разработку и оттестировать в боевых условиях
avatar
а за сколько бы взялись написать такую штуку?
avatar
По началу тоже подумал написать что-то вроде Babel. Но так как сайт небольшой и страниц там немного, то решил, что необходимости в таком решении нет.
Комментарий отредактирован 2013-07-24 09:11:27 пользователем AKtor
avatar
А как добавить 3 язык?
avatar
используйте или bLang или EvoBabel )
avatar
Свой вариант.
Делаем доп. поля в таблице _site_content:
pagetitle_en, content_en, longtitle_en.
Через ClientSettings добавляем переводы для кнопок, полей форм и т.д.
При генерации страницы сниппетом проверяем GET параметр lang и выдаем нужные поля из БД, переводы из ClientSettings и т.д.
в списках новостей, товаров, галерей выбираем нужную языковую версию через prepare. Спасибо Doclister))
все СЕОшные поля для разных языков — в один MultiTV.
Получается удобно для пользователя (языковые поля в разных табах) и нет запросов к куче ТВ
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.