Такая проблемка образовалась.
Есть нода, переведённая на несколько языков (русский вариант - node/2, инглиш - node/3, итд). Для каждой из страниц сгенерён алиас (русский вариант - ru/o-nas/, инглиш - en/about-us/).
Хочу сделать на странице ссылку на эту страницу (естественно, в зависимости от языка). Т.е. когда выбран русский язык, что-бы ссылка вела на ru/o-nas , а когда инглиш - на en/about-us.
Делаю примерно след образом:
Так-же, пробовал так:
И ещё вот так:
Но ни один вариант не канает. Для русского языка - всё окей, печатает ссылку на ru/o-nas . А для инглиша - en/node/2. Как решить проблемку?
Заранее спасибо.
Комментарии
Посмотрите по оргу, там где-то патчик валялся с примерно такой проблемой
Все равно хардкодите
<?php
global $language;
$nid = ($language == 'ru') ? 2 : 3;
echo l(t('My link'), 'node/'. $nid);
?>
Не ну не хорошо так хардкодить .. ведь по идее друпал должен уметь сам находить ту ноду, которая соответствует переводу той или иной ноде ...
Что если я знаю id только русской ноды, а переведённых нод для этой ноды - id не известен? Или к примеру на сайте 10 языков. Не делать-же switch
Можете попробовать делать drupal_get_alias()
может, вы имели ввиду drupal_get_path_alias ?
Если да, то попробовал вот так:
print drupal_get_path_alias("node/2");
Та-же история. Для русского языка получается нормально (т.е. ru/o-kompanii), а для инглиша всё та-же node/2 ...
Посмотрел translation.module… вариант такой:
<?php
$translations = translation_path_get_translations('node/2'); // адрес любого из переводов
print l('link name', $translations[$GLOBALS['language']];
?>
Или:
<?php
$translations = translation_node_get_translations(2); // nid основной ноды
print l('link name', $translations[$GLOBALS['language']];
?>
опционально параметр language отвечает только за префикс, я посмотрел по коду функций l(), url() все сводится к вызову language_url_rewrite() которая просто в зависимости от языка подставляет префикс, а по сему что-бы избежать проблем вам необходимо добиться одинаковых урлов для нод, т.е.
вы создали ноду на русском языке domain.ru/o-nas значит на английском ее урл должен быть domain.ru/en/o-nas в противном случае Вам надо пользоваться функцией для получения нода перевода по языку translation_node_get_translations() и передать в нее id ноды основного языка данная функция возвращает весь массив нод переводов для всех языков, а далее использовать тот код что я Вам писал т.е. размотать массив который возвращает эта функция и в зависимости от языка подставить то или иное значение
Пока писал уже ответили :).
На всякий случай вот сама функция:
<?php
function translation_node_get_translations($tnid) {
static $translations = array();
if (
is_numeric($tnid) && $tnid) {if (!isset($translations[$tnid])) {
$translations[$tnid] = array();
$result = db_query(db_rewrite_sql('SELECT n.nid, n.title, n.language FROM {node} n WHERE n.tnid = %d'), $tnid);
while ($node = db_fetch_object($result)) {
$translations[$tnid][$node->language] = $node;
}
}
return $translations[$tnid];
}
}
// из предложенного варианта решения
function translation_path_get_translations($path) {
$paths = array();
// Check for a node related path, and for its translations.
if ((preg_match("!^node/([0-9]+)(/.+|)$!", $path, $matches)) && ($node = node_load((int)$matches[1])) && !empty($node->tnid)) {
foreach (translation_node_get_translations($node->tnid) as $language => $translation_node) {
$paths[$language] = 'node/'. $translation_node->nid . $matches[2];
}
}
return $paths;
}
?>
Использование будет менее ресурсоемким во всяком случае меньше на 1 node_load() что немаловажно, чем в предложенном варианте, но потребует большей ручной работы.
edhel: пасиб. немного переделал, а именно вот так:
$translations = translation_node_get_translations(2); // nid основной ноды
print l('Link Text', "node/".$translations[ i18n_get_lang() ]->nid);
и всё окей.
glu2006: ну вприцнипе да, вариант без translation_node_get_translations был-бы хорош, но вот как-бы сделать так что-бы для переводов генерился УРЛ родительской ноды (ноды главного языка)? не нашёл я этого в pathauto
Для корректных переводов нод юзаю следующую функцию
<?php
function translate_node_urls($url){
global $language;
$arr = translation_path_get_translations($url);
$link = drupal_get_path_alias($arr[$language->prefix]);
return $link;
} $some_path = translate_node_urls('node/1800');
$correct_link = l(t('Some text'), $some_path);
?>