Wie erhalte ich den Pfad zum übersetzten Knoten?

10

Ich habe in Drupal 7 eine mehrsprachige Site eingerichtet. In einer Vorlage muss ich einen Link zu einem bestimmten Inhaltsknoten hinzufügen. Dieser Knoten verfügt über folgende Übersetzungen und Pfad-Aliase:

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

In der Vorlage möchte ich aufrufen url(), um den Link zur Alias-Version des Inhaltsknotens in der aktuellen Sprache zu erhalten.

Auf der deutschen Seite sollte es /de/pathalias_deauf der englischen Seite auf verlinken/en/pathalias_en

Ich habe verschiedene Varianten ausprobiert, z. B. das Aufrufen der NID, das Aufrufen des Alias ​​und das Übergeben des aktuellen Sprachobjekts an url().

Sollte das etwas url()können oder brauche ich eine andere Funktion? Vielen Dank!

Dooderoo
quelle

Antworten:

14

Nachdem ich mir die Quelle des Moduls "Inhaltsübersetzung" angesehen habe, habe ich folgende Lösung gefunden:

    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

Dadurch wird die Verknüpfung zum richtigen Knotenalias ausgegeben. Funktioniert und ist nicht allzu kompliziert - ich frage mich immer noch, ob es eine Funktion gibt, die dies bereits tut.

Dooderoo
quelle
2
Oder verwenden Sie $translations = translation_path_get_translations(drupal_get_normal_path("pathalias_de","de"));, um nach dem Alias ​​anstelle der Knoten-ID zu suchen, es ist flexibler. Sie müssen jedoch die richtige Sprache übergeben.
Dooderoo
5
global $language;

$translation_node = translation_path_get_translations("42");

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

$path = "node/{$nid}";
vetal4ik
quelle
2
Willkommen bei Drupal Answers! Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen, die wesentlichen Erklärungen zusammen mit Ihrem Code beizufügen.
Mołot
4

Schauen Sie sich die Funktion drupal_get_path_alias an

Geben Sie bei einem internen Drupal-Pfad den vom Administrator festgelegten Alias ​​zurück.

Wenn kein Pfad angegeben ist, gibt die Funktion den Alias ​​der aktuellen Seite zurück.

Parameter

$ path: Ein interner Drupal-Pfad.

$ path_language: Ein optionaler Sprachcode zum Nachschlagen des Pfads.

Wie Sie erkennen können, ist ein path_language-Parameter erforderlich. So können Sie die aktuelle Sprache herausfinden und dann an diese Funktion weitergeben.

Oder verwenden Sie einfach das Multilink-Modul

  1. Entwickelt für mehrsprachige Websites. Besonders relevant für Websites, auf denen nicht alle Inhalte in allen Sprachen verfügbar sind oder zu einem späteren Zeitpunkt verfügbar gemacht (übersetzt) ​​werden.
  2. Ermöglicht das einfache Erstellen inhaltsbezogener Links zu anderen Knoten. Diese Links werden automatisch aktualisiert, um auf eine geeignete übersetzte Version der referenzierten Knoten zu verweisen, sofern verfügbar.
Gokul NK
quelle
1
drupal_get_path_alias()sucht nicht nach Übersetzungen eines bestimmten Knotens, sondern nur nach Aliasen, die bereits in der angegebenen Sprache vorhanden sind. Ich habe eine andere Problemumgehung gefunden, siehe meine Antwort unten.
Dooderoo
3

Keine der obigen Antworten scheint i18n_path korrekt zu verwenden. Wenn Sie eine Verknüpfung zum übersetzten Knoten herstellen möchten, aktivieren Sie einfach das Modul i18n_path und formatieren Sie den Pfad folgendermaßen:

drupal_get_path_alias('node/'.$node->nid, $node->language);
Macjules
quelle
2

Sie sollten wahrscheinlich die Link-Funktion verwenden . Sie können die Sprache als Parameter übergeben und die entsprechende Funktion zum Erstellen einer Verknüpfung mit Drupal verwenden.

Matt
quelle
l()wird url()intern verwendet, daher spielt es in diesem Fall keine Rolle.
Dooderoo
1

Mit Translation Redirect können Sie Verknüpfungen zu Knoten mit Sprachpräfix herstellen.

Das steht darin:

Das Übersetzungsumleitungsmodul leitet anonyme Benutzer (einschließlich Webcrawler) mithilfe eines 301-Umleitungscodes zur Übersetzung der Seite in der angeforderten Sprache um, sofern vorhanden. Wenn die Anforderung beispielsweise / de / node / 23 lautet und node / 23 einer englischen Seite entspricht, wird der Benutzer zur deutschen Übersetzung des englischen Knotens weitergeleitet, falls vorhanden. Wenn die Übersetzung nicht vorhanden ist, wird der Inhalt des Quellknotens angezeigt.

Wenn nid 22 beispielsweise für die englische Version ist und französische und deutsche Versionen enthält, können Sie einfach als fr / node / 22 und de / node / 22 auf diese verlinken. Diese 22 kann auch eine beliebige ID der übersetzten Version sein.

Wenn eine bestimmte Übersetzung nicht gefunden wird, wenn Sie beispielsweise kein Japanisch hinzugefügt haben, gibt ja / node / 22 für anonyme Benutzer 404 aus.

AgA
quelle
0

Um den richtigen Präfixpfad zu erhalten, verwende ich:

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

Drupal_get_path_alias () gibt nur den Alias ​​zurück, die URL () fügt das Präfix ("en /") hinzu.

Nimbfire
quelle