Localizer. Разбор полётов.

Аватар пользователя EliteMonk EliteMonk 20 января 2008 в 21:54

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

=========================
Основы.
=========================

Основы этого модуля таковы, каждый документ имеет только 1 язык, но может быть отображён для всех, последнее строго не рекомендуется!!! Каждый блок может принадлежать только одному языку или для всех языков сразу, последнее сейчас напротив имеет важное значение. Меню, в отличие от выше сканного, не может быть сделано только для одного языка, перевод делается конкретно меню, а не другого объекта привяззаного к первому объекту, а именно так будет сделано в первых двух случаях.
*Важно понять что для блоков и документов и прочего, создаются отдельные объекты с совершенно другими id и лишь подставляются системом, т.к. в базе данные объекты связаны и система знает id документа на эстонском, который является переводом с русского, но всё-таки они связаны только логически модулем, это разные объекты.
*Когда вы решили поставить модуль, то его лучше ставить в самом начале на чистую систему, буквально с установкой друпала, если вы сделаете это через 2 недели после а может быть 2 года вам придётся очень долго пересохранять все объекты системы не только документы, но и словари, блоки, и всё прочее.
*Когда вы поставили решите какой язык будет основным, НЕ делайте сначала на русском, т.к. это родной язык, а после окончания работ, через месяца 2, изменяйте на эстонский, т.к. живёте в Эстонии. Переводы в базе перепутаются вы половину потеряете прежде, чем успеете понять, что зря так сделали. Всё что в системе обозначено как основной язык хранит эти данные на этом языке в оригинальных объектак, однако связь на "переводы" понимаем что это тоже объекты, хранится в тавлице, но как только объект "перевода" станет основным объектом, то он не будет уже иметь ссылок на другие объекты, т.к. в базе все переводы привязаны к основному объекту, а сам объект к ним не привязан, и следовательно сделав такую глупость мы нарушаем логику модуля.
*Сорри за слишком подробное и тафтологическое объяснение Smile

--------------------------------------------------

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

=========================
Решения.
=========================

Для начала замечу, что для работы модуля необходимо пропатчить 3 модуля ядра: меню, блок, таксономию. Именно по этому все решения проблем будут через патчи именно этих модулей. И выхадить за их рамки я не буду, если модуль кривой и не умеет пользоваться нужными функциями, а например, сам по базе данных что-то генерит, что его не просили, и что мог взять через функции другого модуля, то значит не надо такими модулями пользоваться... ))

--------------------------------------------------

Проблема в следующем, есть Вид представления (Views), который в полях имеет поле таксономии (As Link), выводиться всё как и должно, но только на оснавном языке. Решается доп. патчем для модуля таксономии, как говорил я отсылал авторам о данной проблеме инфу, но они не вставили этого кода в свой патч файл...

<?php
/**
 * Implementation of hook_link().
 *
 * This hook is extended with $type = 'taxonomy terms' to allow themes to
 * print lists of terms associated with a node. Themes can print taxonomy
 * links with:
 *
 * if (module_exists('taxonomy')) {
 *   $terms = taxonomy_link('taxonomy terms', $node);
 *   print theme('links', $terms);
 * }
 */

function taxonomy_link($type, $node = NULL) {
  if ($type == 'taxonomy terms' && $node != NULL) {
    $links = array();
    if (array_key_exists('taxonomy', $node)) {
      foreach ($node->taxonomy as $term) {
       
        // >>>>>>>>>>>>>>>>>>>>>>>>> add 6 lines
        $nameTranslate = $term->name;
        $result = mysql_query('select translation from localizertranslation where object_key="' . $term->tid . '" and object_name="taxonomy_term" and object_field="name" and locale="' . $GLOBALS['locale'] . '";');
        $sovpad = mysql_num_rows($result);
        if ($sovpad > 0) {
            $nameTranslate = mysql_result($result, 0, 'translation');
        }
       
        $links['taxonomy_term_'. $term->tid] = array(
          'title' => $nameTranslate, // >>>>>>>>>>>>>>>>>>>>>>>>> replace $term->name to $nameTranslate
          'href' => taxonomy_term_path($term),
          'attributes' => array('rel' => 'tag', 'title' => strip_tags($term->description))
        );
      }
    }
   
   
    // We call this hook again because some modules and themes call taxonomy_link('taxonomy terms') directly
    foreach (module_implements('link_alter') as $module) {
      $function = $module .'_link_alter';
      $function($node, $links);
    }
   
    return $links;
  }
}
?>

--------------------------------------------------

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

<?php
/**
 * Return the vocabulary object matching a vocabulary ID.
 *
 * param $vid
 *   The vocabulary's ID
 *
 * return Object
 *   The vocabulary object with all of its metadata.
 *   Results are statically cached.
 */

function taxonomy_get_vocabulary($vid) {
  static $vocabularies = array();
 
  if (!array_key_exists($vid, $vocabularies)) {
    $result = db_query('SELECT v.*, n.type FROM {vocabulary} v LEFT JOIN {vocabulary_node_types} n ON v.vid = n.vid WHERE v.vid = %d ORDER BY v.weight, v.name', $vid);
    $node_types = array();
    while ($voc = db_fetch_object($result)) {
      $node_types[] = $voc->type;
      unset($voc->type);
      $voc->nodes = $node_types;
     
       // >>>>>>>>>>>>>>>>>>>>>>>>> add 7 lines
      if (isset($voc->name)) {
        $result = mysql_query('select translation from localizertranslation where object_key="' . $voc->vid . '" and object_name="taxonomy_vocabulary" and object_field="name" and locale="' . $GLOBALS['locale'] . '";');
        $sovpad = mysql_num_rows($result);
        if ($sovpad > 0) {
            $voc->name = mysql_result($result, 0, 'translation');
        }
      }
     
      $vocabularies[$vid] = $voc;
    }
  }
 
  return $vocabularies[$vid];
}
?>

--------------------------------------------------

Статья будет дописываться, жду вопросы которые неьбходимо рассмотреть в рамках данной статьи...

Комментарии

Аватар пользователя oblivion oblivion 21 января 2008 в 4:13

надо будит как нибудь попробовать...
а что насчет других патчей?
и еще, это где то применяется?

Аватар пользователя EliteMonk EliteMonk 21 января 2008 в 15:33

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

Аватар пользователя Dec0der Dec0der 22 января 2008 в 17:42

может ликализер и не идеальны, но вполне адекватно работает...
То что вы расписали о смене главного языка - ну так когда сайт делаешь, нужно в голове всё продумать, как и что, а если делать сайт а через месяц его переделывать... то ессно, что не только локализер может накрыться, а и любой другой модуль...

"каждый документ имеет только 1 язык, но может быть отображён для всех, последнее строго не рекомендуется!!! "
почему не рекомендуется?

Аватар пользователя EliteMonk EliteMonk 22 января 2008 в 18:41

Во первых эта не критика, а пособие, чтобы другие не делали ошибок, я понимаю что Вы вероятно не имеете таких проблем с языками на которых делаете сайты, а вот я имею, я знаю английский и собственно русский, эстонский, хоть и живу в Эстонии не особо, а иногда сайт ещё и финский должен содержать, а иногда ещё и немецкий, я не знаю столько языков, а работать предпочитаю на русском... отсюда и ситуация такая... либо опять же заказчик просто передумает в последний момент, это впринципе не важно... Я тока описываю ситуацию и нахожу решения, я сам пользуюсь этим модуем, но к сожалению он не идеален, а заказчиков это сами понимаете мало волнует...
По поводу вопроса, например имеем определённый тип документа и много документов этого типа, т.к. сайт солидный предполагается 3 языка и все документы на каждом из языков, допустим есть документ этого типа который либо не переведён ещё либо этот перевод не требуется в силу каких-либо объстоятельст, потом заказчик просит вывести общее число документов в системе, тут возникает трабра, документов в три раза больше т.к. каждый документ имеет по 2 копии на других языках, но для клиента это же один и тот же докумен только на разных языках и знать он не знает про ООП, так что делим на три, теперь логически додумываем в какую ситуацию попадаем, если неопределённое число документов не имеет своих копий....
Нужно ли внести это в документ?
P.S. ТЗ это сила, но однажды потеряйте заказ только потому что сказали заказчику что для вас проблема вывести эту несчастную циферку, т.к. она не оговорена заказчиком в Т.З., и поймёте что всегда есть и будут ситуации которых невозможно предусмотреть...

Аватар пользователя sergiyko911 sergiyko911 9 мая 2008 в 0:24

в продолжение темы...

была задача - сделать сайт на 2х языках - рус и укр
поступил так (drupal 5.7) -
создал сначала 2 меню для каждого языка, и 2 типа материалов node_ukr и node_rus
далее все публикации прикреплял к соответствующим языкам - публикацию на украинском делал node_ukr, на русском соответсвенно node_rus.
в результате получилось 2 меню и 2 набора публикаций, привязанных каждый к своему меню, что-то типа node_ukr/1, node_ukr/23, node_rus/5....
в настройках видимости блоков настроил вывод каждого меню на соотвествующие страницы, приделал переключатель языка (еще один блок) и вуаля - получилось 2 языковых версии
понимаю, что не самый лучший вариант, но думаю что имеет право на жизнь)
проблемы, с которыми столкнулся, которых бы хотелось избежать:
1. пришлось жестко прописывать ссылки в переключателе на "главную" для каждой языковой версии
2. когда делал контакты через contact module, пришлось их делать отдельно и с выкрутасами
3. главная страница получилась одна, и при переходе на нее "сбрасывался" язык

Аватар пользователя tmp tmp 6 июля 2008 в 17:41

Может кто то сталкивался:
обновлял локалайзер с версии 1.** до 3.1
После этого при добавлении пункта меню вылетает белая страница.
в логе httpd error.log остается такая фигня:
PHP Fatal error: Call to undefined function localizer_get_defualt_language() ......
после этого пункт в меню появляется, но в Localizer strings translation - пусто.
Даже не пойму от куда начинать копать. По новому ставить весь сайт - очень трудно, некоторые модули модифицировал, а что где и как уже и забыл.

Аватар пользователя new_user2 new_user2 15 июля 2008 в 19:56

Здравствуйте, Подскажите пожалуйста как правильно делать перевод 2- х, 3-х язычного сайта?
Создал меню и несколько страниц к нему, текст переводиться, а само меню(созданные мной разделы - нет).