Получите переведенное значение поля с помощью резервного копирования


Как я могу получить переведенное значение поля в Drupal 8 и, если перевод не задан, вернуться к языку узла по умолчанию? Я попробовал это: https://drupal.stackexchange.com/a/145747/9586 , но когда для добавленного поля нет перевода, оно просто возвращает значение NULL.

Вот что я попробовал:

    $node = Node::load(2);
dsm(\Drupal::entityManager()->getTranslationFromContext($node)->field_my_awesome_field->value);
Author: Community, 2015-11-12

2 answers

Вы можете попытаться предоставить контекст для резервного варианта в качестве 3-го параметра:

public EntityRepositoryInterface::getTranslationFromContext(EntityInterface $entity, $langcode = NULL, $context = array())

Вот документация, но она не документирована, каково в точности содержимое массива:

Получить перевод из контекстного

Я бы сам закодировал запасной вариант и взял под контроль, как именно это обрабатывается, если узел не полностью переведен:

$val = \Drupal::service('entity.repository')->getTranslationFromContext($node)->field_my_awesome_field->value;
 if (empty($val)) {
    // $node has no translation with the default node language
    // get the default from somewhere else (domain, user ...) and try again
    $val = $node->getTranslation($defaultlanguage)->field_my_awesome_field->value;
}
if (empty($val)) {
   // someone needs to translate this node, in the meantime get the original value
   $val = $node->field_my_awesome_field->value;
}

Вы можете настроить код в соответствии с вашими потребностями, вы можете добавить столько резервных вариантов, сколько захотите, или перейти непосредственно к последнему if-оператор для загрузки исходного значения поля.

Одно замечание: Если ваш многоязычный сайт настроен правильно, этого не должно произойти. Запасной вариант есть, когда что-то идет не так. Например, если вы настроили поле как переводимое, но при переводе узла оставляете только это поле пустым. Тогда drupal не знает, это намеренно, должно ли оно быть пустым или вы хотите загрузить поле с другого языка?

 2
Author: 4k4, 2020-06-15 09:13:00

В Drupal 8 нет встроенных резервных версий языка на уровне полей. Эта функция была удалена в пользу резервных вариантов языка на уровне сущностей, поскольку это распространенный случай. Обычно сущность переводится как некоторое время (или нет), и это устраняет огромную сложность, особенно в представлениях или около того.

Если у вас есть конкретное поле, в котором вы хотите применить это, то вам нужно реализовать это самостоятельно. Вы можете проверить, существует ли перевод на уровне сущности с помощью $node->hastranslation('en') и если это так, получите его с помощью $translation = $node->gettranslation ('de') ($translation по-прежнему является объектом узла, это клон исходного объекта с другим активным языком). Затем проверьте, есть ли у вас значение, и повторяйте, пока не найдете его.

Что-то вроде этого:

$value = NULL;
$language_manager = \Drupal::languageManager();
$current_langcode = $language_manager->getLanguage(Drupal\Core\Language\LanguageInterface::TYPE_CONTENT);
foreach ($language_manager->getFallbackCandidates(['langcode' => $language_manager->getLanguage(]) as $langcode) {
  if ($node->hasTranslation($langcode) && !$node->getTranslation($langcode)->field_my_awesome_field->isEmpty()) {
    $value = $node->getTranslation($langcode)->field_my_awesome_field->value;
    break;
  }
}
 4
Author: Berdir, 2015-11-12 21:34:02