Создание мультиязычных сайтов на MODx Revolution
Встретил интересную статью: designfromwithin.com/blog/2012/01/12/modx-multilingual-setting-up-babel-and-have-a-website-with-multible-languages/
Решил перевести :) Большое спасибо ее автору!
Наша цель: необходимо создать один сайт с тремя поддерживаемыми языками и красивыми адресами страниц для каждого языка.
— Английский —
your-website-url.com
— Голландский
your-website-url.com/nl/
— Немецкий —
your-website-url.com/de/
Управление всеми разделами сайта будет производиться из одной панели MODx, создание и редактирование страниц будет легким для администратора.
Основные шаги этого руководства
Шаг №1 – Настройка файла .htaccess
Шаг №2 – Создание контекстов
Шаг №3 – Создание «плагина-шлюза»
Шаг №4 – Установка плагина Babel
Шаг №5 – Создание многоязыкового контента
Шаг №6 — Готово!
Что нужно
Для успешного выполнения всех действий потребуется:
— Установленный MODx Revolution версии 2.1 или выше
— Доступ к корневой директории сайта на веб-сервере (для редактирование файла .htaccess)
— Пакет Babel (версии 2.2.4 или выше). Его можно установить из панели управления сайтом.
Полезные ссылки
— Инструкция по пакету Babel —
rtfm.modx.com/display/ADDON/Babel
— Официальная инструкция MODx по созданию мультиязычных файлов —
rtfm.modx.com/display/revolution20/Using+Friendly+URLs
— Инструкция по работе с контекстами в MODx —
rtfm.modx.com/display/revolution20/Contexts
Шаг №1 — Настройка файла .htaccess
Найдите в корневой директории сайта файл ht.access или .htaccess. Создайте его резервную копию. Переименуйте его в .htaccess (если он так еще не называется).
Сначала необходимо убедиться, что 'RewriteBase' строка корректна. Если Ваш сайт установлен в корневую директорию домена, используйте следующие настройки:
RewriteEngine On
RewriteBase /
Если же Ваш сайт установлен в какую либо подпапку (напр. sub-folder), используюте следующий код:
RewriteEngine On
RewriteBase /your-sub-folder/
Убедитесь, что у Вас включен 301 редирект, убирающий (или наоборот, добавляющий) www:
# Rewrite www.domain.com -> domain.com -- used with SEO Strict URLs plugin
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^your-website-url\.com [NC]
RewriteRule (.*) http://your-website-url.com/$1 [R=301,L]
Не забудьте заменить здесь your-website-url.com на адрес Вашего сайта!
Следующий важный этап, Вам необходимо этот код ниже блока # The Friendly URLs part, вот так:
# The Friendly URLs part
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(en|nl|de)?/?(.*)$ index.php?cultureKey=$1&q=$2 [L,QSA]
# redirect all requests to /de/favicon.ico and /nl/favicon.ico
# to /favicon.ico
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(en|nl|de)/favicon.ico$ favicon.ico [L,QSA]
# redirect all requests to /de/assets* and /nl/assets* to /assets*
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(en|nl|de)/assets(.*)$ assets$2 [L,QSA]
# redirect all other requests to /de/* and /nl/*
# to index.php and set the cultureKey parameter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(en|nl|de)?/?(.*)$ index.php?cultureKey=$1&q=$2 [L,QSA]
Не забудьте заменить здесь your-website-url.com на адрес Вашего сайта!
В этом примере у нас используются 3 языка, Голландский (nl), Немецкий (de) и Английский (en). Английский язык здесь – это язык по-умолчанию. Если у Вас будут использоваться другие языки, будет необходимо соответственно изменить этот код.
Шаг №2 – Создание контекстов
В панели управления сайтом необходимо создать контекст (context) для каждого из языков. Обратите внимание, что контекст «web», созданный по-молчанию, мы будем использовать для нашего языка по умолчанию, т.е. английского.
Для этого в меню выберите пункт «Система»-> «Контексты» (System > Context) и нажмите «Создать новый» (Create New).
В поле «Ключ контекста» (Context Key) введите Ваш язык на английском языке, например «Deutsch» для немекого или «Nederlands» для голландского.
Далее нажмите правой кнопкой на строке с созданным контекстом и выберите пункт «Обновить контекст» (Update Context). Перейдите на вкладку «Настройки контекста» и нажмите кнопку «Создать новый».
Следующие настройки необходимо создать для каждого языка:
Контекст: Английский
Base URL: ключ «base_url», значение "/"
Culture key: ключ «cultureKey», значение «en»
Site start: ключ «site_start», значение «1»
Site URL: ключ «site_url», значение «
your-website-url.com/»
Контекст: Голландский
Base URL: ключ «base_url», значение "/nl/"
Culture key: ключ «cultureKey», значение «nl»
Site start: ключ «site_start», значение «Id «домашней» страницы этого языка (создадим позже)»
Site URL: ключ «site_url», значение «
your-website-url.com/nl/»
Контекст: Немецкий
Base URL: ключ «base_url», значение "/de/"
Culture key: ключ «cultureKey», значение «de»
Site start: ключ «site_start», значение «Id «домашней» страницы этого языка (создадим позже)»
Site URL: ключ «site_url», значение «
your-website-url.com/de/»
«Тип поля» этих настроек – «Текстовое поле».
Шаг №3 – Создание «плагина-шлюза»
Теперь нужно создать простой плагин для присвоения корректного контекста в зависимости от просматриваемого языка. В Панели управления сайтом перейдите на вкладку «Элементы» и нажмите иконку «Новый плагин».
В поле «Имя» напишите gateway, а в поле «Код» этот код:
<?php
if($modx->context->get('key') != "mgr"){
/* grab the current langauge from the cultureKey request var */
switch ($_REQUEST['cultureKey']) {
case 'nl':
/* switch the context */
$modx->switchContext('Nederlands');
break;
case 'de':
/* switch the context */
$modx->switchContext('Deutsch');
break;
default:
/* Set the default context here */
$modx->switchContext('web');
break;
}
/* unset GET var to avoid
* appending cultureKey=xy to URLs by other components */
unset($_GET['cultureKey']);
}
?>
Этот плагин должен срабатывать при возникновении события OnHandleRequest (обработка любого запроса), для того что бы это сзделать, перейдите на вкладку «Системные события» и поставьте галочку напротив этого события.
Сохраните Ваш плагин.
Шаг №4 – Установка плагина Babel
Уже почти все =). Теперь нужно установить плагин Babel. В Панели управления MODx выберите в меню пункт «Система»->«Управление пакетами», нажмите скачать дополнения и найдите «Babel». Скачайте и установите этот пакет. При установке обратите внимание на настройки плагина, там должны быть указаны Ваши контексты через запятую, например: web,Deutsch,Nederlands.
Остальные настройки не трогайте.
Шаг №5 – Создание многоязыкового контента
Теперь нам осталось создать список ссылок на сайте для переключения языка. Плагин Babel имеет весьма простое решение для этого:
<ul>[[BabelLinks]]</ul>
Шаг №6 — Готово!
Все готово! Надеюсь что эта инструкция поможет Вам!
Жду Ваши замечания в комментариях.
Комментарии (31)
RSS свернуть / развернуть1) Я не трогаю файл .htaccess вообще, по дефолу оставляю.
2) Я создаю папки к вашему примеру nl и de, копирую туда файлы .gitignore, .htaccess, config.core.php, index.php, favicon.ico.
В файле index.php меняем контекст на свой. т.е. если папка nl то на контекст Nederlands
А дальще тоже самое, Бабел, плагин свич…
valikras
Минусы Вашего решения:
1. дублирование кода
2. при обновлении MODx надо контролировать файлы index.php
Плюсы:
1. Выглядит проще
Но вообще мне мануал понравился, перевести решил, думаю что пригодится многим и вопросов, особенно от новичков, станет поменьше.
createit
2) при обновлении MODx надо контролировать файлы index.php. Не нужно, зачем, мы файл не трогаем основной index.php.
Плюсы
1. Выглядит проще
2) Мы не трогаем файл .htaccess, так как часто проблемы возникают, особенно у неопытных,. + сейчас много серверов не на апаче, без потдержки .htaccess.
Честно, хотел давно написать, даже просили. Но с помощью вашего топика у людей теперь есть аж два решения. Какой им выбирать, они уже сами решат!
Держите +
valikras
Ребята, давайте прекратим в минусовки играть. Пользователь @createit старался для Вас!
Просто в следующий раз вы увидите пустой бланк.
Давайте ценить труд других пользователей!!!!!
valikras
По index.php. А если он обновится в MODx? Веть скопированные файлы так же хорошо бы обновить до актуальной версии.
createit
А вообще, я стараюсь не обновлять Модекс, потому-что у меня много кода (почти весь) на апи, и один раз так напоролся…
Сделал, работает, устраивает — Забылся! только потдерживать.
valikras
Я пока не готов пожертвовать этим!
Поэтому обновляю… хотя мой опыт MODx — всего полгода.
createit
А вот безопасность подтягивать надо
Dmi3y
Короче, спасибо, пригодилось.
SurRealistik
Сделать компонент в админке, с обычной таблицей, которая будет создаваться из всех ресурсов сайта (понятно, нужен приятный поиск).
Несколько табов в компоненте (Ext.Panel), по одной на язык, и в каждой — перечень всех ресурсов, с полями id, pagetitle, longtitle, introtext, description и content.
Эти поля будут храниться в отдельно таблице компонента. Поля типа publishedon и подобные мы не берем — они в modResource.
В компоненте редактируем страницы, основной язык остается в дереве, а допольнительные — в таблице компонента.Потом пишем плагин, который в зависимости от переменной в сессии при загрузке страницы будет грузить контент и другие поля для нужного языка.
Дальше на эту идею можно накручивать навороты. Например, если нет перевода на немецкий — выводить английский, или оставлять русский. Плюс добавить кэширование, еще что-то.
Ну и потом нужно будет заставить работать по этой схеме сниппеты типа getResources и Wayfinder.
Это сделаем путем подстановки в чанки не [[+pagetitle]], а [[+id:getlang=`pagetitle`]] и специальный сниппет будет добывать заголовок на нужном языке.
Такая схема мне видится гораздо более удобной и понятной. Возможно, когда то реализую, если никто раньше не сделает.
bezumkin
kochenov
createit
Буду очень признателен…
kochenov
По теме — прочитайте про:
— сниппеты в MODx
— setlocale и date в php
createit
kochenov
Получается, если для каждого из контекстов эту настроку переопределить — может и заработает… а помет в плагин переключения контекстов (в статье который описан) гадо будет добавить пару строк, делающих переключение локали… К сожалению не знаю, не работал :)
createit
createit
url вида: localhost/modx — русский язык
localhost/modx/en — английский
— 2 языка, русский по умолчанию, создал контексты, определил свойства, поправил .htaccess, поставил babel. вроде всё как и нужно, но работает только русский язык, для английского получаю 404.
Куда копать?
в логе апача:
digdream
valikras
digdream
valikras
digdream
Теперь есть подтверждение от участников, что это решение рабочее)))
createit
у меня не совпадают поля
Контекст: Английский
Base URL: ключ «base_url», значение "/"
Culture key: ключ «cultureKey», значение «en»
Site start: ключ «site_start», значение «1»
Site URL: ключ «site_url», значение «your-website-url.com/»
У меня
Ключ
Имя
Описание
— Тип поля
Пространство имён:
Запись словаря для раздела:
— Значение
modx 2.20 pl2
Что где писать??
akselei
akselei
createit
что в .htaccess не работало — css и favicon — правильный редирект:
RewriteRule ^en/css/style.css$ /css/style.css [R=301,L]
RewriteRule ^en/favicon.ico$ /favicon.ico [L,QSA]
К тому же есть site_url прописывать полным типа site.ru/ получается ссылка вида site.ru/site/ru/page…
ziexmedia
Возможно где то ошиблись или что то забыли.
createit
Так-что не это решение не работает, а у вас что-то неправильно настроенно… или не донастраивали…
В шаблоне в head добавлен у вас base?
valikras
при обращении к ней… ((
проблема может из-за того, что у меня поддомен вида sub.domen.ru?
ziexmedia
valikras
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.