Как настроить Babel, чтобы не было мучительно больно
Один день проведённый на modx.pro показал, что у людей очень много проблем с дополнением Babel. Люди боятся его за сложность настройки. На самом деле всё не так страшно. Эта статья, надеюсь, поможет при создании мультиязычных сайтов. Целью этой статьи не является разбор, чем одно дополнение лучше другого, это именно инструкция: как сделать.
Итак, у вас есть или разрабатывается сайт, который должен стать мультиязычным. С чего начать? Самый важный момент – проверить, что у вас в системных настройках в разделе «Дружественные URL» включены «friendly_urls» (Использовать дружественные URL). Затем создаем дополнительные контексты (то же меню раздел «Контексты»). Например, были у нас web и mgr (да, менеджер тоже находится в отдельном контексте), в дополнение к нему создаём контексты с ключами en и de. Ключи после создания (обычным способом) поменять нельзя, поэтому вызывайте всех святых, чтобы не ошибиться. Во время создания контекстам лучше сразу дать красивые имена, например, English и German (имя можно исправить позже). Контекст web также лучше переименовать для удобства.

Теперь можно скачивать дополнение Babel, как обычно, меню «Приложения» — «Установщик» При установке он сразу подхватит ваши текущие контексты, при желании их можно подправить (Context Keys). Если по какой-то причине позже появится дополнительный контекст, не беда, в «Системным настройках», в разделе Babel можно внести изменения. Иногда случается, что после правок системных настроек Вавилон не отображает значок перевода на фронтенде, хотя у вас связка ресурсов есть. Это из-за сессии. Поэтому после изменения настроек принудительно завершаем все сеансы.
Теперь переходим к редактированию контекстов. Правой кнопкой мыши жмём над нужным нам контекстом, например, Russian, выбираем «Редактировать контекст» и создаём следующие параметры (порядок не важен):

Там же переключаемся на «Права доступа» и проверяем есть ли для группы anonymous политика доступа «Load Only» с рангом 9999. Если нет, то создаем.
Далее, все остальные контексты редактируем по такому же принципу.
Следующий шаг – создание плагина, который будет отвечать за переключение контекстов. Идём в «Элементы» и создаём новый плагин, для удобства обзовём его «OnHandleRequest» и включаем для него в разделе «Системные события» OnHandleRequest. Код плагина:
Осталось совсем чуть-чуть, поправить .htaccess и в путь. Это при условии, что у вас стоит Апач. Если нет, то переделываете правила под свою систему. Начальный htaccess есть в инсталляции MODX’a, я объясню, что надо поменять. Итак, старый кусок кода:

На фронтенде, на странице у которой есть перевод появится меню выбора языка. Причем вести ссылка будет на конкретный документ, что связан с оригиналом.
Какие проблемы могут возникнуть во время использования? Поскольку у нас URL стал виртуальным, то могут возникнуть проблемы со ссылками, которые генерятся другими дополнениями. Например, Gallery или AjaxForm. В первом случае нам надо изменить настройки «Источников файлов» (меню «Медиа»). Заходим, как обычно жмём праву кнопку над источником «Filesystem» и выбираем «Редактировать». Меняем два параметра:

А в случае с AjaxForm в «Системных настройках», раздел «Сессии и куки», параметр «session_cookie_path» поменять на «/».

Что еще почитать? Обязательно официальную документацию на английском, надеюсь теперь она вам будет понятна:
MODX docs – Babel
а это дамашняя страница Babel'a, отсюда я черпал вдохновение:
SEO Friendly Multilingual Websites with MODx and Babel
Ну и конечно же, при создании статьи не обошлось без «Stack Overflow»
Итак, у вас есть или разрабатывается сайт, который должен стать мультиязычным. С чего начать? Самый важный момент – проверить, что у вас в системных настройках в разделе «Дружественные URL» включены «friendly_urls» (Использовать дружественные URL). Затем создаем дополнительные контексты (то же меню раздел «Контексты»). Например, были у нас web и mgr (да, менеджер тоже находится в отдельном контексте), в дополнение к нему создаём контексты с ключами en и de. Ключи после создания (обычным способом) поменять нельзя, поэтому вызывайте всех святых, чтобы не ошибиться. Во время создания контекстам лучше сразу дать красивые имена, например, English и German (имя можно исправить позже). Контекст web также лучше переименовать для удобства.

Теперь можно скачивать дополнение Babel, как обычно, меню «Приложения» — «Установщик» При установке он сразу подхватит ваши текущие контексты, при желании их можно подправить (Context Keys). Если по какой-то причине позже появится дополнительный контекст, не беда, в «Системным настройках», в разделе Babel можно внести изменения. Иногда случается, что после правок системных настроек Вавилон не отображает значок перевода на фронтенде, хотя у вас связка ресурсов есть. Это из-за сессии. Поэтому после изменения настроек принудительно завершаем все сеансы.
Теперь переходим к редактированию контекстов. Правой кнопкой мыши жмём над нужным нам контекстом, например, Russian, выбираем «Редактировать контекст» и создаём следующие параметры (порядок не важен):
- Ключ: «base_url», значение: "/ru/".
- Ключ: «cultureKey», значение: «ru»
- Ключ: «site_start», значение: «1» (ID номер первой страницы контекста)
- Ключ: «site_url», значение: «example.ru/ru/» (меняем на свой домен, если надо, указываем протокол https).

Там же переключаемся на «Права доступа» и проверяем есть ли для группы anonymous политика доступа «Load Only» с рангом 9999. Если нет, то создаем.
Далее, все остальные контексты редактируем по такому же принципу.
Следующий шаг – создание плагина, который будет отвечать за переключение контекстов. Идём в «Элементы» и создаём новый плагин, для удобства обзовём его «OnHandleRequest» и включаем для него в разделе «Системные события» OnHandleRequest. Код плагина:
<?php
if($modx->context->get('key') != "mgr"){
/* grab the current langauge from the cultureKey request var */
switch ($_REQUEST['cultureKey']) {
case 'de':
$modx->switchContext('de');
setlocale(LC_ALL, 'de_DE.UTF8');
break;
case 'en':
$modx->switchContext('en');
setlocale(LC_ALL, 'en_US.UTF8');
break;
default:
// Set the default language/context here
$modx->switchContext('web');
setlocale(LC_ALL, 'ru_RU.UTF8');
break;
}
unset($_GET['cultureKey']);
}Кроме переключения на нужный контекст мы также меняем локаль для системы. Теперь PHP скрипты будут разговаривать на правильном языке для каждого контекста. Очень удобно.Осталось совсем чуть-чуть, поправить .htaccess и в путь. Это при условии, что у вас стоит Апач. Если нет, то переделываете правила под свою систему. Начальный htaccess есть в инсталляции MODX’a, я объясню, что надо поменять. Итак, старый кусок кода:
# The Friendly URLs part
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]Меняем на это:# Force language when requesting the root (/) . Смена языка при запросе корня сайта
RewriteCond %{HTTP:Accept-Language} ^ru [NC]
RewriteRule ^$ /ru/ [R=301,L]
RewriteCond %{HTTP:Accept-Language} !^ru [NC]
RewriteRule ^$ /ru/ [R=301,L]
# Языки поменяли, теперь сменим виртуальные пути на реальные
# redirect all requests to /en/favicon.ico to /favicon.ico
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(en|ru|de)/favicon.ico$ favicon.ico [L,QSA]
# redirect all requests to /en/assets* to /assets*
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(en|ru|de)/assets(.*)$ assets$2 [L,QSA]
# redirect all other requests to /en/*
# to index.php and set the cultureKey parameter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(en|ru|de)?/?(.*)$ index.php?cultureKey=$1&q=$2 [L,QSA]Да, не забываем, что в темплейтах всех ваших страниц должен быть указан :<head>
...
<base href="[[++site_url]]" />
...
</head>Сайт уже должен работать и адресная строка, при запросе корня сайта (example.ru) должна поменяться на example.ru/ru/. Осталось настроить меню языков. Самый простой вариант, чтобы работало и понятно было: <ul>
[[BabelLinks? &tpl=`BabelLinksTpl`]]
</ul>BabelLinksTpl:<li><a href="[[+url]]" class="[[+cultureKey]][[+active:notempty=` [[+active]]`]]">[[+cultureKey]]</a></li>Теперь на главной странице будет так:<ul>
<li><a href="http://example.ru/en/" class="en">en</a></li>
<li><a href="http://example.ru/de/" class="de">de</a></li>
</ul>Чтобы было видно текущий язык, надо вызов оформить так:[[BabelLinks? &tpl=`BabelLinksTpl` &showCurrent=`1`]]Теперь можно переводить материалы.
На фронтенде, на странице у которой есть перевод появится меню выбора языка. Причем вести ссылка будет на конкретный документ, что связан с оригиналом.
Какие проблемы могут возникнуть во время использования? Поскольку у нас URL стал виртуальным, то могут возникнуть проблемы со ссылками, которые генерятся другими дополнениями. Например, Gallery или AjaxForm. В первом случае нам надо изменить настройки «Источников файлов» (меню «Медиа»). Заходим, как обычно жмём праву кнопку над источником «Filesystem» и выбираем «Редактировать». Меняем два параметра:
- baseUrl изменить на «/»;
- baseUrlRelative изменить на «Нет»;

А в случае с AjaxForm в «Системных настройках», раздел «Сессии и куки», параметр «session_cookie_path» поменять на «/».

Что еще почитать? Обязательно официальную документацию на английском, надеюсь теперь она вам будет понятна:
MODX docs – Babel
а это дамашняя страница Babel'a, отсюда я черпал вдохновение:
SEO Friendly Multilingual Websites with MODx and Babel
Ну и конечно же, при создании статьи не обошлось без «Stack Overflow»
Комментарии: 36
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Как мы видим в немецкой версии сайта выводим только ссылки из родителя, т.к. в Германии все сайты должны иметь набор из 3ёх страниц Impressum, AGB и Datenschutzt. А вот ещё пример вывода pdoPage с Babel:
В parents указываем родителей желаемых для вывода разделов из разных контекстов.
P.S. Я вот про такие примеры писал)
Тут тоже согласен (хоть и напрямую к Babel не относиться) но все же. Тут же можно было выйти из ситуации так: создать настройку для контекстов в которой хранились бы нужные id.
Пример:
Создать настройку context_menu_id
Задать его контекстам, web => 4, en => 85, de => 86
И уже нужно было бы выводить меню так:
В первом случае, если менеджеру запрещено редактировать эти записи, используем словарь MODX'a:
Если разрешено, то на первой странице сайта создаём ТВ'шки со всякой служебной инфой и потом выводим нужные поля, например через fastField:
А во втором случае (относится ко всем сниппетам из pdoTools) можно ограничивать выборку по контекстам через опцию &context. Получить текущий контекст через Fenom вообще плёвое дело:
Примеров много:
- Плейсхолдеры полей ввода
- Заголовки блоков
- Тексты кнопок
- И многое другое
Для таких задач я создаю отдельный словарь, в MODX это удобно. Но вдруг люди/читатели не знают как это делать. Пример из жизни: Попался сайт интернет магазин который я так и не вернул в жизнь, там разработчик в каждом месте где нужно было вывести текст проверял контекст и выводил нужный текст или вообще чанки нагородил под каждый язык.После долгих попыток, выяснилось, что дело в пробеле в строке вывода сниппета BabelLinks.
Лишний пробел перед названием чанка в строке вызова.
То есть, это
Должно быть так
После этого заработало.
Видел выше, что можно как-то проверять по контексту.
З.Ы. Fenom у меня почему-то не работает. Вызовы выводятся, как строка.
В системных настройках раздела pdoTools включить — pdotools_fenom_parser.
Например: «3,4,5,10» — для контекста ru и «21,22,23,24» — для контекста en. Но тогда возникает вопрос: каким образом pdoResources определит, какой родитель должен быть выведен и на каком языке? Спасибо.
И зачем в один вызов подставлять всех родителей? Логично предположить, что один ключ с id = один отдельный вызов pdoResources.
Осталось только получить текущий контекст :) Вот здесь приведён код сниппета, который выведет контекст как для текущего документа, так и для заданного:
[SOLVED] Return the current context key
А с Fenom'ом скорее всего проблема из-за какого-нибудь скрипта или инлайн стиля (если он правильно поключен). Вот ссылка на документацию с описанием конфликта фигурных скобок и что с этим делать: Тег {ignore}
P.S. У Андрея вариант даже более быстрый.
Вывожу [[BabelLinks]]. Подскажите, пожалуйста где можно заменить:
на:
Где
и есть вывод записи из Лексикона. Остается только поменять перевод на свой.
Есть два контекста — по умолчанию (украинский) и русский: web и ru соответственно.
В конфиге Babel контексты указаны.
[[BabelLinks? &tpl=`BabelLinksTpl`]]
и чанк[[+cultureKey]]
Такая конструкция выводит только ru.
В Вашем примере тоже изначально при трех языках выводиться только два
- en
- de
Подскажите, пожалуйста, как при двух языках выводить две ссылки (переключатели) ru | ua?Показывать текущий не вариант, так как при смене на русский будет ru | ru
а — ru | ru
По крайней мере, у меня так, пробовал
Продублирую
Переключатель
Сейчас я вывожу с текущим. При загрузке украинской версии вроде все норм: «ru | ua»
но после перехода на русский, получается «ru | ru»
чанк BabelLinksTpl
Попробовал сбросить сессии пользователей, к сожалению, не помогло.
Такой код выведет английский, немецкий.
Русский выводиться только через текущий? [[BabelLinks? &tpl=`BabelLinksTpl` &showCurrent=`1`]]
Если текущим пользователь выберет английский, то разве не получиться что-то вроде:
«английский, немецкий, английский», из которых последний — текущий.
То есть анкор «русский» пропадет, хотя ссылка будет идти на русскую версию.
?
Вам удалось решить проблему?
Можно по конкретнее?
Только ru выводит (текущую), не могу перевестись на uk.
Друзья, пожалуйста отзовитесь и помогите. Проект лежит мертвым грузом, начальство просит срочно разобраться.
Пример Чанка: [[*context_key:is=`web`:then=`[[+ru_id]]`:else=`[[BabelTranslation:default=`[[+ru_id]]`? &resourceId=`[[+ru_id]]` &contextKey=`en`]]`]]
Пример вызова: Ссылка на страницу
Проблема в том, что в данном Чанке есть проверка между 2мя языками, а мне необходимо проверять среди 3х языков (web = ru / en / ro). Пожалуйста, можете подсказать как изменить код?
Где копать?