diff -u b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php --- b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php @@ -465,6 +465,8 @@ $translation = $entity->original->getTranslation($removed_langcode); $fields = $translation->getTranslatableFields(); foreach ($fields as $name => $items) { + // Call the delete method with the parameter $parent_delete set to + // FALSE to indicate that only an entity translation is being removed. $items->delete(FALSE); } } reverted: --- b/core/lib/Drupal/Core/Field/FieldItemInterface.php +++ a/core/lib/Drupal/Core/Field/FieldItemInterface.php @@ -217,13 +217,8 @@ * * This method is called during the process of deleting an entity, just before * values are deleted from storage. - * - * @param bool $parent_delete - * Specifies whether the whole parent is being deleted or only a - * translation of it. TRUE if the whole parent is being deleted, FALSE if - * only a translation is being deleted. Defaults to TRUE. */ + public function delete(); - public function delete($parent_delete = TRUE); /** * Defines custom revision delete behavior for field values. reverted: --- b/core/lib/Drupal/Core/Field/FieldItemListInterface.php +++ a/core/lib/Drupal/Core/Field/FieldItemListInterface.php @@ -156,13 +156,8 @@ * * This method is called during the process of deleting an entity, just before * values are deleted from storage. - * - * @param bool $parent_delete - * Specifies whether the whole parent is being deleted or only a - * translation of it. TRUE if the whole parent is being deleted, FALSE if - * only a translation is being deleted. Defaults to TRUE. */ + public function delete(); - public function delete($parent_delete = TRUE); /** * Defines custom revision delete behavior for field values. diff -u b/core/modules/system/tests/modules/entity_test/src/Plugin/Field/FieldType/FieldTestItem.php b/core/modules/system/tests/modules/entity_test/src/Plugin/Field/FieldType/FieldTestItem.php --- b/core/modules/system/tests/modules/entity_test/src/Plugin/Field/FieldType/FieldTestItem.php +++ b/core/modules/system/tests/modules/entity_test/src/Plugin/Field/FieldType/FieldTestItem.php @@ -114,9 +114,9 @@ * {@inheritdoc} */ public function delete($parent_delete = TRUE) { - parent::delete(); + parent::delete($parent_delete); $deleted_languages = \Drupal::state()->get('entity_test.delete.' . $this->getFieldDefinition()->getName()) ?: []; - $deleted_languages[] = $this->getLangcode(); + $deleted_languages[$this->getLangcode()] = $parent_delete; \Drupal::state()->set('entity_test.delete.' . $this->getFieldDefinition()->getName(), $deleted_languages); } only in patch2: unchanged: --- a/core/tests/Drupal/KernelTests/Core/Entity/EntityTranslationTest.php +++ b/core/tests/Drupal/KernelTests/Core/Entity/EntityTranslationTest.php @@ -904,11 +904,17 @@ public function testDeleteEntityTranslation() { // Ensure that for the translatable test field the second and third // langcodes are in the deleted languages list. - $actual = \Drupal::state()->get('entity_test.delete.translatable_test_field'); - $expected_translatable = ['l1', 'l2']; + $deleted_information = \Drupal::state()->get('entity_test.delete.translatable_test_field'); + $actual = array_keys($deleted_information); + $expected_translatable = $removed_languages = ['l1', 'l2']; sort($actual); sort($expected_translatable); $this->assertEqual($actual, $expected_translatable); + // Ensure that the delete method was provided with the correct information + // that only an entity translation is being removed. + foreach ($removed_languages as $langcode) { + $this->assertFalse($deleted_information[$langcode]); + } // Ensure that the untranslatable test field is untouched. $this->assertNull(\Drupal::state()->get('entity_test.delete.untranslatable_test_field')); @@ -916,16 +922,23 @@ public function testDeleteEntityTranslation() { $entity->delete(); // All languages have been deleted now. - $actual = \Drupal::state()->get('entity_test.delete.translatable_test_field'); - $expected_translatable[] = 'en'; - $expected_translatable[] = 'l0'; + $deleted_information = \Drupal::state()->get('entity_test.delete.translatable_test_field'); + $actual = array_keys($deleted_information); + $entity_left_translations_before_deletion = ['en', 'l0']; + $expected_translatable = array_merge($expected_translatable, $entity_left_translations_before_deletion); sort($actual); sort($expected_translatable); $this->assertEqual($actual, $expected_translatable); + // Ensure that the delete method was provided with the correct information + // that the entity is being deleted. + foreach ($entity_left_translations_before_deletion as $langcode) { + $this->assertTrue($deleted_information[$langcode]); + } // The untranslatable field is shared and only deleted once, for the // default langcode. $actual = \Drupal::state()->get('entity_test.delete.untranslatable_test_field'); + $actual = array_keys($actual); $expected_untranslatable = ['en']; sort($actual); sort($expected_untranslatable);