¿Cómo obtener la ruta al nodo traducido?

10

He configurado un sitio multilenguaje en Drupal 7. En una plantilla necesito agregar un enlace a un nodo de contenido específico. Este nodo tiene traducciones y alias de ruta de esta manera:

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

En la plantilla me gustaría llamar url()para obtener el enlace a la versión con alias del nodo de contenido en el idioma actual.

En la página alemana, debe enlazar a /de/pathalias_deen la página inglesa a/en/pathalias_en

He intentado varias variaciones, como llamar al nid, llamar al alias, pasar el objeto del lenguaje actual a url().

¿Es esto algo que url()debería poder hacer o necesito una función diferente? ¡Gracias!

Dooderoo
fuente

Respuestas:

14

Después de mirar la fuente del módulo "Traducción de contenido", he encontrado esta solución:

    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

Esto generará el enlace al alias de nodo correcto. Funciona y no es demasiado complicado: todavía me pregunto si hay una función que ya lo haga.

Dooderoo
fuente
2
O use $translations = translation_path_get_translations(drupal_get_normal_path("pathalias_de","de"));para buscar el alias en lugar de la identificación del nodo, es más flexible. Sin embargo, debes pasar el idioma correcto.
Dooderoo
5
global $language;

$translation_node = translation_path_get_translations("42");

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

$path = "node/{$nid}";
vetal4ik
fuente
2
¡Bienvenido a Drupal Answers! Si bien esto teóricamente puede responder la pregunta, sería preferible incluir las explicaciones esenciales junto con su código.
Mołot
4

Echa un vistazo a la función drupal_get_path_alias

Dada una ruta interna de Drupal, devuelve el alias establecido por el administrador.

Si no se proporciona ninguna ruta, la función devolverá el alias de la página actual.

Parámetros

$ path: una ruta interna de Drupal.

$ path_language: un código de idioma opcional para buscar la ruta.

Como puedes ver, toma un parámetro path_language. Para que pueda averiguar el idioma actual y luego pasar a esta función.

O simplemente use el módulo Multilink

  1. Diseñado para sitios en varios idiomas. Especialmente relevante para sitios donde no todo el contenido está disponible en todos los idiomas, o puede estar disponible (traducido) más adelante.
  2. Le permite crear fácilmente enlaces dentro del contenido a otros nodos, y esos enlaces se actualizan automáticamente para apuntar a una versión traducida adecuada de los nodos referenciados, cuando estén disponibles.
Gokul NK
fuente
1
drupal_get_path_alias()no buscará traducciones de un nodo dado, solo alias que ya estén en el idioma dado. Encontré otra solución, vea mi respuesta a continuación.
Dooderoo
3

Ninguna de las respuestas anteriores parece hacer un uso correcto de i18n_path. Si desea vincular al nodo traducido, simplemente debe habilitar el módulo i18n_path y formatear la ruta de esta manera,

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

Probablemente deberías usar la función de enlace . Le permite pasar el idioma como parámetro y es la función apropiada para crear un enlace con Drupal.

Mate
fuente
l()utiliza url()internamente, por lo que no importa en este caso.
Dooderoo
1

Usando el redireccionamiento de traducción puede vincular a nodos con prefijo de idioma.

Esto es lo que dice:

El módulo de redirección de traducción redirige a los usuarios anónimos (incluidos los rastreadores web) a la traducción de la página en el idioma solicitado, si existe, utilizando un código de redireccionamiento 301. Por ejemplo, si la solicitud es para / de / node / 23 y node / 23 corresponde a una página en inglés, el usuario será redirigido a la traducción al alemán del nodo en inglés si existe. Si la traducción no existe, se muestra el contenido del nodo de origen.

Por ejemplo, si nid 22 es para la versión en inglés y tiene versiones en francés y alemán, simplemente puede vincularlos como fr / node / 22 y de / node / 22. Este 22 también puede ser cualquier nid de la versión traducida.

Si no se encuentra una traducción particular, por ejemplo, si no ha agregado para japonés, entonces ja / node / 22 dará 404 para usuarios anónimos.

AgA
fuente
0

Para obtener la ruta de prefijo correcta, uso:

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

Drupal_get_path_alias () devuelve solo el alias, la url () es la que agrega el prefijo ("en /").

nimbfire
fuente