ブロック内にノードのコンテンツを取得しようとしています。
必要なフィールドを取得できましたが、現在の翻訳ではなく、常にサイトのデフォルト言語で返されます(例:/ node/1と/ fr/node/1は、翻訳ではなく同じ英語のコンテンツを返します)
単純なフィールドでは問題なく機能しますが、referencedEntitiesで機能させることはできません。
私はブロックbuild()関数の中にいます:
$node = \Drupal::routeMatch()->getParameter('node');
// Simple text field : Correct value depending on language
$correctValue = $node->field_test_text->getValue();
// Paragraphs/referencedEntities
$paras = $node->get('field_paragraphes')->referencedEntities();
foreach ($paras as $para) {
// Not translated, always in default language ?
$badValue = $para->get('field_test_in_para')->getValue();
}
どうもありがとう。
問題のコード(翻訳を取得するにはgetTranslationを使用し、実際に翻訳があるかどうかを確認するにはhasTranslationを使用する必要があります):
$lang_code = \Drupal::service('language_manager')->getCurrentLanguage()->getId();
$node = \Drupal::routeMatch()->getParameter('node');
// Paragraphs/referencedEntities
$paras = $node->get('field_paragraphes')->referencedEntities();
foreach ($paras as $para) {
// Remember to check if translation exists
if ($para->hasTranslation($lang_code)) {
$para = $para->getTranslation($lang_code);
}
$goodValue = $para->get('field_test_in_para')->getValue();
}
このコードが機能して問題を修正することはできますが、正しく機能しているかどうかを検討することもできます。ほとんどの場合、適切な方法で物事を行う場合、翻訳を処理する必要はありません。多くのモジュール/システムは、ものをレンダリングするとき、またはビューのようなモジュールを使用するときに、これを自動的に行います。ほとんどの場合、自分で翻訳を処理する必要がある場合、これを行う簡単な方法があります。
現在の言語の使用を強制することができます:
$langcode = $this->languageManager->getCurrentLanguage()->getId();
$value = $para->getTranslation($langcode)->field_test_in_para->value;
または、ノード言語を使用してみてください:
$node_language = $node->language()->getId();
$value = $para->getTranslation($node_language)->field_test_in_para->value;