function translation_entity_field_language_alter

Implements hook_field_language_alter().

Performs language fallback for unaccessible translations.

File

drupal/core/modules/translation_entity/translation_entity.module, line 640
Allows entities to be translated into different languages.

Code

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']);
  }
}