web-dev-qa-db-ja.com

翻訳された(entity_translation)ノードのパスの問題

私はDrupal 7、entity_translationおよびpathautoを2つの言語で使用します:ENFR

(「エンティティの翻訳」を含むコンテンツタイプの)新しいコンテンツを作成し、「テスト」というタイトルを付けます。 Generate automatic URL aliasが有効になっているため、URL /testにコンテンツが表示されます。

次に、これをフランス語に翻訳して送信します。

サイドバーには、FR/fr/node/1にリンクする言語セレクタがあります。

/fr/testに自動的にリンクさせるにはどうすればよいですか?これを解決する唯一の方法は、フランス語に翻訳されたコンテンツのエイリアスに手動でtestを入力することです。ノードの翻訳でpathautoが機能しないのはなぜですか?

3
cherouvim

エンティティの翻訳7.x-1.x-devこれを解決します。

Packt Drupal-7-Multilingual-Sites book で提供されるヒント:

各言語には個別のノードがあるため、Pathautoはノード変換モデルを使用してノードに対して正常に機能します。これを書いている時点では、フィールド翻訳について、PathautoおよびEntity Translationモジュールのメンテナがいくつかの問題を解決してきました。自動URLエイリアスがDrupal 7でfeld-translatedノードに対して機能するようにするには、少なくともエンティティ変換バージョン7.x-1.0-alpha2(使用可能な場合)、または最新の開発を使用する必要がありますバージョン。

3
cherouvim

最新の開発バージョンのエンティティ変換では何も変更されなかったため、entity_translation.moduleの1959行目を変更して解決しました

if ($context['op'] == 'bulkupdate' && !empty($info[$entity_type]['token type']) && !empty($context['data'][$info[$entity_type]['token type']])) {

if (($context['op'] == 'update' || $context['op'] == 'bulkupdate') && !empty($info[$entity_type]['token type']) && !empty($context['data'][$info[$entity_type]['token type']])) {

このようにして、コンテンツの更新/作成時にも、pathauto_create_alias()が呼び出されます。

3
febstarer

Synchronize Translation Paths モジュールを使用できます。

これがないと、URLパスエイリアスは翻訳間で同期されません。翻訳が保存されると、URLパスのエイリアスが対応する言語に割り当てられるため、データベース内の言語に依存しないエイリアスが削除されます。したがって、別の言語で閲覧する場合、UIまたはDBクライアントから追加しない限り、エイリアスセットはありません。

2
colan

エンティティの翻訳7.x-1.x-devは私にはこれを解決しません。

回避策として次のフックを実装する必要がありました。

/**
 * Implements hook_url_inbound_alter().
 *
 * Resolves alias if the content is not translated.
 */
function MYMODULE_url_inbound_alter(&$path, $original_path, $path_language) {
  // Check if no url alias has not been found for incoming path.
  if ($path && $path == $original_path) {
    // Resolve alias if the content is not translated to current language. Get
    // alias of existing translation.
    foreach (array_keys(language_list()) as $language) {
      if ($source = drupal_lookup_path('source', $path, $language)) {
        // Check if we are at the document page.
        if (strpos($source, 'node/') === 0) {
          $path = $source;
          break;
        }
      }
    }
  }
}

/**
 * Implements hook_url_outbound_alter().
 *
 * Resolves alias from node language if the content is not translated.
 */
function MYMODULE_url_outbound_alter(&$path, &$options, $original_path) {
  if (preg_match('/^node\/\d+$/', $path) && $node = menu_get_object('node', 1, $path)) {
    if ($alias = drupal_get_path_alias($path, $node->language)) {
      $path = $alias;
    }
  }
}
0
milkovsky