В данной статье буду выкладывать мысли и решения для данного модуля, к сожалению делаю это потому что даже дав код авторам проэкта они его уже 2 месяца в релиз не могут вставить. Статья будет дописываться, жду вопросы которые неьбходимо рассмотреть в рамках данной статьи...
=========================
Основы.
=========================
Основы этого модуля таковы, каждый документ имеет только 1 язык, но может быть отображён для всех, последнее строго не рекомендуется!!! Каждый блок может принадлежать только одному языку или для всех языков сразу, последнее сейчас напротив имеет важное значение. Меню, в отличие от выше сканного, не может быть сделано только для одного языка, перевод делается конкретно меню, а не другого объекта привяззаного к первому объекту, а именно так будет сделано в первых двух случаях.
*Важно понять что для блоков и документов и прочего, создаются отдельные объекты с совершенно другими id и лишь подставляются системом, т.к. в базе данные объекты связаны и система знает id документа на эстонском, который является переводом с русского, но всё-таки они связаны только логически модулем, это разные объекты.
*Когда вы решили поставить модуль, то его лучше ставить в самом начале на чистую систему, буквально с установкой друпала, если вы сделаете это через 2 недели после а может быть 2 года вам придётся очень долго пересохранять все объекты системы не только документы, но и словари, блоки, и всё прочее.
*Когда вы поставили решите какой язык будет основным, НЕ делайте сначала на русском, т.к. это родной язык, а после окончания работ, через месяца 2, изменяйте на эстонский, т.к. живёте в Эстонии. Переводы в базе перепутаются вы половину потеряете прежде, чем успеете понять, что зря так сделали. Всё что в системе обозначено как основной язык хранит эти данные на этом языке в оригинальных объектак, однако связь на "переводы" понимаем что это тоже объекты, хранится в тавлице, но как только объект "перевода" станет основным объектом, то он не будет уже иметь ссылок на другие объекты, т.к. в базе все переводы привязаны к основному объекту, а сам объект к ним не привязан, и следовательно сделав такую глупость мы нарушаем логику модуля.
*Сорри за слишком подробное и тафтологическое объяснение
--------------------------------------------------
Самый частые вопросы на форуме как вывести на определённом языке определённое меню. Чтобы вывести меню на определённом языке, а на других не выводить, надо сделать разные блоки на разных языках в которые поместить разные меню.
=========================
Решения.
=========================
Для начала замечу, что для работы модуля необходимо пропатчить 3 модуля ядра: меню, блок, таксономию. Именно по этому все решения проблем будут через патчи именно этих модулей. И выхадить за их рамки я не буду, если модуль кривой и не умеет пользоваться нужными функциями, а например, сам по базе данных что-то генерит, что его не просили, и что мог взять через функции другого модуля, то значит не надо такими модулями пользоваться... ))
--------------------------------------------------
Проблема в следующем, есть Вид представления (Views), который в полях имеет поле таксономии (As Link), выводиться всё как и должно, но только на оснавном языке. Решается доп. патчем для модуля таксономии, как говорил я отсылал авторам о данной проблеме инфу, но они не вставили этого кода в свой патч файл...
/**
* 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, очень нехорошо когда русскому пользователю показываются рубрики на эстонском )))))) патчим само сабою модуль таксонимии
/**
* 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];
}
?>
--------------------------------------------------
Статья будет дописываться, жду вопросы которые неьбходимо рассмотреть в рамках данной статьи...
Комментарии
надо будит как нибудь попробовать...
а что насчет других патчей?
и еще, это где то применяется?
На счёт каких именно патчей, есть патчи которые официальные с модулем локалайза идут, а эти патчи я написал, т.к. такие баги обнаружились мною, я больше не нашел никаких толковых патчей, если есть ссылочка дайте посмотреть, я сделаю анализ и отпишусь...
Применяется что? патчи или сам модуль? напишите пожайлуста вопрос более развёрнуто и я с удавольствием отвечу...
мда, а я вот собрался делать двуязычный сайт
Теперь думаю не стоит
может ликализер и не идеальны, но вполне адекватно работает...
То что вы расписали о смене главного языка - ну так когда сайт делаешь, нужно в голове всё продумать, как и что, а если делать сайт а через месяц его переделывать... то ессно, что не только локализер может накрыться, а и любой другой модуль...
"каждый документ имеет только 1 язык, но может быть отображён для всех, последнее строго не рекомендуется!!! "
почему не рекомендуется?
Во первых эта не критика, а пособие, чтобы другие не делали ошибок, я понимаю что Вы вероятно не имеете таких проблем с языками на которых делаете сайты, а вот я имею, я знаю английский и собственно русский, эстонский, хоть и живу в Эстонии не особо, а иногда сайт ещё и финский должен содержать, а иногда ещё и немецкий, я не знаю столько языков, а работать предпочитаю на русском... отсюда и ситуация такая... либо опять же заказчик просто передумает в последний момент, это впринципе не важно... Я тока описываю ситуацию и нахожу решения, я сам пользуюсь этим модуем, но к сожалению он не идеален, а заказчиков это сами понимаете мало волнует...
По поводу вопроса, например имеем определённый тип документа и много документов этого типа, т.к. сайт солидный предполагается 3 языка и все документы на каждом из языков, допустим есть документ этого типа который либо не переведён ещё либо этот перевод не требуется в силу каких-либо объстоятельст, потом заказчик просит вывести общее число документов в системе, тут возникает трабра, документов в три раза больше т.к. каждый документ имеет по 2 копии на других языках, но для клиента это же один и тот же докумен только на разных языках и знать он не знает про ООП, так что делим на три, теперь логически додумываем в какую ситуацию попадаем, если неопределённое число документов не имеет своих копий....
Нужно ли внести это в документ?
P.S. ТЗ это сила, но однажды потеряйте заказ только потому что сказали заказчику что для вас проблема вывести эту несчастную циферку, т.к. она не оговорена заказчиком в Т.З., и поймёте что всегда есть и будут ситуации которых невозможно предусмотреть...
delete this comment
в продолжение темы...
была задача - сделать сайт на 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. главная страница получилась одна, и при переходе на нее "сбрасывался" язык
Может кто то сталкивался:
обновлял локалайзер с версии 1.** до 3.1
После этого при добавлении пункта меню вылетает белая страница.
в логе httpd error.log остается такая фигня:
PHP Fatal error: Call to undefined function localizer_get_defualt_language() ......
после этого пункт в меню появляется, но в Localizer strings translation - пусто.
Даже не пойму от куда начинать копать. По новому ставить весь сайт - очень трудно, некоторые модули модифицировал, а что где и как уже и забыл.
Здравствуйте, Подскажите пожалуйста как правильно делать перевод 2- х, 3-х язычного сайта?
Создал меню и несколько страниц к нему, текст переводиться, а само меню(созданные мной разделы - нет).