Як отримати шлях до перекладеного вузла?


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()має вміти робити чи мені потрібна інша функція? Дякую!

Відповіді:


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

Це виведе посилання на правильний псевдонім вузла. Працює і не надто складно - все одно цікаво, чи є функція, яка вже робить це.


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}";

2
Ласкаво просимо до відповідей Drupal! Хоча це теоретично може відповісти на запитання, бажано, щоб разом із кодом включити основні пояснення.
Молот

4

Погляньте на fuction 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);

2

Ймовірно, ви повинні використовувати функцію посилання . Це дозволяє передавати мову як параметр, і це відповідна функція для створення зв’язку з Drupal.


l()використовує url()внутрішньо, тому в цьому випадку це не має значення.
Dooderoo

1

Використовуючи переадресацію перекладу, ви можете зв’язати вузли з мовним префіксом.

Ось що говорить:

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

Наприклад, якщо nid 22 призначений для англійської версії, а в ній є французька та німецька, то ви можете просто покласти на них як fr / node / 22 та de / node / 22. Цей 22 також може бути будь-яким номером перекладеної версії.

Якщо конкретного перекладу не знайдено, наприклад, якщо ви не додали для японської мови, тоді ja / node / 22 дасть 404 для анонімних користувачів.


0

Щоб отримати правильний шлях префікса, я використовую:

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

Drupal_get_path_alias () повертає лише псевдонім, url () - це той, який додає префікс ("en /").

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.