diff --git b/core/modules/field/src/Tests/TranslationTest.php a/core/modules/field/src/Tests/TranslationTest.php index 1aabda5..4119b88 100644 --- b/core/modules/field/src/Tests/TranslationTest.php +++ a/core/modules/field/src/Tests/TranslationTest.php @@ -199,7 +199,7 @@ function testTranslatableFieldSaveLoad() { */ public function testFieldAccess() { $access_control_handler = \Drupal::entityManager()->getAccessControlHandler($this->entity_type); - $access_control_handler->fieldAccess('view', $this->field); + $this->assertTrue($access_control_handler->fieldAccess('view', $this->field)); } } diff --git b/core/modules/language/language.module a/core/modules/language/language.module index 2b95c8b..4a20fa3 100644 --- b/core/modules/language/language.module +++ a/core/modules/language/language.module @@ -511,20 +511,20 @@ function language_field_info_alter(&$info) { * Implements hook_entity_field_access() */ function language_entity_field_access($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, FieldItemListInterface $items = NULL) { - $entity_type = \Drupal::entityManager()->getDefinition($field_definition->getTargetEntityTypeId()); - $langcode_key = $entity_type->getKey('langcode'); - if ($field_definition->getName() == $langcode_key) { - $bundle = $field_definition->getTargetBundle(); - // If there is no bundle, this is a base field, attempt to get the bundle - // through the entity. - if (!$bundle && $items) { + // Only allow access to a langcode field if the entity it is attached to is + // configured to have an alterable language. + // Without items we can not decide whether or not to allow access. + if ($items) { + // Check if we are dealing with a langcode field. + $entity_type = \Drupal::entityManager()->getDefinition($field_definition->getTargetEntityTypeId()); + if ($field_definition->getName() == $entity_type->getKey('langcode')) { + // Fall back to neutral if we do not have a bundle. $bundle = $items->getEntity()->bundle(); - } - // If we have a bundle now, check the configuration, otherwise fall back - // to neutral. - if ($bundle) { - $config = ContentLanguageSettings::loadByEntityTypeBundle($entity_type->id(), $bundle); - return AccessResult::forbiddenIf(!$config->isLanguageAlterable()); + if ($bundle) { + // Grant access depending on whether the entity language can be altered. + $config = ContentLanguageSettings::loadByEntityTypeBundle($entity_type->id(), $bundle); + return AccessResult::forbiddenIf(!$config->isLanguageAlterable()); + } } } return AccessResult::neutral();