Как реализовать мультиязычность для сайтов на ModX REVO

АвторРоман Наумов Как реализовать мультиязычность для сайтов на ModX REVO
01.10.2014
25998
133
Мне понравилось

Подключить мультиязычность на различных CMS это всегда непросто, и ModX не исключение. Если Вас это не пугает, прошу внимательно прочитать данную статью.
Для лучшего понимания статьи я буду описывать процедуру подключения в примере.
Допустим мы хотим подключить два дополнительных языка для сайте разработанном на ModX REVO, то есть мы хотим получить следующий результат:

  •     Russian http://your-website-url.ru
  •     English http://your-website-url.ru/en
  •     Ukrainian http://your-website-url.ru/ua


Также нам нужен удобный интерфейс для создания ресурсов(страниц) с учетом мультиязычности.

Для реализации данной задачи нам понадобиться:

  •     MODX Revolution (2.1 и старше)
  •     Доступ до .htaccess или ht.access
  •     Плагин Babel 2.2.4-pl (и старше).


Шаг 1. Настройка .htaccess
В файле .htaccess проверяем правильность 'RewriteBase'. Если Ваш сайт установлен в корневой каталог используемого домена пишем:

RewriteEngine On
RewriteBase /

Если сайт установлен не в корневой каталог пишем:

RewriteEngine On
RewriteBase /Ваш-каталог/

Не забудьте проверить правильность настройки редиректов:

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^your-website-url\.ru [NC]
RewriteRule (.*) http://your-website-url.ru/$1 [R=301,L]

Далее добавляем в наш .htaccess(чуть ниже # The Friendly URLs part, replace the existing code of the Friendly URLs) следующее:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(ru|en|ua)/favicon.ico$ favicon.ico [L,QSA]
   
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(ru|en|ua)/assets(.*)$ assets$2 [L,QSA]
 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(ru|en|ua)?/?(.*)$ index.php?cultureKey=$1&q=$2 [L,QSA]

Шаг 2. Настройка контекстов
С админ панели ModX нам нужно создать контексты для каждого языка. Для этого перейдите по: Система > Контексты и кликаем по Создать новый.
Далее в качестве Ключ контекста вводим название языка, в примере мы используем English для английского и Ukrainian для украинского.
Далее правый клик мыши по Вашему новому контексту и выбираем Редактировать. Переходим по табу Настройки контекста и кликаем по Создать новый.
Для каждого языка нам нужно добавить четыре настройки.

Основной контекст это web (так называется по умолчанию), сначала редактируем его:

Base URL

  •     Ключ: base_url
  •     Имя: Base URL
  •     Запись словаря для раздела: language
  •     Значение: /


Culture key

  •     Ключ: cultureKey
  •     Имя: Culture key
  •     Запись словаря для раздела: language
  •     Значение: ru


Site start

  •     Ключ: site_start
  •     Имя: Site start
  •     Запись словаря для раздела: language
  •     Значение: 1


Site URL

  •     Ключ: site_url
  •     Имя: Site URL
  •     Запись словаря для раздела: language
  •     Значение: http://your-website-url.ru/


Добавляем английский контекст 'English':

Base URL

  •     Ключ: base_url
  •     Имя: Base URL
  •     Запись словаря для раздела: language
  •     Значение: /en/

Culture key

  •     Ключ: cultureKey
  •     Имя: Culture key
  •     Запись словаря для раздела: language
  •     Значение: en

Site start

  •     Ключ: site_start
  •     Имя: Site start
  •     Запись словаря для раздела: language
  •     Значение: 'ID главной страницы английского языка (где его взять узнаете далее)'

Site URL

  •     Ключ: site_url
  •     Имя: Site URL
  •     Запись словаря для раздела: language
  •     Значение: http://your-website-url.ru/en/

Добавляем украинский язык контекст 'Ukrainian':

Base URL

  •     Ключ: base_url
  •     Имя: Base URL
  •     Запись словаря для раздела: language
  •     Значение: /ua/

Culture key

  •     Ключ: cultureKey
  •     Имя: Culture key
  •     Запись словаря для раздела: language
  •     Значение: ua

Site start

  •     Ключ: site_start
  •     Имя: Site start
  •     Запись словаря для раздела: language
  •     Значение: 'ID главной страницы английского языка (где его взять узнаете далее)'

Site URL

  •     Ключ: site_url
  •     Имя: Site URL
  •     Запись словаря для раздела: language
  •     Значение: http://your-website-url.ru/ua/

Шаг 3. Создание плагина 'gateway'
Для того чтобы наша мультиязычность работала нам нужно разработать плагин для связки языка с контекстом.
В панели управления переходим по табу Элементы и кликаем по иконке Новый плагин.
В поле имя пишем gateway, в код помещаем следующий код:

          if($modx->context->get('key') != "mgr"){
                /* grab the current langauge from the cultureKey request var */
                switch ($_REQUEST['cultureKey']) {
                    case 'en':
                        /* switch the context */
                        $modx->switchContext('English');
                        break;
                    case 'ua':
                        /* switch the context */
                        $modx->switchContext('Ukrainian');
                        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. Тут все просто, в админ панели переходим по Система > Управление пакетами кликаем Загрузить дополнения и находим там babel. Загружаем пакет.
Теперь мы можем установить Babel, кликаем по Установить. Проходим все необходимые условия установки пока не увидите Настройки установки. Здесь уже должны быть контексты которые Вы создали (по примеру это: web,English,Ukrainian), другие настройки оставляем без изменений.

Шаг 5. Создание мультиязычного контента
На конец нам нужны кнопки(ссылки) переключения языков. С помощью Babel это очень просто реализовать.
Для этого в месте где вы хотите вывести переключатель(шаблон, чанк) пишем следующее:

<ul>
	<li>[[BabelLinks]]</li>
</ul>


Проверяем... Ура! Переключатель есть.

Но как же добавлять страницы сайта на других языках?

В админ. панели сайта, таб Ресурсы, Вы должны видеть три контекста (по примеру: web,English,Ukrainian). Ресурсы каждого из контекстов отвечают за ресурсы языковых версий сайта.

Но как нам знать какой ресурс за какую страницу отвечает?

Здесь нам поможет Babel. Если вы выберите существующий ресурс, то в правом верхнем углу Вы можете видеть кнопки, отвечающие за языковые версии. Наведите курсор мыши на любой из них(кроме активного) и кликните по дублировать ресурс. После этого у Вас создастся копия ресурса только в другом контексте(языковой версии). Таким образом создавайте все Ваши ресурсы.

Вот и все, если все делали по примеру должно работать. Если есть вопросы - задавайте. Будем рады помочь.