diff -u b/core/lib/Drupal/Core/Field/FieldStorageDefinitionInterface.php b/core/lib/Drupal/Core/Field/FieldStorageDefinitionInterface.php --- b/core/lib/Drupal/Core/Field/FieldStorageDefinitionInterface.php +++ b/core/lib/Drupal/Core/Field/FieldStorageDefinitionInterface.php @@ -85,10 +85,10 @@ public function isTranslatable(); /** - * Sets whether the field is supports translation. + * Sets whether the field supports translation. * * @param bool $translatable - * Whether the field is supports translation. + * Whether the field supports translation. * * @return $this */ diff -u b/core/modules/content_translation/content_translation.admin.inc b/core/modules/content_translation/content_translation.admin.inc --- b/core/modules/content_translation/content_translation.admin.inc +++ b/core/modules/content_translation/content_translation.admin.inc @@ -314,12 +314,17 @@ // If we have a storable field definition we directly persist any // change to translatability, otherwise we store changes in our config // so we can properly alter field definitions later. + // @todo Remove this special casing when any field definition can have + // a configurable bundle override. See + // https://drupal.org/node/2224761. $definition = $definitions[$field_name]; if ($definition instanceof FieldInstanceConfigInterface) { if ($definition->isTranslatable() != $translatable) { $definition->setTranslatable($translatable); $definition->save(); } + // Do not save configurable fields unnecessarily. + unset($bundle_settings['fields'][$field_name]); } else { $bundle_settings['fields'][$field_name] = $translatable; diff -u b/core/modules/content_translation/content_translation.module b/core/modules/content_translation/content_translation.module --- b/core/modules/content_translation/content_translation.module +++ b/core/modules/content_translation/content_translation.module @@ -147,14 +147,10 @@ function content_translation_entity_bundle_field_info_alter(&$fields, EntityTypeInterface $entity_type, $bundle) { $settings = content_translation_get_config($entity_type->id(), $bundle, 'fields'); if (!empty($settings)) { - $base_field_definitions = \Drupal::entityManager()->getBaseFieldDefinitions($entity_type->id()); foreach ($settings as $name => $translatable) { // Skip storable field definitions as those are supposed to have already // been changed. - if (isset($base_field_definitions[$name]) && !$base_field_definitions[$name] instanceof FieldInstanceConfigInterface) { - if (!isset($fields[$name])) { - $fields[$name] = clone $base_field_definitions[$name]; - } + if (isset($fields[$name]) && !$fields[$name] instanceof FieldInstanceConfigInterface) { $fields[$name]->setTranslatable((bool) $translatable); } } diff -u b/core/modules/content_translation/src/Tests/ContentTranslationSettingsTest.php b/core/modules/content_translation/src/Tests/ContentTranslationSettingsTest.php --- b/core/modules/content_translation/src/Tests/ContentTranslationSettingsTest.php +++ b/core/modules/content_translation/src/Tests/ContentTranslationSettingsTest.php @@ -100,7 +100,7 @@ $this->assertTrue($definition->isTranslatable(), 'Article comment body is translatable.'); $definition = $this->entityManager()->getFieldDefinitions('comment', 'comment')['comment_body']; $this->assertFalse($definition->isTranslatable(), 'Page comment body is not translatable.'); - + $this->assertNull(content_translation_get_config('comment', 'comment_article', 'fields'), 'Configurable fields are not saved to content_translation.settings.'); // Test that translation can be enabled for base fields. $edit = array( 'entity_types[entity_test_mul]' => TRUE, @@ -108,6 +108,7 @@ 'settings[entity_test_mul][entity_test_mul][fields][name]' => TRUE, ); $this->assertSettings('entity_test_mul', 'entity_test_mul', TRUE, $edit); + $this->assertNotNull(content_translation_get_config('entity_test_mul', 'entity_test_mul', 'fields'), 'Base fields are saved to content_translation.settings.'); // Test that language settings are correctly stored. $language_configuration = language_get_default_configuration('comment', 'comment_article'); reverted: --- b/core/modules/field/tests/modules/field_test_config/config/install/field.field.entity_test.field_test_import.yml +++ a/core/modules/field/tests/modules/field_test_config/config/install/field.field.entity_test.field_test_import.yml @@ -8,6 +8,7 @@ module: text locked: false cardinality: 1 +translatable: false indexes: format: - format reverted: --- b/core/modules/field/tests/modules/field_test_config/config/install/field.field.entity_test.field_test_import_2.yml +++ a/core/modules/field/tests/modules/field_test_config/config/install/field.field.entity_test.field_test_import_2.yml @@ -8,6 +8,7 @@ module: text locked: false cardinality: 1 +translatable: false indexes: format: - format diff -u b/core/modules/file/src/Tests/FileFieldDisplayTest.php b/core/modules/file/src/Tests/FileFieldDisplayTest.php --- b/core/modules/file/src/Tests/FileFieldDisplayTest.php +++ b/core/modules/file/src/Tests/FileFieldDisplayTest.php @@ -6,6 +6,7 @@ */ namespace Drupal\file\Tests; + use Drupal\Core\Field\FieldStorageDefinitionInterface; /** reverted: --- b/core/modules/forum/config/install/field.field.taxonomy_term.forum_container.yml +++ a/core/modules/forum/config/install/field.field.taxonomy_term.forum_container.yml @@ -12,6 +12,7 @@ entity_type: taxonomy_term locked: true cardinality: 1 +translatable: false indexes: { } dependencies: module: diff -u b/core/modules/system/src/Tests/Ajax/MultiFormTest.php b/core/modules/system/src/Tests/Ajax/MultiFormTest.php --- b/core/modules/system/src/Tests/Ajax/MultiFormTest.php +++ b/core/modules/system/src/Tests/Ajax/MultiFormTest.php @@ -6,6 +6,7 @@ */ namespace Drupal\system\Tests\Ajax; + use Drupal\Core\Field\FieldStorageDefinitionInterface; /** diff -u b/core/modules/user/src/Entity/User.php b/core/modules/user/src/Entity/User.php --- b/core/modules/user/src/Entity/User.php +++ b/core/modules/user/src/Entity/User.php @@ -12,7 +12,6 @@ use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Field\FieldDefinition; -use Drupal\Core\Field\FieldStorageDefinitionInterface; use Drupal\user\UserInterface; /** @@ -530,7 +529,7 @@ $fields['roles'] = FieldDefinition::create('string') ->setCustomStorage(TRUE) ->setLabel(t('Roles')) - ->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) + ->setCardinality(FieldDefinition::CARDINALITY_UNLIMITED) ->setDescription(t('The roles the user has.')); return $fields; reverted: --- b/core/profiles/standard/config/install/field.field.node.field_image.yml +++ a/core/profiles/standard/config/install/field.field.node.field_image.yml @@ -13,6 +13,7 @@ height: null locked: false cardinality: 1 +translatable: false indexes: target_id: - target_id reverted: --- b/core/profiles/standard/config/install/field.field.node.field_tags.yml +++ a/core/profiles/standard/config/install/field.field.node.field_tags.yml @@ -10,6 +10,7 @@ parent: 0 locked: false cardinality: -1 +translatable: false indexes: target_id: - target_id reverted: --- b/core/profiles/standard/config/install/field.field.user.user_picture.yml +++ a/core/profiles/standard/config/install/field.field.user.user_picture.yml @@ -15,6 +15,7 @@ module: image locked: false cardinality: 1 +translatable: false indexes: target_id: - target_id