私はDrupal 7、entity_translationおよびpathautoを2つの言語で使用します:EN
、FR
。
(「エンティティの翻訳」を含むコンテンツタイプの)新しいコンテンツを作成し、「テスト」というタイトルを付けます。 Generate automatic URL alias
が有効になっているため、URL /test
にコンテンツが表示されます。
次に、これをフランス語に翻訳して送信します。
サイドバーには、FR
を/fr/node/1
にリンクする言語セレクタがあります。
/fr/test
に自動的にリンクさせるにはどうすればよいですか?これを解決する唯一の方法は、フランス語に翻訳されたコンテンツのエイリアスに手動でtest
を入力することです。ノードの翻訳でpathauto
が機能しないのはなぜですか?
エンティティの翻訳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(使用可能な場合)、または最新の開発を使用する必要がありますバージョン。
最新の開発バージョンのエンティティ変換では何も変更されなかったため、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()が呼び出されます。
Synchronize Translation Paths モジュールを使用できます。
これがないと、URLパスエイリアスは翻訳間で同期されません。翻訳が保存されると、URLパスのエイリアスが対応する言語に割り当てられるため、データベース内の言語に依存しないエイリアスが削除されます。したがって、別の言語で閲覧する場合、UIまたはDBクライアントから追加しない限り、エイリアスセットはありません。
エンティティの翻訳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;
}
}
}