Синхронизация пунктов меню при переводе страниц

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

Аватар пользователя roman-yrv roman-yrv 11 октября 2012 в 13:03

Добрый день.

Такая ситуация.
Допустим, на сайте для некоторых типов контента включена возможность перевода страниц.

Вводится страница на русском языке, там же при вводе задается пункт меню для этой страницы.
Затем осуществляется переход по пункту меню "Перевести", там вводится английский контент - перевод этой страницы.
И там тоже можно задать пункт меню уже для этой английской страницы.

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

Или проще на этом не заморачиваться, а просто иметь на этот случай два меню - для русских страниц ("Главное меню") и для английских ("Main Menu") и к ним уже привязывать эти пункты ?

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

Комментарии

Аватар пользователя oledftasd oledftasd 29 апреля 2013 в 10:28

"roman-yrv" wrote:
Как сделать, чтобы пункт меню на странице с русским языком синхронизировался с пунктом меню на странице с английский языком ?

Здравствуйте, вам удалось решить эту проблему?

Аватар пользователя roman-yrv roman-yrv 29 апреля 2013 в 11:27

В принципе, удалось.

Сейчас поясню, как.

Перевод я настраивал через модули Entity Translation + Title.

В этом случае при переводе не создается новая нода на другом языке, а создаются переводы для отдельных полей, а для перевода заголовка как раз и служит модуль Title - с его помощью у заголовка title появляются свойства CCK-поля.

Пункт меню в этом случае также физически один, а перевод его делается с помощью локализации (переводы пункта хранятся в таблицах locales_source и locales_target).

Но в случае локализации элемента меню всплыла одна неприятная вещь. А именно, когда пытаешься редактировать нерусскую версию страницы, то функция _t() некорректно получает локальное название пункта меню. То есть, на английской версии страницы все равно будет отображаться русскоязычное название меню и при сохранении оно затрёт англоязычное название.

Для решения этой проблемы я написал одну вспомогательную функцию, заменяющую в данном случае родную функцию _t() и перехватил один хук. Всё это - в моем служебном модуле yrv_util.
Код этого - ниже.

/*
 * Получение перевода фразы на указанный язык
 */

function yrv_t($original_text, $context, $lang)
{
  $strSQL='select lt.translation '.
          'from {locales_source} ls, {locales_target} lt  '.
          'where ls.lid=lt.lid '.
          'and ls.source=:original_text '.
          'and ls.context=:context '.
          'and lt.language=:language ';
  $result=db_query($strSQL,array(':original_text'=>$original_text, ':language' => $lang, ':context' => $context));
  foreach ($result as $record) {
    return $record->translation;
  };
  return '';

}

function yrv_util_form_node_form_alter(&$form, &$form_state, $form_id)
{
  if (isset($form['title_field']))
  {
   
// Язык ноды получаю из языка поля title_field, так как не разобрался, как в данном случае его получить более правильно.

    $lang=$form['title_field']['#language'];

    if ($lang!='ru')
    {
      // Если данная редакция ноды - не русский язык, то название элемента меню брать из локализации.
      $mlid=$form['menu']['link']['mlid']['#value'];
      $cur_menu_title=$form['menu']['link']['link_title']['#default_value'];

      // C помощью своей функции SQL-запросом получаю англоязычное название элемента меню.
      $form['menu']['link']['link_title']['#default_value']=yrv_t($cur_menu_title, 'item:'.$mlid.':title', $lang);
    }
  }
}