Меню Primary Links в мультиязычном сайте

Главные вкладки

Аватар пользователя sitestyler.net sitestyler.net 9 августа 2008 в 12:33

Привет всем!
На мультиязычном сайте меню должно быть слева в столбик и внизу в строку. Слева в столбик сделал обычное меню. Одно. Для каждого пункта указал язык - и все в порядке. На русском показываются только русские пункты, на английском только английские. Далее, делаю это меню. в нижнюю строку, в праймари линкс. В настройках меню указываю источником для праймари линксов мое меню. В нем ссылки на статичные страницы (Page) отображаются корректно - в соответствии с языком. А вот русская и английская ссылки на модуль contact отображаются обе вместе. И хоть ты тресни, ничего с этим поделать не получается. Создание собственного набора пунктов для праймари линкс и создание синонимов для contact не помогли.
Как можно решить эту проблему?

ЗЫЖ и еще вопрос: каким образом можно перевести заголовок меню? Не хочется делать два меню, каждое для своего языка. Пробовал искать имя переменной для multilingual variables но это не помогло. Возможно, не нашел?

Комментарии

Аватар пользователя Dzmitry Paulenka Dzmitry Paulenka 29 ноября 2008 в 2:16

Посмотри вот это: http://drupal.org/node/313302
И вот это: http://groups.drupal.org/node/13092 (последние комментарии)
Думаю, как раз то, что нужно.

Дело в том что многие темы (в том числе и Garland) берут меню в Primary links и Secondary links независимо от языка.
Чтобы это исправить я изменял шаблоны. Можно еще добавить зависимые от языка переменные в settings.php файл. Но с зависимыми от языка переменными не пробовал.

1) Для темы Garland было достаточно добавить вот этот код в template.php файл в функцию phptemplate_preprocess_page(&$vars) :
<?php
$current_language = $vars['language']->language ;
foreach ( array('primary_links', 'secondary_links') as $menu_name ) {
if (! empty($vars[$menu_name])) {
foreach ( $vars[$menu_name] as $menu_key => $menu_item ) {
if ( $menu_item['langcode'] != $current_language && ! empty($menu_item['langcode']) ) {
unset($vars[$menu_name][$menu_key]) ;
}
}
}
}
?>
Тут отбрасываются все не совпадающие с текущим языком менюшки.

2) Для темы Acquia Marina этого недостаточно, потому что эта тема использует функцию из Drupal API. Пришлось переопределить функцию прямо в теме.
Я заменил следующую строчку кода:
<?php
print menu_tree($menu_name = 'primary-links');
?>
Вот на такой код:
<?php
// Dz. 28.11.2008 Overloaded "menu_tree" function to support multilingual primary links
$menu_name = 'primary-links';

static $menu_output = array();

if (!isset($menu_output[$menu_name])) {
$tree = menu_tree_page_data($menu_name);

// Leave only current language menus and language neutral menus
$current_language = $language->language;
if ( ! empty($tree) ) {
foreach ( $tree as $menu_key => $menu_link ) {
if ( $menu_link['link']['options']['langcode'] != $current_language &&
! empty( $menu_link['link']['options']['langcode'] ) ) {
unset( $tree[$menu_key] ) ;
}
}
}

$menu_output[$menu_name] = menu_tree_output($tree);
}
print_r ($menu_output[$menu_name]);
?>
В общем, это то же самое, что и в пункте (1), просто пришлось разобраться со структурой дерева меню.

Аватар пользователя SergO SergO 18 января 2010 в 19:36

Столкнулся с этой же проблемой для темы Pushbutton, где исходные данные таковы: меню основного языка (английского)- это обычный primary-links, остальные менюшки созданы под именами menu-primary-links-de; menu-primary-links-fr; и.т.д., всего 10 языков ;)).
Сделал так для темы Garland, Pushbutton и им подобных:
в начале файла page.tpl.php вставил следующий кусок:

<?php
/** user-definition for primary-menu **/
if ($language->language != 'en') {
    
$user_primary_links menu_navigation_links('menu-primary-links-'.$language->language$level 0);
    if (
$user_primary_links) {
        
$primary_links $user_primary_links;
    }
}
?>

Потом по воле судьбы тема изменилась на Nitobe.
Здесь уже в template.php в теле функции function phptemplate_preprocess_page(&$vars)
после строчки
<?php $vars['primary_links']   = menu_primary_links(); ?>
вставил тот же, но немного адаптированный блок:

<?php
/** user-definition for primary-menu **/
if ($vars['language']->language != 'en') {
    
$user_primary_links menu_navigation_links('menu-primary-links-'.$vars['language']->language$level 0);
    if (
$user_primary_links) {
        
$vars['primary_links'] = $user_primary_links;
    }
}
?>

Собственно, вот.