Comment obtenir le chemin vers le nœud traduit?

10

J'ai mis en place un site multilingue dans Drupal 7. Dans un modèle, je dois ajouter un lien vers un nœud de contenu spécifique. Ce nœud a des traductions et des alias de chemin comme ceci:

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

Dans le modèle, j'aimerais appeler url()pour obtenir le lien vers la version aliasée du nœud de contenu dans la langue actuelle.

Sur la page allemande, il doit renvoyer à /de/pathalias_dela page anglaise pour/en/pathalias_en

J'ai essayé plusieurs variantes, comme appeler le nid, appeler l'alias, passer l'objet de langage actuel à url().

Est-ce que quelque chose url()devrait pouvoir faire ou ai-je besoin d'une fonction différente? Merci!

Dooderoo
la source

Réponses:

14

Après avoir regardé la source du module "Content translation", j'ai trouvé cette solution:

    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

Cela produira le lien vers l'alias de nœud correct. Fonctionne et n'est pas trop compliqué - demandez-vous toujours s'il existe une fonction qui le fait déjà.

Dooderoo
la source
2
Ou utilisez $translations = translation_path_get_translations(drupal_get_normal_path("pathalias_de","de"));pour rechercher l'alias au lieu de l'identifiant du nœud, c'est plus flexible. Vous devez cependant passer la bonne langue.
Dooderoo
5
global $language;

$translation_node = translation_path_get_translations("42");

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

$path = "node/{$nid}";
vetal4ik
la source
2
Bienvenue dans Drupal Answers! Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure les explications essentielles avec votre code.
Mołot
4

Jetez un œil à la fonction drupal_get_path_alias

Étant donné un chemin Drupal interne, renvoyez l'alias défini par l'administrateur.

Si aucun chemin n'est fourni, la fonction renverra l'alias de la page en cours.

Paramètres

$ path: Un chemin Drupal interne.

$ path_language: Un code de langue facultatif pour rechercher le chemin d'accès.

Comme vous pouvez le constater, il prend un paramètre path_language. Ainsi, vous pouvez découvrir la langue actuelle et ensuite passer à cette fonction.

Ou utilisez simplement le module Multilink

  1. Conçu pour les sites multilingues. Particulièrement pertinent pour les sites où tout le contenu n'est pas disponible dans toutes les langues, ou peut être rendu disponible (traduit) ultérieurement.
  2. Vous permet de créer facilement des liens dans le contenu vers d'autres nœuds, et ces liens se mettent automatiquement à jour pour pointer vers une version traduite appropriée des nœuds référencés, lorsqu'ils sont disponibles.
Gokul NK
la source
1
drupal_get_path_alias()ne recherchera pas les traductions d'un nœud donné, juste pour les alias déjà dans la langue donnée. J'ai trouvé une autre solution de contournement, voir ma réponse ci-dessous.
Dooderoo
3

Aucune des réponses ci-dessus ne semble utiliser correctement i18n_path. Si vous souhaitez créer un lien vers le nœud traduit, vous devez simplement activer le module i18n_path et formater le chemin ainsi,

drupal_get_path_alias('node/'.$node->nid, $node->language);
macjules
la source
2

Vous devriez probablement utiliser la fonction de lien . Il vous permet de passer la langue en paramètre et c'est la fonction appropriée pour créer un lien avec Drupal.

Mat
la source
l()utilise en url()interne donc il n'a pas d'importance dans ce cas.
Dooderoo
1

En utilisant Translation Redirect, vous pouvez créer un lien vers des nœuds avec un préfixe de langue.

C'est ce qu'il dit:

Le module de redirection de traduction redirige les utilisateurs anonymes (y compris les robots d'indexation) vers la traduction de la page dans la langue demandée, si elle existe, en utilisant un code de redirection 301. Par exemple, si la demande concerne / de / node / 23 et que node / 23 correspond à une page en anglais, l'utilisateur sera redirigé vers la traduction allemande du nœud en anglais si elle existe. Si la traduction n'existe pas, le contenu du nœud source s'affiche.

Par exemple, si le nid 22 est pour la version anglaise et qu'il a des versions française et allemande, vous pouvez simplement les lier en fr / node / 22 et de / node / 22. Ce 22 peut également être n'importe quel nid de la version traduite.

Si une traduction particulière n'est pas trouvée par exemple si vous n'avez pas ajouté pour le japonais, alors ja / node / 22 donnera 404 pour les utilisateurs anonymes.

AgA
la source
0

Pour obtenir le chemin de préfixe correct, j'utilise:

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

La drupal_get_path_alias () retourne uniquement l'alias, l'url () est celle qui ajoute le préfixe ("en /").

nimbfire
la source