Создания сайта с аналогичными разделами на разных языках

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

Разработка структуры сайта

На многоязычном сайте должна иметься главная страница, несколько разделов, соответствующих разным языкам, и общие для всех языков страницы. Рассмотрим структуру сайта на простом примере, показанном на рисунке. Псевдонимы документов указаны в верхней части описаний, а справа выводятся номера (id) документов.

Мультиязычный сайт

Главная страница сайта не входит ни в какой раздел, и на ней следует выводить информацию на разных языках со ссылкой на главные страницы каждого языка. При желании можно на главной странице вызывать сниппет, который по IP-адресу определяет страну посетителя и перенаправляет его в нужный раздел, но для простоты мы рассмотрим пример с многоязычной главной страницей. Если необходимо, чтобы какой-то язык предлагался по умолчанию, следует в конфигурации сайта установить в поле Первая страница номер главной страницы соответствующего раздела, например, 4 для русских страниц в нашем примере или 7 для английских.

Далее создается в корне несколько документов, соответствующих используемым языкам. Практически все остальные страницы сайта создаются как дочерние по отношению к ним. Общая структура разделов должна быть одинаковой, а аналогичные страницы иметь одинаковые псевдонимы, чтобы работал механизм переключения языков. Также можно создать несколько многоязычных страниц, не входящих ни в какие разделы, например страницу ошибки 404 или карту сайта в формате sitemap.xml.

Настройка конфигурации и начальные действия

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

В конфигурации MODx требуется включить использование семантических URL, а также выбрать вариант да для параметров Разрешить повторяющиеся псевдонимы и Использовать вложенные URL. Теперь адреса на сайте будут иметь вид site.ru/ru/main и site.ru/en/main. Следует помнить, что для корректной работы сайта при использовании вложенных адресов следует в заголовок страницы прописать тэг <base href="[(site_url)]" />.

В каждом родительском документе, соответствующему одному из языков, следует вставить вызов сниппета [[FirstChildRedirect]]. Теперь при вводе адреса site.ru/ru будет открываться главная страница русского раздела.

Сниппет переключения языков

Для переключения языков в нужном месте шаблонов следует добавить вызов сниппета, код которого представлен ниже:
<?php
$mainurl["ru"] = $modx->makeURL(4);
$mainurl["en"] = $modx->makeURL(7);
$baseurl=$modx->config["base_url"];
$templateId["ru"] = 2;
$templateId["en"] = 3;
$template=$modx->documentObject['template'];

function BaseReplace ($baseurl, $url) {
global $modx;
$url = str_replace(
    $modx->config['friendly_url_suffix'],
    "", $url);
if ($baseurl == "/") return substr ($url, 1);
else return str_replace ($baseurl, "", $url);
}

switch ($template) {

case $templateId["ru"]:
$output='<a href="';
$url = str_replace ("/ru/", "/en/", 
     $modx->makeURL($modx->documentIdentifier));
if (array_key_exists(BaseReplace ($baseurl,$url), 
     $modx->documentListing))
	$output.=$url;
else
	$output.=$mainurl["en"];
$output.='" title="English" >in English</a>';
break;

case $templateId["en"]:
$output='<a href="';
$url = str_replace ("/en/", "/ru/", 
     $modx->makeURL($modx->documentIdentifier));
if (array_key_exists(BaseReplace ($baseurl,$url), 
     $modx->documentListing))
	$output.=$url;
else
	$output.=$mainurl["ru"];
$output.='" title="по-русски" >по-русски</a>';
break; 
}
return $output;
?>

В первых строках сниппета необходимо прописать конкретные значения главных страниц для каждого из языков (в примере 4 и 7) и номера соответствующих шаблонов (в примере 2 и 3). Далее программа определяет, какой шаблон используется для вызванного документа, и по этому определяет использующийся язык. Для каждого языка задается формирование адреса аналогичной страницы, например, при работе со страницей ru/help формируется адрес en/help. Если такая страница существует, генерируется ссылка на нее, а если нет – генерируется ссылка на главную страницу соответствующего раздела.

Можно разработать дополнительные сниппеты, автоматизирующие те или иные функции, но и без этого, воспользовавшись данным описанием, вы сможете создать сайт, корректно работающий с несколькими языками. При этом вы без проблем сможете в будущем добавить версию сайта на новом языке, внеся лишь незначительные исправления. Описанный подход реализован веб-студией e-KAO на сайте Alfaintek. О дополнительных возможностях при создании многоязычных сайтов будет рассказано в следующих статьях, причем вы можете познакомиться с подходом к созданию многоязычного сайта без множества шаблонов.

 

Реклама

Поиск на сайте

Введите ваш запрос для начала поиска.