Разделы

MODx Revolution, мануал: Создание мультиязычных сайтов.

Создание мультиязычных сайтов на 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 — Готово!

Все готово! Надеюсь что эта инструкция поможет Вам!

Жду Ваши замечания в комментариях.
  • +10
  • 16 января 2012, 16:41
  • createit

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

RSS свернуть / развернуть
+3
всё так сложно, я уже много раз описывал такую структуру многоязычности. В принципе тоже самое, только
1) Я не трогаю файл .htaccess вообще, по дефолу оставляю.
2) Я создаю папки к вашему примеру nl и de, копирую туда файлы .gitignore, .htaccess, config.core.php, index.php, favicon.ico.
В файле index.php меняем контекст на свой. т.е. если папка nl то на контекст Nederlands
А дальще тоже самое, Бабел, плагин свич…
avatar

valikras

  • 16 января 2012, 18:10
+1
Ну да, работать будет =)
Минусы Вашего решения:
1. дублирование кода
2. при обновлении MODx надо контролировать файлы index.php
Плюсы:
1. Выглядит проще

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

createit

  • 16 января 2012, 18:32
0
1) дублирование кода — один файлик с кодом — панты
2) при обновлении MODx надо контролировать файлы index.php. Не нужно, зачем, мы файл не трогаем основной index.php.
Плюсы
1. Выглядит проще
2) Мы не трогаем файл .htaccess, так как часто проблемы возникают, особенно у неопытных,. + сейчас много серверов не на апаче, без потдержки .htaccess.

Честно, хотел давно написать, даже просили. Но с помощью вашего топика у людей теперь есть аж два решения. Какой им выбирать, они уже сами решат!

Держите +
avatar

valikras

  • 16 января 2012, 19:00
+3
странный народ, а за что минус человеку ставили????
Ребята, давайте прекратим в минусовки играть. Пользователь @createit старался для Вас!
Просто в следующий раз вы увидите пустой бланк.
Давайте ценить труд других пользователей!!!!!
avatar

valikras

  • 16 января 2012, 19:03
0
Спасибо!
По index.php. А если он обновится в MODx? Веть скопированные файлы так же хорошо бы обновить до актуальной версии.
avatar

createit

  • 16 января 2012, 19:03
0
ну, логично… если поменяется (хотя, он не очень и меняется, но всё возможно), то да — нужно поменять и в в папках контестов.
А вообще, я стараюсь не обновлять Модекс, потому-что у меня много кода (почти весь) на апи, и один раз так напоролся…
Сделал, работает, устраивает — Забылся! только потдерживать.
avatar

valikras

  • 16 января 2012, 19:07
0
а новые ФИЧИ? а, боже упаси, обнаруженные проблемы безопасности?
Я пока не готов пожертвовать этим!
Поэтому обновляю… хотя мой опыт MODx — всего полгода.
avatar

createit

  • 16 января 2012, 19:10
+2
Новые фичи на завершенных проектах часто очень ненужны

А вот безопасность подтягивать надо
avatar

Dmi3y

  • 16 января 2012, 19:20
0
«Аттдуши. Чётко. Могёте. Пасаны ваще ребята!»
Короче, спасибо, пригодилось.
avatar

SurRealistik

  • 18 января 2012, 20:20
0
Родилась мысль, запишу сюда, чтобы не забыть.

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

Несколько табов в компоненте (Ext.Panel), по одной на язык, и в каждой — перечень всех ресурсов, с полями id, pagetitle, longtitle, introtext, description и content.
Эти поля будут храниться в отдельно таблице компонента. Поля типа publishedon и подобные мы не берем — они в modResource.

В компоненте редактируем страницы, основной язык остается в дереве, а допольнительные — в таблице компонента.Потом пишем плагин, который в зависимости от переменной в сессии при загрузке страницы будет грузить контент и другие поля для нужного языка.

Дальше на эту идею можно накручивать навороты. Например, если нет перевода на немецкий — выводить английский, или оставлять русский. Плюс добавить кэширование, еще что-то.

Ну и потом нужно будет заставить работать по этой схеме сниппеты типа getResources и Wayfinder.
Это сделаем путем подстановки в чанки не [[+pagetitle]], а [[+id:getlang=`pagetitle`]] и специальный сниппет будет добывать заголовок на нужном языке.

Такая схема мне видится гораздо более удобной и понятной. Возможно, когда то реализую, если никто раньше не сделает.
avatar

bezumkin

  • 19 января 2012, 21:28
0
Как сделать вывод даты на разных языках?
avatar

kochenov

  • 29 января 2012, 16:44
+2
Напишите сниппет, типа langDate, он пускай получает значение настройки Culture key и через switch решает данную проблему.
avatar

createit

  • 29 января 2012, 16:51
0
Я только начал знакомится с системой, подробнее можно пожалуйста.
Буду очень признателен…
avatar

kochenov

  • 29 января 2012, 16:56
0
И сразу мультиязычный сайт делаете?
По теме — прочитайте про:
— сниппеты в MODx
— setlocale и date в php
avatar

createit

  • 29 января 2012, 17:23
0
Спасибо! Сообразил. Я надеялся что встроенное средство есть для вывода даты в зависимости от локали определённого контекста. Спасибо за перевод статьи.
avatar

kochenov

  • 29 января 2012, 17:50
0
Ну вообще в настройках MODx вроде есть такая вещь, как локаль сайта. Поковыряйте, в 2,2 наверное и появилась, а может и раньше.

Получается, если для каждого из контекстов эту настроку переопределить — может и заработает… а помет в плагин переключения контекстов (в статье который описан) гадо будет добавить пару строк, делающих переключение локали… К сожалению не знаю, не работал :)
avatar

createit

  • 29 января 2012, 17:54
0
помет = может )))) мимо кнопок промазал, а гадо — это надо!
avatar

createit

  • 29 января 2012, 17:55
0
Попробовал на локалхосте раскрутить на последней 2.2 версии (в подпапке установлен modx)
url вида: localhost/modx — русский язык
localhost/modx/en — английский
— 2 языка, русский по умолчанию, создал контексты, определил свойства, поправил .htaccess, поставил babel. вроде всё как и нужно, но работает только русский язык, для английского получаю 404.
Куда копать?
в логе апача:
127.0.0.1 - - [30/Jan/2012:13:50:24 +0400] "GET /modx/en/homepage.html HTTP/1.1" 404 146

avatar

digdream

  • 30 января 2012, 15:55
0
на локалхосте
да ещё и в
подпапке установлен modx
— а, что проблема сделать папку и прямой адресс для сайта? зачем вы себе усложняете работу? или у вас на хостинге тоже будет такая структура?
avatar

valikras

  • 30 января 2012, 15:59
0
нет, просто влом было виртуальный хост делать. на сайте всё будет от корня
avatar

digdream

  • 30 января 2012, 16:07
0
не понял конечно, если на Данвере, то там вроде ничего делать не нужно, просто создать папку и перегрузить Данвер (на сколько я помню), если на Хампе — то да, нужно прописывать (тоже точно не помню)
avatar

valikras

  • 30 января 2012, 16:22
0
Разобрался сам. в плагине вместо en написал English сначала, а контекст назывался en, исправил, всё заработало
avatar

digdream

  • 30 января 2012, 16:05
0
Ну вот и ладненько =)
Теперь есть подтверждение от участников, что это решение рабочее)))
avatar

createit

  • 30 января 2012, 16:14
0
Шаг №2 – Создание контекстов
у меня не совпадают поля
Контекст: Английский
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
Что где писать??
avatar

akselei

  • 15 февраля 2012, 21:58
0
короче… я нашел решение проблемы, на оригинальной статье… Спасибо за перевод, но он не точный…
avatar

akselei

  • 15 февраля 2012, 22:38
0
Поправьте меня пожалуйста, я внесу изменения.
avatar

createit

  • 16 февраля 2012, 11:06
0
Не работает это решение… куча ошибок 404 выдает на все страницы… рою пока интернет.
что в .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…
avatar

ziexmedia

  • 21 февраля 2012, 17:42
0
Проверьте еще раз. У людей, попробовавших до вас, работает.
Возможно где то ошиблись или что то забыли.
avatar

createit

  • 21 февраля 2012, 17:44
0
у меня работает во многих проектах, единственноею. я не правлю файл .htaccess (по дефолу).
Так-что не это решение не работает, а у вас что-то неправильно настроенно… или не донастраивали…
В шаблоне в head добавлен у вас base?
avatar

valikras

  • 21 февраля 2012, 17:56
0
Да, пробовал создавать без изменений .htaccess просто папку в корне /en, но тогда выдает ошибку
Error 503
Site temporarily unavailable

при обращении к ней… ((
проблема может из-за того, что у меня поддомен вида sub.domen.ru?
avatar

ziexmedia

  • 21 февраля 2012, 18:14
0
поддомен вида sub.domen.ru
— нет, не в этом проблема… Можете по аське сомной связаться, я посмотрю ваши настройки.
avatar

valikras

  • 21 февраля 2012, 18:41

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.