Изменения в модуле locale

Аватар пользователя gor gor 13 июня 2008 в 18:05

По просьбе пользователя compawa, я сделал изменения для модуля locale (Drupal6). Изменения заменяют блок ссылок на языки, на select форму.
При этом, если в броузере отключен js, то видна обычная форма с кнопкой, если же js включен - то виден только select в котором выбирается язык. После выбора языка (при включенном js) происходит обновление страницы на выбранный язык.
- путь сохраняется, меняется только язык.
- по умолчанию выбран текуший язык, что сейчас активен.

Теперь сам код.
Приатаченный файл, должен быть сохранен по пути modules/locale/locale.js
Файл musules/locale/locale.module изменяется следующим образом:
функция locale_block целиком удаляется, и заменяется на

function locale_block($op = 'list', $delta = 0) {
  if ($op == 'list') {
    $block[0]['info'] = t('Language switcher');
    // Not worth caching.
    $block[0]['cache'] = BLOCK_NO_CACHE;
    return $block;
  }

  // Only show if we have at least two languages and language dependent
  // web addresses, so we can actually link to other language versions.
  elseif ($op == 'view' && variable_get('language_count', 1) > 1 && variable_get('language_negotiation', LANGUAGE_NEGOTIATION_NONE) != LANGUAGE_NEGOTIATION_NONE) {
    $languages = language_list('enabled');
    foreach ($languages[1] as $language) {
      $links[$language->language] = array(
        'href'       => $_GET['q'],
        'title'      => $language->native,
        'language'   => $language,
        'attributes' => array('class' => 'language-link'),
      );
    }

    drupal_alter('translation_link', $links, $_GET['q']);
    $options=array();
    foreach ($links as $langcode => $link) {
      $options[$langcode]=$link['title'];
    }

    $block['subject'] = t('Languages');
    $block['content'] = drupal_get_form('locale_block_form', $options);
    return $block;
  }
}

Также , в этот файл еще ниже дописываются следующие 2 функции:

function locale_block_form(&$form_state,$options){
  drupal_add_js(drupal_get_path('module', 'locale') .'/locale.js', 'module');
  global $language;
  $form['language'] = array (
    '#type'    => 'select',
    '#options' => $options,
    '#default_value' => $language->language,
  );
  $form['submit_language'] = array(
    '#type'  => 'submit',
    '#value' => t('Change')
  );

  return $form;
}
function locale_block_form_submit($form, &$form_state) {
  $languages = language_list('enabled');

  $links = array();
  foreach ($languages[1] as $language) {
    $links[$language->language] = array(
        'href'       => $_GET['q'],
        'language'   => $language,
    );
  }
  drupal_alter('translation_link', $links, $_GET['q']);

  $langcode=$form_state['values']['language'];
  if (isset($links[$langcode])) {
      $links[$langcode]['absolute']=true;
      $goto=url($links[$langcode]['href'] ,$links[$langcode]);
  }
  $form_state['redirect'] = $goto;
}

Приятного использования, и благодарности за идею и спонсирование пользователю compawa

ВложениеРазмер
Иконка простого текстового файла locale.js_.txt234 байта
Файл locale2.patch1.62 КБ

Комментарии

Аватар пользователя gor gor 13 июня 2008 в 18:49

а смысл? Имхо это должно быть включено в функционал самого модуля. Запрос с патчем я послал в d.o

Аватар пользователя PanDa777 PanDa777 13 июня 2008 в 21:59

Может, кому-то больше нравится вариант с ссылками? А так просто альтернативный блок... Тем более, что весь код уже есть.

Аватар пользователя compawa compawa 14 июня 2008 в 2:57

PanDa777 wrote:
Может, кому-то больше нравится вариант с ссылками?

Да, если языков 2-3, а если значительно больше? /admin/settings/language/add, хотя бы половину языков из этого списка если добавить, то языковой блок займет всю колонку. Вряд ли найдутся те кому это будет нравится больше селектора...

Аватар пользователя PanDa777 PanDa777 14 июня 2008 в 17:07

Я всего лишь предлагал оформить такой блок в виде отдельного модуля, а не правки ядра. Собственно, так, как во вложении.

Аватар пользователя compawa compawa 14 июня 2008 в 17:34

ммм.., а какие еще дополнительные действия надо произвести, чтобы модуль заработал? Простое его включение через админку у меня лично эффекта не возымело, и упоминания о модуле в других местах я не нашел. Не плохо было бы в архив файл read.me добавить. Smile

Аватар пользователя PanDa777 PanDa777 14 июня 2008 в 19:16

Не знаю: у меня в списке блоков новый блок появился... Честное слово... Alternative language switcher называется... Aka "Альтернативный переключатель языка"

Аватар пользователя compawa compawa 14 июня 2008 в 19:35

PanDa777 wrote:
Не знаю: у меня в списке блоков новый блок появился...

Теперь и я его нашел Smile
Ну что сказать? Да, так действительно много лучше... Спасибо!

Аватар пользователя cka3o4h1k cka3o4h1k 29 августа 2008 в 6:48

[b]PanDa777[/b]
Спасибо большое за модуль Smile
Вот только не пойму как его в теме кустомизировать... Как его вмонтировать в дивы в темплейте темы?
Какие переменные можно использовать в CSS? Я впервые стою перед подобной задачей и не могу разобраться. Мануалы по CSS и PHP начал читать, но всё же немогу понять, каким синтаксисом надо обладать что бы повлиять на вывод...

а еще вот нашел визуально похожий свитчер с отображением флага, но прикрутить не смог
http://drupal.org/node/261059#comment-965314

Аватар пользователя PanDa777 PanDa777 29 августа 2008 в 10:04

Сам модуль выводит блок. Как должно быть всем известно, в Drupal 6 можно задавать в шаблоне темы неограниченное число регионов, то есть мест, где можно этот блок показывать. Подробнее о регионах, блоках и всём таком: http://drupal.org/node/171224

Аватар пользователя venture venture 23 сентября 2009 в 14:38

спасибо за отличный патч! давно искал и сейчас использую именно его.
может подскажите, где можно найти и как сделать:
вывод всех доступных языков в виде только флагов, с подсветкой текущего?
это может положительно сказаться на отношении пользователей, ибо видно сразу, что сайт переведен на множество языков и занимать это будет тоже не так уж много места.

Аватар пользователя temerazev temerazev 30 ноября 2011 в 23:19

Все сделал, как и сказано в первом посте, вот что у меня вышло:

до этого там был дефолтный переключатель языков, а в Блоках никакого Alternative language switcher нету
После как заменил function locale_block и 2е функции, которые после нее дописывают, патчем, выдало:
Parse error: syntax error, unexpected '-', expecting T_STRING or T_VARIABLE or '$' in /home/c/cl69487/public_html/modules/locale/locale.module on line 562
Как быть ?

Аватар пользователя temerazev temerazev 30 ноября 2011 в 23:27

Усё заработало! после отключения i18n и аддонов.... дуетом жить не могут.... Ждем когда подружите их! к великому счастью, пока не сильно завишу от i18n