Переключатель языков - как сделать?

Barsik314
На сайте с 23.04.2011
Offline
5
7015

Ребят, подскажите пожалуйста, как можно сделать переключатель языков на сайте?

Ситуация такая:

Абсолютно любая статья на сайте имеет своё зеркало на другом языке.

Разница всегда выглядит одинаково, например:

site.ru/razdel-bla-bla/314-nazvanie-statyi.html

site.ru/rus/razdel-bla-bla/314-nazvanie-statyi.html

Надо их перелинковать. Статичный переключатель в шапке чтобы. ДЛЕ. Не знаете - как?

Comandante Fidel
На сайте с 08.06.2011
Offline
37
#1

Учитывая, что в DLE используется бестолковый механизм ЧПУ, в котором каждое правило прописано в .htaccess, вам придётся сперва переписать правила, добавив переменную для языка и передавая её скрипту, скажем, GET-параметром "_language" (можно поиграться с директивой RewriteBase).

Далее заходим в /engine/inc/init.php.

В самом начале скрипта присутствует переменная, отвечающая за выбор языка.

Собственно, её вы можете перезаписывать, исходя из значения GET-параметра.

А вот, к примеру, функция для переключения языков в ссылках:


<?php

function get_language_link ($link, $language)
{

$allowed_languages = array('rus', 'eng', 'ukr');

if(strlen($link)==0) return false;

/* Добавим слеш в начало адреса, если его нет. */
if(substr($link, 0, 1)=='/')
{
$link = substr($link, 1);
}

/* Получим первый сегмент ссылки. */
$first_link_element = current(explode('/',$link));

/* Проверим, не содержит ли уже первый сегмент в себе язык. */
if (in_array($first_link_element, $allowed_languages))
{
/* Если содержит, выбросим его из ссылки. */
$link = substr($link, strlen($first_link_element)+1);
}

/* Устанавливаем новый язык, переданный в функцию. */
$result = '/'.$language.'/'.$link;
return $result;

}

/* Дальнейший код выводит пример работы функции. */

function check_language_switcher ($current_link, $current_language)
{
print ('Было: '.$current_link.' , переключаем на язык '.$current_language.'.'); print ("\r\n");
print ('Стало: '.get_language_link ($current_link, $current_language));
print ("\r\n\r\n");
}

header("Content-Type: text/plain");

check_language_switcher('/url/test/first.html', 'rus');
check_language_switcher('/rus/demo/vision.html', 'eng');
check_language_switcher('rus/former/sampo.html', 'ukr');
check_language_switcher('catalog/deformator.html', 'rus');

?>

Функция устанавливает для относительной ссылки $link язык $language, при этом она сама определяет, содержит ли ссылка уже параметр языка. Доступные языки необходимо указывать в массиве $allowed_languages, создаваемом в начале функции.

Запустите код и увидите его работу на четырёх примерах. Простите за топорность кода и функции, ночью думается туговато :).

Barsik314
На сайте с 23.04.2011
Offline
5
#2

Не, всё банальнее: фишка в том, что адреса абсолютно идентичны, до последней буковки. Кроме "rus/" после доменного имени. Всегда без исключения. ЧПУ для обоих адресов создается по правилу основного языка системы. По сути это два абсолютно одинаковых сайта на разных движках с общей базой и полностью одинаковым контентом на одном и том же языке (кроме комментариев, комментарии хранятся и выводятся по-раздельности). В одном из движков основные поля скрыты и подменяются дополнительными полями с текстом на другом языке. В другом движке - наоборот, дополнительные поля не выводятся. Но все они есть и там, и там. ("Если ты не видишь сурка, это не значит, что его там нет"). А rus/ - это не раздел (категория) на сайте, это реальная папка в первом движке со вторым движком. )))

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий