Implements hook_field_language_alter().
Performs language fallback for unaccessible translations.
function translation_entity_field_language_alter(&$display_language, $context) {
$entity = $context['entity'];
$entity_type = $entity
->entityType();
if (isset($entity->translation[$context['langcode']]) && $entity
->isTranslatable() && !translation_entity_view_access($entity, $context['langcode'])) {
$instances = field_info_instances($entity_type, $entity
->bundle());
// Avoid altering the real entity.
$entity = clone $entity;
$entity_langcode = $entity
->language()->langcode;
foreach ($entity->translation as $langcode => $translation) {
if ($langcode == $context['langcode'] || !translation_entity_view_access($entity, $langcode)) {
// Unset unaccessible field translations: if the field is untranslatable
// unsetting a language different from Language::LANGCODE_NOT_SPECIFIED has no
// effect.
foreach ($instances as $instance) {
// @todo BC entities have the same value accessibile both with the
// entity language and with Language::LANGCODE_DEFAULT. We need need to unset
// both until we remove the BC layer.
if ($langcode == $entity_langcode) {
unset($entity->{$instance['field_name']}[Language::LANGCODE_DEFAULT]);
}
unset($entity->{$instance['field_name']}[$langcode]);
}
}
}
// Find the new fallback values.
field_language_fallback($display_language, $entity, $context['langcode']);
}
}