翻訳されたノードへのパスを取得する方法は?


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()できるはずですか、それとも別の機能が必要ですか?ありがとう!

回答:


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 Answersへようこそ!これは理論的には質問の答えになるかもしれませんが、コードとともに重要な説明を含めることが望ましいでしょう。
Mołot

4

drupal_get_path_alias fuctionご覧ください

内部Drupalパスを指定して、管理者が設定したエイリアスを返します。

パスが指定されていない場合、関数は現在のページのエイリアスを返します。

パラメーター

$ path:内部Drupalパス。

$ path_language:パスを検索するオプションの言語コード。

あなたが理解できるように、それはpath_languageパラメータを取ります。したがって、現在の言語を見つけて、この関数に渡すことができます。

または単にマルチリンクモジュールを使用する

  1. 多言語サイト用に設計されています。すべてのコンテンツがすべての言語で利用できるわけではない、または後で利用可能になる(翻訳される)サイトに特に関連します。
  2. 他のノードへのコンテンツ内リンクを簡単に作成できます。これらのリンクは、利用可能な場合、参照されたノードの適切な翻訳バージョンを指すように自動的に更新されます。

1
drupal_get_path_alias()ただ、すでにエイリアスのために、与えられたノードの翻訳を検索しません特定の言語。別の回避策を見つけました。以下の私の回答を参照してください。
Dooderoo 2014

3

上記の回答のいずれもi18n_pathを正しく使用していないようです。変換されたノードにリンクする場合は、i18n_pathモ​​ジュールを有効にしてパスをフォーマットするだけです。

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

2

おそらくlink関数を使うべきです。言語をパラメーターとして渡すことができ、Drupalとのリンクを作成するための適切な関数です。


l()url()内部で使用するため、この場合は問題になりません。
Dooderoo 2014

1

翻訳リダイレクトを使用すると、言語接頭辞を持つノードにリンクできます。

これはそれが言うことです:

翻訳リダイレクトモジュールは、301リダイレクトコードを使用して、匿名ユーザー(Webクローラーを含む)を、リクエストされた言語(存在する場合)でのページの翻訳にリダイレクトします。たとえば、要求が/ de / node / 23に対するものであり、node / 23が英語のページに対応している場合、ユーザーは英語のノードのドイツ語の翻訳にリダイレクトされます(存在する場合)。翻訳が存在しない場合は、ソースノードのコンテンツが表示されます。

たとえば、nid 22が英語バージョンで、フランス語とドイツ語のバージョンがある場合、fr / node / 22およびde / node / 22としてリンクするだけです。この22は、翻訳されたバージョンの任意のnidにすることもできます。

日本語を追加していない場合など、特定の翻訳が見つからない場合、ja / node / 22は匿名ユーザーに404を提供します。


0

正しいプレフィックスパスを取得するには、次を使用します。

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

drupal_get_path_alias()はエイリアスのみを返し、url()はプレフィックス( "en /")を追加するものです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.