Как стать автором
Обновить

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

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

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

Вы смогли! А значит вы молодец!
Теги:
Хабы:
Всего голосов 8: ↑4 и ↓40
Комментарии14

Публикации