Привет всем!
На мультиязычном сайте меню должно быть слева в столбик и внизу в строку. Слева в столбик сделал обычное меню. Одно. Для каждого пункта указал язык - и все в порядке. На русском показываются только русские пункты, на английском только английские. Далее, делаю это меню. в нижнюю строку, в праймари линкс. В настройках меню указываю источником для праймари линксов мое меню. В нем ссылки на статичные страницы (Page) отображаются корректно - в соответствии с языком. А вот русская и английская ссылки на модуль contact отображаются обе вместе. И хоть ты тресни, ничего с этим поделать не получается. Создание собственного набора пунктов для праймари линкс и создание синонимов для contact не помогли.
Как можно решить эту проблему?
ЗЫЖ и еще вопрос: каким образом можно перевести заголовок меню? Не хочется делать два меню, каждое для своего языка. Пробовал искать имя переменной для multilingual variables но это не помогло. Возможно, не нашел?
Комментарии
Посмотри вот это: 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), просто пришлось разобраться со структурой дерева меню.
Столкнулся с этой же проблемой для темы 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;
}
}
?>
Собственно, вот.