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

Опубликовано: 22 Дек 2014

Нашла отличную статью по организации мультиязчности на сайте, чтобы всегда была под рукой, перенесла к себе в блог.

Подключить мультиязычность на различных 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 для украинского.
Далее правый клик мыши по Вашему новому контексту и выбираем Редактировать. Переходим по табу Настройки контекста и кликаем по Создать новый.
Для каждого языка нам нужно добавить четыре настройки.

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, в код помещаем следующий код:

<?php
            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>[ [BabelLinks]]</ul>

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

Комментарии (2)

  1. Alex:
    09.07.2015г. в 18:40

    Замечательно работает пока не захочешь создать навигацию.
    Может есть решение проблемы с использованием Wayfinder.
    Ссылки в Wayfinder для EN, EU и т.д. работают без проблем "http://your-website-url.ru/en/...."
    а с языком по умолчанию например RU проблема генерируются ссылки "http://your-website-url.ru/ru/...." ,а должно быть "http://your-website-url.ru/..." без "ru/"
    Есть идеи?

  2. Наталья:
    10.07.2015г. в 13:44

    На самом деле, навигация для языка по умолчанию и должна формироваться по принципу http://your-website-url.ru/..." без "ru/" За это отвечает правило в контексте
    Base URL
    Ключ: base_url
    Имя: Base URL
    Запись словаря для раздела: language
    Значение: /
    Ну, в любом случае, надо смотреть на самом сайте, в чем причина. Если есть желание, можете кинуть мне на почту ссылку на сайт с доступами в админку, посмотрю в свободное время.


Оставить комментарий




Разрешённые теги: <b><i><br>Добавить новый комментарий: