Drupal и мультиязычность, как программно добавить переключатель языков

в 20:06, , рубрики: drupal, drupal 6, мультиязычность, Песочница, метки: ,

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

На первый взгляд ничего сложного.
Но сделав несколько попыток, столкнулся с задачей поддержки страниц созданных через 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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js