При создании очередного мультиязычного сайта возникла задача, не используя стандартный блок переключения языков, добавить переключатель языков.
На первый взгляд ничего сложного.
Но сделав несколько попыток, столкнулся с задачей поддержки страниц созданных через views, выборок анонсов на страницах терминов таксономии и переводов, привязанных к нодам модулем «Content translation». Так же полезным, оказалось, задуматься о том, что у вышеупомянутых страниц (node) и терминов таксономии существуют алиасы.
К моему удивлению Google не дал ожидаемых результатов, а советов по перепиливанию ядра drupal я категорически не воспринимаю (для этого существует API и немного фантазии).
Скурив пару чашку кофе и выпив не одну сигарету (юмор), задачу решил и готов поделится решением с теми, кто еще успеет в своей жизни наступить на подобные грабли.
Итак поехали:
Для реализации нам понадобится два файла нашей темы (page.tpl.php и template.php).
В файле template.php создаем функцию:
function НАЗВАНИЕ_ТЕМЫ_lang_front_lang($foo){
switch($foo)
{
case 'uk':
$output = '/ua';
break;
case 'ru':
$output = '/';
break;
case 'en':
$output = '/en';
break;
default:
$output = '/';
break;
}
return $output;
}
function НАЗВАНИЕ_ТЕМЫ_link_lang($foo, $path, $path_alt, $nid){
if(strlen($path)){
$path = 'node/'.$nid;
$path_lang = translation_path_get_translations($path);
$path = array(
'ru' => drupal_get_path_alias($path_lang[ru], $path_language = 'ru'),
'uk' => drupal_get_path_alias($path_lang[uk], $path_language = 'uk'),
'en' => drupal_get_path_alias($path_lang[en], $path_language = 'en'),
);
} elseif(strlen($path_alt[2])) {
$path_tax = $path_alt[0].'/'.$path_alt[1].'/'.$path_alt[2];
}elseif(strlen($path_alt[1])) {
$path_tax = $path_alt[0].'/'.$path_alt[1];
} elseif(strlen($path_alt[0])) {
$path_tax = $path_alt[0];
} else {
$path_tax = '';
}
if(!strlen($path) || !strlen($nid)){
} else {
if(!strlen($path[uk])){
$path[uk] = 'not_translated_uk.html';
}
if(!strlen($path[ru])){
$path[ru] = 'not_translated_ru.html';
}
if(!strlen($path[en])){
$path[en] = 'not_translated_en.html';
}
}
$output = '<li><a href="/ua/'.$path[uk].$path_tax.'">ua</a></li>
<li><a href="/'.$path[ru].$path_tax.'">ru</a></li>
<li><a href="/en/'.$path[en].$path_tax.'">eng</a></li>';
return $output;
}
Далее в файле page.tpl.php в том месте где нам нужно вывести наш переключатель мы добавляем:
<ul class=" img_link_list lang_li">
<?php
if($is_front){
$path_alt = '';
} else {
$path_alt = array(arg(0), arg(1), arg(2));
}
print НАЗВАНИЕ_ТЕМЫ_link_lang($language->language, $node->path, $path_alt, $node->nid);
?>
</ul>
и в том месте где нужно вывести лого со ссылкой на главную добавляем:
<div id="logo"><a href="<?php print НАЗВАНИЕ_ТЕМЫ_lang_front_lang($language->language); ?>"><img src="<?php echo $base_path . $directory; ?>/images/logo.jpg" width="140" /></a></div>
Основное волшебство на этом заканчивается.
Пути будут формироваться с учетом страниц на которых мы находимся независимо от того нода ли это или страница термина таксономии.
Остается самое малое, заставить страницы таксономии фильтровать материал, и выдавать нам анонсы имеющие тот язык в который мы переключены.
Для этого существует несколько способов. Опишу один из самых несложных (для возможности реализовать данное решение малопосвященными).
Поехали:
Мы будем использовать модуль «Views» и один файл нашей темы (node.tpl.php).
Переходим на страницу списка представлений «Views» (/admin/build/views) и включяем входящее в ядро представление, если еще не включено, с именем «taxonomy_term (default)».
Проследим чтобы вывод материала в виде «страница (page)» был настроен на вывод анонсов материала, а не полей.
После чего идем в наш файл node.tpl.php и правим то, что находится между
<?php if (!$page): ?>
и
<?php endif; ?>
В итоге у нас должно получится примерно так:
<div id="node-<?php print $node->nid; ?>" class="node<?php if ($sticky) { print ' sticky'; } ?><?php
if (!$status) { print ' node-unpublished'; } ?> clear-block">
<?php print $picture ?>
<?php if (!$page): ?>
<?php global $language; ?>
<?php if ($language->language == $node->language): ?>
<div class="items_page">
<h3><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h3>
<?php print $content; ?>
</div>
<?php endif; ?>
<?php endif; ?>
<?php if ($page): ?>
<div class="meta">
<?php if ($submitted): ?>
<span class="submitted"><?php print $submitted ?></span>
<?php endif; ?>
</div>
<div class="content">
<?php print $content ?>
</div>
<?php print $links; ?>
<?php endif; ?>
</div>
На этом наше волшебсто заканчивается успехом.
Если мы сделали все правильно, то просто наслаждаемся полученным результатом и продолжаем пить кофе
с гордо поднятой головой, так как над этим регулярно бъются многие разработчики столкнувшиеся с
мультиязычностью в Drupal.
УПС:
Не забываем после всяких изменений в файлах темы пересохранить список тем (/admin/build/themes), тем
самым обновив кеш тем, ну и конечно просто почистить общий кеш (/admin/settings/performance).
Вы смогли! А значит вы молодец!
Автор: ZnaemNET