Jak uzyskać ścieżkę do przetłumaczonego węzła?

10

Skonfigurowałem wielojęzyczną witrynę w Drupal 7. W szablonie muszę dodać link do określonego węzła treści. Ten węzeł zawiera tłumaczenia i aliasy ścieżek:

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

W szablonie chciałbym zadzwonić, url()aby uzyskać link do aliasu wersji węzła treści w bieżącym języku.

Na stronie niemieckiej powinien link do /de/pathalias_destrony angielskiej do/en/pathalias_en

Próbowałem kilku odmian, takich jak wywołanie nid, wywołanie aliasu, przekazanie bieżącego obiektu językowego url().

Czy to coś url()powinno być w stanie zrobić, czy potrzebuję innej funkcji? Dzięki!

Dooderoo
źródło

Odpowiedzi:

14

Po przyjrzeniu się źródłu modułu „Tłumaczenie treści” wpadłem na to rozwiązanie:

    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

Spowoduje to wygenerowanie łącza do poprawnego aliasu węzła. Działa i nie jest zbyt skomplikowane - nadal zastanawiam się, czy istnieje funkcja, która już to robi.

Dooderoo
źródło
2
Lub użyj $translations = translation_path_get_translations(drupal_get_normal_path("pathalias_de","de"));do wyszukiwania aliasu zamiast identyfikatora węzła, jest bardziej elastyczny. Musisz jednak podać poprawny język.
Dooderoo
5
global $language;

$translation_node = translation_path_get_translations("42");

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

$path = "node/{$nid}";
vetal4ik
źródło
2
Witamy w Drupal Answers! Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby dołączyć niezbędne wyjaśnienia wraz z kodem.
Mołot
4

Spójrz na funkcję drupal_get_path_alias

Biorąc pod uwagę wewnętrzną ścieżkę Drupala, zwróć alias ustawiony przez administratora.

Jeśli nie podano ścieżki, funkcja zwróci alias bieżącej strony.

Parametry

$ path: Wewnętrzna ścieżka Drupala.

$ ścieżka_język: opcjonalny kod języka do wyszukiwania ścieżki.

Jak widać, wymaga parametru path_language. Abyś mógł znaleźć aktualny język, a następnie przejść do tej funkcji.

Lub po prostu użyj modułu Multilink

  1. Zaprojektowany dla witryn wielojęzycznych. Szczególnie dotyczy witryn, w których nie wszystkie treści są dostępne we wszystkich językach lub mogą zostać udostępnione (przetłumaczone) w późniejszym terminie.
  2. Umożliwia łatwe tworzenie łączy treści do innych węzłów, które automatycznie aktualizują się, wskazując odpowiednią przetłumaczoną wersję odnośników, jeśli są one dostępne.
Gokul NK
źródło
1
drupal_get_path_alias()nie będzie szukał tłumaczeń danego węzła, tylko aliasy już w danym języku. Znalazłem inne obejście, zobacz moją odpowiedź poniżej.
Dooderoo
3

Wydaje się, że żadna z powyższych odpowiedzi nie używa poprawnie ścieżki i18n_path. Jeśli chcesz połączyć się z przetłumaczonym węzłem, po prostu włącz moduł i18n_path i sformatuj ścieżkę w ten sposób,

drupal_get_path_alias('node/'.$node->nid, $node->language);
macjules
źródło
2

Prawdopodobnie powinieneś użyć funkcji link . Pozwala przekazać język jako parametr i odpowiednią funkcją jest utworzenie łącza do Drupala.

Matt
źródło
l()używa url()wewnętrznie, więc w tym przypadku nie ma to znaczenia.
Dooderoo
1

Za pomocą przekierowania tłumaczenia można łączyć się z węzłami z prefiksem języka.

Oto co mówi:

Moduł przekierowania Tłumaczenie przekierowuje anonimowych użytkowników (w tym przeszukiwaczy internetowych) do tłumaczenia strony w żądanym języku, jeśli istnieje, przy użyciu kodu przekierowania 301. Na przykład, jeśli żądanie dotyczy / de / node / 23, a node / 23 odpowiada angielskiej stronie, użytkownik zostanie przekierowany do niemieckiego tłumaczenia angielskiego węzła, jeśli istnieje. Jeśli tłumaczenie nie istnieje, wyświetlana jest zawartość węzła źródłowego.

Na przykład, jeśli nid 22 jest dla wersji angielskiej i ma francuską i niemiecką, możesz po prostu połączyć się z nimi jako fr / node / 22 i de / node / 22. Ten 22 może być również dowolnym nid wersji przetłumaczonej.

Jeśli konkretne tłumaczenie nie zostanie znalezione, na przykład, jeśli nie zostało dodane dla języka japońskiego, to ja / node / 22 da 404 użytkownikom anonimowym.

Aga
źródło
0

Aby uzyskać poprawną ścieżkę do prefiksu, używam:

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

Drupal_get_path_alias () zwraca tylko alias, url () to ten, który dodaje prefiks („en /”).

nimbfire
źródło