「newscategory」という名前の含まれる用語参照フィールドを持つノードタイプ「news」があります。 i18nモジュールを含むtaxonomy-i18nもインストールされ、語彙は翻訳可能で、すべての用語が翻訳されています。ただし、pathautoパターンの場合、トークン「[node:field_newscategory]」のみが使用可能であり、ノードの言語によってはローカライズされません。
これを達成するためのトリックはありますか?
エンティティトークンを試してみませんか? Entity モジュールの一部であり、i18nで使用する追加のトークンを提供します。これにより、用語refフィールドのトークンツリー項目が展開可能になり、node:field_newscategory:i18-name
のようなトークンが表示されます。これにより、UI側だけに進むことができます。
私は自分のコードをラップすることができるのは驚くべきことですが:)
さて、さらに2時間の研究開発の後、ようやく問題を解決することができました。結局、 hook_pathauto_alias_alter() を実装する小さなカスタムモジュールを作成しました。
モジュールにはいくつかの依存関係があります:
dependencies[] = taxonomy
dependencies[] = field_extract
dependencies[] = pathauto
dependencies[] = i18n
dependencies[] = i18n_string
dependencies[] = i18n_taxonomy
ここに私がそれをした方法があります(私の特別なニーズに合わせて調整されているので、コードを変更してください)
<?php
/**
* Implements hook_pathauto_alias_alter()
*/
function mymodule_pathauto_alias_alter( &$alias, array &$context ) {
if ( $context[ 'module' ] == 'node' ) {
$node = $context[ 'data' ][ 'node' ];
if ( $node->type == 'news' ) {
// determine actual context variables
$language = $context[ 'language' ];
$pattern = $context[ 'pattern' ];
$category = field_extract_value( 'node', $node, 'field_newscategory' );
// translation & preparation
$category_translated = i18n_string_object_translate( 'taxonomy_term', $category, array( 'langcode' => $language ) );
$sanitized = pathauto_cleanstring( $category_translated->name, array( 'langcode' => $language ) );
// re-build the alias
$alias = explode( '/', $alias );
$pattern = explode( '/', $pattern );
foreach ( $pattern AS $index => $part ) {
if ( $part == '[node:field_newscategory]' ) {
$alias[ $index ] = $sanitized;
break;
}
}
$alias = implode( '/', $alias );
}
}
}
?>