如何获取到翻译后的节点的路径?


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()应该能够执行的操作还是我需要其他功能?谢谢!

Answers:


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"));搜索别名代替节点ID,它更灵活。您必须通过正确的语言。
Dooderoo 2014年

5
global $language;

$translation_node = translation_path_get_translations("42");

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

$path = "node/{$nid}";

2
欢迎来到Drupal答案!虽然从理论上讲这可以回答问题,但最好在代码中包含基本说明。
Mołot

4

看看drupal_get_path_alias功能

给定内部Drupal路径,返回管理员设置的别名。

如果没有提供路径,该函数将返回当前页面的别名。

参量

$ path:内部Drupal路径。

$ path_language:用于查找路径的可选语言代码。

可以看出,它带有path_language参数。因此,您可以找出当前的语言,然后继续使用此功能。

或者直接使用Multilink模块

  1. 专为多语言网站而设计。尤其适用于并非所有内容都可用所有语言提供的网站,或者以后可能提供(翻译)所有内容的网站。
  2. 使您可以轻松地创建指向其他节点的内容内链接,并且这些链接会自动更新以指向引用节点的适当翻译版本(如果可用)。

1
drupal_get_path_alias()不会搜索给定节点的翻译,而只会搜索给定语言中已经存在的别名。我找到了另一个解决方法,请参见下面的答案。
Dooderoo 2014年

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 /”)的别名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.