среда, 20 января 2016 г.

MODX: многоязычный сайт с помощью расширения Babel

Из-за глобализации и вытекающего из неё желания клиентов иметь контент, доступный для понимания пользователей, говорящих на иностранных языках, всё чаще стоит задача сделать сайт, поддерживающий несколько языков. Например, русский, украинский и английский. В итоге надо, чтобы основная версия сайта на русском языке открывалась по адресу http://my-site.com, а версии на украинском и английском соответственно по ссылкам http://my-site.com/ua/ и http://my-site.com/en/.

MODX позволяет решить этот не такой уж и легкий вопрос. Существует несколько расширений, которые могут нам помочь: LinguaMigxMultiLang и Babel. Вот о последнем из них - Babel - и пойдет речь далее.

Перед тем, как приступать к установке и настройке Babel, необходимо убедиться, что у вас корректно установлена MODX и включены seo-friendly ссылки. Если всё ок, то далее надо выполнить следующие 5 шагов:

1) Настройка файла .htaccess. Здесь нужно проверить 3 момента. Во-первых, должен быть включен модуль rewrite:

RewriteEngine On
RewriteBase /

Во-вторых, надо разобраться с перенаправлением с версии с www в адресе на версию без оного или наоборот. Я предпочитаю версию без www (так называемый "naked" домен) и далее при настройке буду везде использовать ссылку вида http://my-site.com. Для этого надо раскомментировать строку №16 уже имеющегося в MODX файла .htaccess:

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^my-site\.com [NC]
RewriteRule (.*) http://my-site.com/$1 [R=301,L]

В-третьих, в строке №37 (# The Friendly URLs) теперь надо настроить перенаправление ссылок, содержащих /ru/, /ua/ и /en/, на файлы и папки в корне, так как в реальности тех "языковых" папок на сервере не будет:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(ru|en|ua)/favicon.ico$ favicon.ico [L,QSA]

# /ua/assets* and /en/assets* to /assets*
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(ru|en|ua)/assets(.*)$ assets$2 [L,QSA]

# /en/* and /ua/* to index.php and set the cultureKey url-parameter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(ru|en|ua)?/?(.*)$ index.php?cultureKey=$1&q=$2 [L,QSA]

2) Следующий шаг - это создать контексты для каждого языка. С их помощью будет осуществляться переключение, и это то место, где для каждой версии сайта задаются необходимые параметры - код языка, ссылки и id главной страницы. Использовать надо те параметры, что вводились в .htaccess в прошлом пункте. То есть для английского языка в настройках контекста надо будет вводить "en", а не "eng" или "english". 

Уже имеющийся контекст по умолчанию web будет использоваться для русского языка. Кликаем правой кнопкой мыши, выбираем "Update Context", выбираем вкладку "Context Settings" и там создаем 4 новых параметра:

Base URL
  1. Key: base_url
  2. Name: Base URL
  3. Area Lexicon Entry: language
  4. Value: /
Culture key
  1. Key: cultureKey
  2. Name: Culture key
  3. Area Lexicon Entry: language
  4. Value: ru
Site start
  1. Key: site_start
  2. Name: Site start
  3. Area Lexicon Entry: language
  4. Value: 1 (это id стартовой страницы)
Site URL
  1. Key: site_url
  2. Name: Site URL
  3. Area Lexicon Entry: language
  4. Value: http://my-site.com/
Сохраняемся и далее возвращаемся к списку контекстов и создаем еще 2 контекста с именами "en" и "ua". Добавляем там в "Context Settings" указанные выше параметры со следующими значениями:

Base URL
  1. Key: base_url
  2. Name: Base URL
  3. Area Lexicon Entry: language
  4. Value: /en/ (для en) или /ua/ (для ua)
Culture key 
  1. Key: cultureKey
  2. Name: Culture key
  3. Area Lexicon Entry: language
  4. Value: en (для en) или ua (для ua)
Site start
  1. Key: site_start
  2. Name: Site start
  3. Area Lexicon Entry: language
  4. Value: 2 (это id стартовой страницы для en) или 3 (для ua) - в вашем случае могут быть совершенно другие, вы создаете их сами в дереве документов.
Site URL 
  1. Key: site_url
  2. Name: Site URL
  3. Area Lexicon Entry: language
  4. Value: http://my-site.com/en/ (для en) или http://my-site.com/ua/ (для ua)
В конце данного этапа в дереве документов MODX у вас должны появиться 3 папки (для каждого контекста), где вы создаете по главной странице, чьи id вы теперь можете внести в настройках (site_start) соответствующего контекста, если не сделали этого ранее.

3) Далее нам нужно создать плагин с названием "gateway", для переключения между нашими контекстами, то есть версиями сайта. Во вкладке "Elements" создаем новый плагин с указанным названием (оно должно быть в нижнем регистре) и помещаем туда следующий скрипт:

Во вкладке "System events" находим событие OnHandleRequest и активируем его для нашего плагина. Кстати, обратите внимание, что если у вас другая комбинация языков, например, fr, en и ru, то не забывайте внести изменения в код выше. Сохраняем.

4) Установка Babel. Да, до этого это всё была подготовительная работа, а собственно само расширение устанавливается только сейчас. При установке будет кнопка "Setup options", где, если вы все сделали верно до этого, в поле "Context Keys (comma-separated)" скорее всего будут перечислены имеющиеся контексты - web, en, ua. Если их там нет, то добавьте вручную. Больше ничего не меняем и устанавливаем расширение.

5) Почти готово! Теперь нам нужен сниппет для вывода языкового меню на нашем сайта. Babel по умолчанию предлагает свой вариант: в нужном шаблоне вставьте следующий код



Всё! По идее всё должно работать и мы только что настроили мультиязыковой сайт на MODX с помощью расширения Babel. Данный материал является вольным переводом статьи Menno Pietersen из его блога.

PS: Есть еще пара моментов, с которыми пришлось столкнуться. Во-первых, в расширении Babel не было словарика для украинского языка, а потому в языковом меню выводились откуда-то из недр движка "English" и "Russian". Это решается созданием в папке /core/components/babel/lexicon/ папки с именем /ua/, куда можно скопировать файлы из любой соседней папки (например, /ru/), а затем через админку назначить нужные значения, которые будут выводится в контексте "ua".

Также стоит отметить, хотя это может показаться очевидным, что ссылки в языковом меню появятся только после того, как вы свяжете все соответствующие документы в дереве документов MODX между собой. Или, как вариант, после создания документа в основной версии сайта можно с помощью меню Babel скопировать его в остальные версии, добавив соответствующий контент и настройки.

1 комментарий: