Как получить путь к переведенному узлу?

10

Я установил мультиязычный сайт в Drupal 7. В шаблоне мне нужно добавить ссылку на определенный узел контента. Этот узел имеет переводы и псевдонимы пути, например:

node/42 = pathalias_de (german version)
node/43 = pathalias_en (english version)

В шаблоне я хотел бы позвонить, url()чтобы получить ссылку на псевдоним версии узла содержимого на текущем языке.

На немецкой странице должна быть ссылка /de/pathalias_deна английскую страницу/en/pathalias_en

Я пробовал несколько вариантов, таких как вызов nid, вызов псевдонима, передача текущего объекта языка url().

Это что-то url()должно уметь делать или мне нужна другая функция? Спасибо!

Dooderoo
источник

Ответы:

14

Посмотрев на источник модуля «Перевод контента», я нашел следующее решение:

    global $language;
    $translations = translation_path_get_translations("node/42");
    /*
    Returns the paths of all translations of a node, based on its Drupal path:
    array(2) {
        ["de"]=>string(7) "node/42"
        ["en"]=>string(7) "node/43"
    }
    */
    print l(t('Link Title'), $translations[$language->language]); //l() will return the alias to node/42

Это выведет ссылку на правильный псевдоним узла. Работает и не слишком сложен - все еще интересно, есть ли функция, которая уже делает это.

Dooderoo
источник
2
Или используйте $translations = translation_path_get_translations(drupal_get_normal_path("pathalias_de","de"));для поиска псевдонима вместо идентификатора узла, это более гибко. Вы должны передать правильный язык, хотя.
Dooderoo
5
global $language;

$translation_node = translation_path_get_translations("42");

$nid = $translation_node[$language->language]->nid;

$path = "node/{$nid}";
vetal4ik
источник
2
Добро пожаловать в ответы Drupal! Хотя это может теоретически ответить на вопрос, было бы предпочтительно включить основные объяснения вместе с вашим кодом.
Молот
4

Посмотрите на функцию drupal_get_path_alias

Учитывая внутренний путь Drupal, верните псевдоним, установленный администратором.

Если путь не указан, функция вернет псевдоним текущей страницы.

параметры

$ path: внутренний путь Drupal.

$ path_language: необязательный языковой код для поиска пути.

Как вы можете заметить, он принимает параметр path_language. Таким образом, вы можете узнать текущий язык и затем перейти к этой функции.

Или просто используйте модуль Multilink

  1. Предназначен для многоязычных сайтов. Особенно актуально для сайтов, где не весь контент доступен на всех языках или может быть доступен (переведен) позднее.
  2. Позволяет легко создавать в контенте ссылки на другие узлы, и эти ссылки автоматически обновляются, чтобы указывать на подходящую переведенную версию ссылочных узлов, когда она доступна.
Гокул Н.К.
источник
1
drupal_get_path_alias()не будет искать для перевода данного узла, только для псевдонимов уже в данном языке. Я нашел другой обходной путь, см. Мой ответ ниже.
Dooderoo
3

Похоже, что ни один из приведенных выше ответов не правильно использует i18n_path. Если вы хотите связать с переведенным узлом, вы должны просто включить модуль i18n_path и отформатировать путь таким образом,

drupal_get_path_alias('node/'.$node->nid, $node->language);
macjules
источник
2

Вы, вероятно, должны использовать функцию ссылки . Он позволяет передавать язык в качестве параметра, и это подходящая функция для создания ссылки с Drupal.

Matt
источник
l()использует url()внутри, так что это не имеет значения в этом случае.
Dooderoo
1

Используя Перенаправление переводов, вы можете связать узлы с префиксом языка.

Вот что он говорит:

Модуль перенаправления перевода перенаправляет анонимных пользователей (включая веб-сканеры) на перевод страницы на запрошенном языке, если он существует, с использованием кода перенаправления 301. Например, если запрос для / de / node / 23 и node / 23 соответствует английской странице, пользователь будет перенаправлен на немецкий перевод английского узла, если он существует. Если перевод не существует, то отображается содержимое узла источника.

Например, если nid 22 для английской версии и имеет французскую и немецкую версии, вы можете просто ссылаться на них как fr / node / 22 и de / node / 22. Это 22 также может быть любой nid переведенной версии.

Если конкретный перевод не найден, например, если вы не добавили японский, то ja / node / 22 выдаст 404 для анонимных пользователей.

AGA
источник
0

Чтобы получить правильный путь префикса, я использую:

$node_url = url(drupal_get_path_alias('node/' . $row->nid));

Drupal_get_path_alias () возвращает только псевдоним, а url () - тот, который добавляет префикс ("en /").

nimbfire
источник