Формирование ссылки (l()) и многоязычность

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

Аватар пользователя patison@drupal.org patison@drupal.org 7 марта 2010 в 14:48

Такая проблемка образовалась.
Есть нода, переведённая на несколько языков (русский вариант - node/2, инглиш - node/3, итд). Для каждой из страниц сгенерён алиас (русский вариант - ru/o-nas/, инглиш - en/about-us/).
Хочу сделать на странице ссылку на эту страницу (естественно, в зависимости от языка). Т.е. когда выбран русский язык, что-бы ссылка вела на ru/o-nas , а когда инглиш - на en/about-us.
Делаю примерно след образом:

print l( "lnk","node/2" );

Так-же, пробовал так:

print l( "lnk","node/2", array("language"=>"ru") );

И ещё вот так:

print l( "lnk","node/2", array("language"=>i18n_get_lang()) );

Но ни один вариант не канает. Для русского языка - всё окей, печатает ссылку на ru/o-nas . А для инглиша - en/node/2. Как решить проблемку?

Заранее спасибо.

Комментарии

Аватар пользователя patison@drupal.org patison@drupal.org 7 марта 2010 в 16:28

Не ну не хорошо так хардкодить .. ведь по идее друпал должен уметь сам находить ту ноду, которая соответствует переводу той или иной ноде ...
Что если я знаю id только русской ноды, а переведённых нод для этой ноды - id не известен? Или к примеру на сайте 10 языков. Не делать-же switch Smile

Аватар пользователя patison@drupal.org patison@drupal.org 7 марта 2010 в 18:23

может, вы имели ввиду drupal_get_path_alias ?
Если да, то попробовал вот так:
print drupal_get_path_alias("node/2");
Та-же история. Для русского языка получается нормально (т.е. ru/o-kompanii), а для инглиша всё та-же node/2 ... Sad

Аватар пользователя edhel edhel 7 марта 2010 в 21:39

Посмотрел 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']];
?>
Аватар пользователя glu2006 glu2006 7 марта 2010 в 22:05

опционально параметр 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() что немаловажно, чем в предложенном варианте, но потребует большей ручной работы.

Аватар пользователя patison@drupal.org patison@drupal.org 8 марта 2010 в 1:20

edhel: пасиб. немного переделал, а именно вот так:

                                                                       
$translations = translation_node_get_translations(2); // nid основной ноды
                                                                       
print l('Link Text', "node/".$translations[ i18n_get_lang() ]->nid);

и всё окей.

glu2006: ну вприцнипе да, вариант без translation_node_get_translations был-бы хорош, но вот как-бы сделать так что-бы для переводов генерился УРЛ родительской ноды (ноды главного языка)? не нашёл я этого в pathauto Sad

Аватар пользователя Ростислав Ростислав 25 ноября 2010 в 17:55

Для корректных переводов нод юзаю следующую функцию

<?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);
?>