summaryrefslogtreecommitdiffstats
path: root/core/modules
diff options
context:
space:
mode:
authorGabor Hojtsy2018-01-20 16:56:17 +0100
committerGabor Hojtsy2018-01-20 16:59:18 +0100
commitd229279900d1d7d759f0e029bdc28715a20ede2b (patch)
tree3988a04e63d83c74052ed68de62527f86b508109 /core/modules
parent9aaf79dfa568057aa207437258832174a88bdc54 (diff)
Issue #2878556 by plach, matsbla, vijaycs85, Gábor Hojtsy, catch, gabesullice, effulgentsia, hchonov, hass, amateescu, xjm: Ensure that changes to untranslatable fields affect only one translation in pending revisionsHEAD8.5.x
(cherry picked from commit 27c3b40e39a6d231866830b28d509632afee0e66)
Diffstat (limited to 'core/modules')
-rw-r--r--core/modules/content_translation/config/schema/content_translation.schema.yml6
-rw-r--r--core/modules/content_translation/content_translation.admin.inc30
-rw-r--r--core/modules/content_translation/content_translation.module16
-rw-r--r--core/modules/content_translation/src/BundleTranslationSettingsInterface.php35
-rw-r--r--core/modules/content_translation/src/ContentTranslationHandler.php57
-rw-r--r--core/modules/content_translation/src/ContentTranslationManager.php19
-rw-r--r--core/modules/content_translation/tests/src/Functional/ContentTranslationTestBase.php2
-rw-r--r--core/modules/content_translation/tests/src/Functional/ContentTranslationUntranslatableFieldsTest.php119
-rw-r--r--core/modules/node/src/Form/NodeRevisionRevertTranslationForm.php7
-rw-r--r--core/modules/system/tests/modules/entity_test/entity_test.module3
-rw-r--r--core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRev.php3
-rw-r--r--core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRevChanged.php1
12 files changed, 284 insertions, 14 deletions
diff --git a/core/modules/content_translation/config/schema/content_translation.schema.yml b/core/modules/content_translation/config/schema/content_translation.schema.yml
index 808a6e7..7367672 100644
--- a/core/modules/content_translation/config/schema/content_translation.schema.yml
+++ b/core/modules/content_translation/config/schema/content_translation.schema.yml
@@ -18,3 +18,9 @@ language.content_settings.*.*.third_party.content_translation:
enabled:
type: boolean
label: 'Content translation enabled'
+ bundle_settings:
+ type: sequence
+ label: 'Content translation bundle settings'
+ sequence:
+ type: string
+ label: 'Bundle settings values'
diff --git a/core/modules/content_translation/content_translation.admin.inc b/core/modules/content_translation/content_translation.admin.inc
index bf33ba0..f157749 100644
--- a/core/modules/content_translation/content_translation.admin.inc
+++ b/core/modules/content_translation/content_translation.admin.inc
@@ -5,6 +5,7 @@
* The content translation administration forms.
*/
+use Drupal\content_translation\BundleTranslationSettingsInterface;
use Drupal\Core\Config\Entity\ThirdPartySettingsInterface;
use Drupal\Core\Entity\ContentEntityTypeInterface;
use Drupal\Core\Entity\EntityTypeInterface;
@@ -83,6 +84,7 @@ function _content_translation_form_language_content_settings_form_alter(array &$
return;
}
+ /** @var \Drupal\content_translation\ContentTranslationManagerInterface $content_translation_manager */
$content_translation_manager = \Drupal::service('content_translation.manager');
$default = $form['entity_types']['#default_value'];
foreach ($default as $entity_type_id => $enabled) {
@@ -110,6 +112,23 @@ function _content_translation_form_language_content_settings_form_alter(array &$
continue;
}
+ // Displayed the "shared fields widgets" toggle.
+ if ($content_translation_manager instanceof BundleTranslationSettingsInterface) {
+ $settings = $content_translation_manager->getBundleTranslationSettings($entity_type_id, $bundle);
+ $form['settings'][$entity_type_id][$bundle]['settings']['content_translation']['untranslatable_fields_hide'] = [
+ '#type' => 'checkbox',
+ '#title' => t('Hide non translatable fields on translation forms'),
+ '#default_value' => !empty($settings['untranslatable_fields_hide']),
+ '#states' => [
+ 'visible' => [
+ ':input[name="settings[' . $entity_type_id . '][' . $bundle . '][translatable]"]' => [
+ 'checked' => TRUE,
+ ],
+ ],
+ ],
+ ];
+ }
+
$fields = $entity_manager->getFieldDefinitions($entity_type_id, $bundle);
if ($fields) {
foreach ($fields as $field_name => $definition) {
@@ -317,6 +336,8 @@ function content_translation_form_language_content_settings_validate(array $form
* @see content_translation_admin_settings_form_validate()
*/
function content_translation_form_language_content_settings_submit(array $form, FormStateInterface $form_state) {
+ /** @var \Drupal\content_translation\ContentTranslationManagerInterface $content_translation_manager */
+ $content_translation_manager = \Drupal::service('content_translation.manager');
$entity_types = $form_state->getValue('entity_types');
$settings = &$form_state->getValue('settings');
@@ -347,7 +368,12 @@ function content_translation_form_language_content_settings_submit(array $form,
}
if (isset($bundle_settings['translatable'])) {
// Store whether a bundle has translation enabled or not.
- \Drupal::service('content_translation.manager')->setEnabled($entity_type_id, $bundle, $bundle_settings['translatable']);
+ $content_translation_manager->setEnabled($entity_type_id, $bundle, $bundle_settings['translatable']);
+
+ // Store any other bundle settings.
+ if ($content_translation_manager instanceof BundleTranslationSettingsInterface) {
+ $content_translation_manager->setBundleTranslationSettings($entity_type_id, $bundle, $bundle_settings['settings']['content_translation']);
+ }
// Save translation_sync settings.
if (!empty($bundle_settings['columns'])) {
@@ -367,8 +393,8 @@ function content_translation_form_language_content_settings_submit(array $form,
}
}
}
+
// Ensure entity and menu router information are correctly rebuilt.
\Drupal::entityManager()->clearCachedDefinitions();
\Drupal::service('router.builder')->setRebuildNeeded();
-
}
diff --git a/core/modules/content_translation/content_translation.module b/core/modules/content_translation/content_translation.module
index 6a0c229..48feccc 100644
--- a/core/modules/content_translation/content_translation.module
+++ b/core/modules/content_translation/content_translation.module
@@ -5,6 +5,7 @@
* Allows entities to be translated into different languages.
*/
+use Drupal\content_translation\BundleTranslationSettingsInterface;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Entity\ContentEntityFormInterface;
use Drupal\Core\Entity\ContentEntityInterface;
@@ -161,9 +162,15 @@ function content_translation_entity_type_alter(array &$entity_types) {
* Implements hook_entity_bundle_info_alter().
*/
function content_translation_entity_bundle_info_alter(&$bundles) {
- foreach ($bundles as $entity_type => &$info) {
+ /** @var \Drupal\content_translation\ContentTranslationManagerInterface $content_translation_manager */
+ $content_translation_manager = \Drupal::service('content_translation.manager');
+ foreach ($bundles as $entity_type_id => &$info) {
foreach ($info as $bundle => &$bundle_info) {
- $bundle_info['translatable'] = \Drupal::service('content_translation.manager')->isEnabled($entity_type, $bundle);
+ $bundle_info['translatable'] = $content_translation_manager->isEnabled($entity_type_id, $bundle);
+ if ($content_translation_manager instanceof BundleTranslationSettingsInterface) {
+ $settings = $content_translation_manager->getBundleTranslationSettings($entity_type_id, $bundle);
+ $bundle_info['untranslatable_fields.default_translation_affected'] = !empty($settings['untranslatable_fields_hide']);
+ }
}
}
}
@@ -319,6 +326,11 @@ function content_translation_form_alter(array &$form, FormStateInterface $form_s
}
}
+ // The footer region, if defined, may contain multilingual widgets so we
+ // need to always display it.
+ if (isset($form['footer'])) {
+ $form['footer']['#multilingual'] = TRUE;
+ }
}
}
diff --git a/core/modules/content_translation/src/BundleTranslationSettingsInterface.php b/core/modules/content_translation/src/BundleTranslationSettingsInterface.php
new file mode 100644
index 0000000..df7b64b
--- /dev/null
+++ b/core/modules/content_translation/src/BundleTranslationSettingsInterface.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Drupal\content_translation;
+
+/**
+ * Interface providing support for content translation bundle settings.
+ */
+interface BundleTranslationSettingsInterface {
+
+ /**
+ * Returns translation settings for the specified bundle.
+ *
+ * @param string $entity_type_id
+ * The entity type identifier.
+ * @param string $bundle
+ * The bundle name.
+ *
+ * @return array
+ * An associative array of values keyed by setting name.
+ */
+ public function getBundleTranslationSettings($entity_type_id, $bundle);
+
+ /**
+ * Sets translation settings for the specified bundle.
+ *
+ * @param string $entity_type_id
+ * The entity type identifier.
+ * @param string $bundle
+ * The bundle name.
+ * @param array $settings
+ * An associative array of values keyed by setting name.
+ */
+ public function setBundleTranslationSettings($entity_type_id, $bundle, array $settings);
+
+}
diff --git a/core/modules/content_translation/src/ContentTranslationHandler.php b/core/modules/content_translation/src/ContentTranslationHandler.php
index 7e6a7ca..cb6776f 100644
--- a/core/modules/content_translation/src/ContentTranslationHandler.php
+++ b/core/modules/content_translation/src/ContentTranslationHandler.php
@@ -5,6 +5,7 @@ namespace Drupal\content_translation;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\DependencyInjection\DependencySerializationTrait;
use Drupal\Core\Entity\EntityChangedInterface;
+use Drupal\Core\Entity\EntityChangesDetectionTrait;
use Drupal\Core\Entity\EntityHandlerInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityManagerInterface;
@@ -13,8 +14,10 @@ use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Language\LanguageInterface;
use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Render\Element;
use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\user\Entity\User;
use Drupal\user\EntityOwnerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -25,7 +28,10 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
* @ingroup entity_api
*/
class ContentTranslationHandler implements ContentTranslationHandlerInterface, EntityHandlerInterface {
+
+ use EntityChangesDetectionTrait;
use DependencySerializationTrait;
+ use StringTranslationTrait;
/**
* The type of the entity being translated.
@@ -71,6 +77,13 @@ class ContentTranslationHandler implements ContentTranslationHandlerInterface, E
protected $fieldStorageDefinitions;
/**
+ * The messenger service.
+ *
+ * @var \Drupal\Core\Messenger\MessengerInterface
+ */
+ protected $messenger;
+
+ /**
* Initializes an instance of the content translation controller.
*
* @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
@@ -83,14 +96,17 @@ class ContentTranslationHandler implements ContentTranslationHandlerInterface, E
* The entity manager.
* @param \Drupal\Core\Session\AccountInterface $current_user
* The current user.
+ * @param \Drupal\Core\Messenger\MessengerInterface $messenger
+ * The messenger service.
*/
- public function __construct(EntityTypeInterface $entity_type, LanguageManagerInterface $language_manager, ContentTranslationManagerInterface $manager, EntityManagerInterface $entity_manager, AccountInterface $current_user) {
+ public function __construct(EntityTypeInterface $entity_type, LanguageManagerInterface $language_manager, ContentTranslationManagerInterface $manager, EntityManagerInterface $entity_manager, AccountInterface $current_user, MessengerInterface $messenger) {
$this->entityTypeId = $entity_type->id();
$this->entityType = $entity_type;
$this->languageManager = $language_manager;
$this->manager = $manager;
$this->currentUser = $current_user;
$this->fieldStorageDefinitions = $entity_manager->getLastInstalledFieldStorageDefinitions($this->entityTypeId);
+ $this->messenger = $messenger;
}
/**
@@ -102,7 +118,8 @@ class ContentTranslationHandler implements ContentTranslationHandlerInterface, E
$container->get('language_manager'),
$container->get('content_translation.manager'),
$container->get('entity.manager'),
- $container->get('current_user')
+ $container->get('current_user'),
+ $container->get('messenger')
);
}
@@ -269,6 +286,8 @@ class ContentTranslationHandler implements ContentTranslationHandlerInterface, E
* {@inheritdoc}
*/
public function entityFormAlter(array &$form, FormStateInterface $form_state, EntityInterface $entity) {
+ /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
+
$form_object = $form_state->getFormObject();
$form_langcode = $form_object->getFormLangcode($form_state);
$entity_langcode = $entity->getUntranslated()->language()->getId();
@@ -512,6 +531,20 @@ class ContentTranslationHandler implements ContentTranslationHandlerInterface, E
$ignored_types = array_flip(['actions', 'value', 'hidden', 'vertical_tabs', 'token', 'details']);
}
+ /** @var \Drupal\Core\Entity\ContentEntityForm $form_object */
+ $form_object = $form_state->getFormObject();
+ /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
+ $entity = $form_object->getEntity();
+ $display_translatability_clue = !$entity->isDefaultTranslationAffectedOnly();
+ $hide_untranslatable_fields = $entity->isDefaultTranslationAffectedOnly() && !$entity->isDefaultTranslation();
+ $translation_form = $form_state->get(['content_translation', 'translation_form']);
+ $display_warning = FALSE;
+
+ // We use field definitions to identify untranslatable field widgets to be
+ // hidden. Fields that are not involved in translation changes checks should
+ // not be affected by this logic (the "revision_log" field, for instance).
+ $field_definitions = array_diff_key($entity->getFieldDefinitions(), array_flip($this->getFieldsToSkipFromTranslationChangesCheck($entity)));
+
foreach (Element::children($element) as $key) {
if (!isset($element[$key]['#type'])) {
$this->entityFormSharedElements($element[$key], $form_state, $form);
@@ -524,10 +557,17 @@ class ContentTranslationHandler implements ContentTranslationHandlerInterface, E
// Elements are considered to be non multilingual by default.
if (empty($element[$key]['#multilingual'])) {
// If we are displaying a multilingual entity form we need to provide
- // translatability clues, otherwise the shared form elements should be
- // hidden.
- if (!$form_state->get(['content_translation', 'translation_form'])) {
- $this->addTranslatabilityClue($element[$key]);
+ // translatability clues, otherwise the non-multilingual form elements
+ // should be hidden.
+ if (!$translation_form) {
+ if ($display_translatability_clue) {
+ $this->addTranslatabilityClue($element[$key]);
+ }
+ // Hide widgets for untranslatable fields.
+ if ($hide_untranslatable_fields && isset($field_definitions[$key])) {
+ $element[$key]['#access'] = FALSE;
+ $display_warning = TRUE;
+ }
}
else {
$element[$key]['#access'] = FALSE;
@@ -536,6 +576,11 @@ class ContentTranslationHandler implements ContentTranslationHandlerInterface, E
}
}
+ if ($display_warning && !$form_state->isSubmitted() && !$form_state->isRebuilding()) {
+ $url = $entity->getUntranslated()->toUrl('edit-form')->toString();
+ $this->messenger->addWarning($this->t('Fields that apply to all languages are hidden to avoid conflicting changes. <a href=":url">Edit them on the original language form</a>.', [':url' => $url]));
+ }
+
return $element;
}
diff --git a/core/modules/content_translation/src/ContentTranslationManager.php b/core/modules/content_translation/src/ContentTranslationManager.php
index da8bd1c..8b3831a 100644
--- a/core/modules/content_translation/src/ContentTranslationManager.php
+++ b/core/modules/content_translation/src/ContentTranslationManager.php
@@ -8,7 +8,7 @@ use Drupal\Core\Entity\EntityManagerInterface;
/**
* Provides common functionality for content translation.
*/
-class ContentTranslationManager implements ContentTranslationManagerInterface {
+class ContentTranslationManager implements ContentTranslationManagerInterface, BundleTranslationSettingsInterface {
/**
* The entity type manager.
@@ -106,6 +106,23 @@ class ContentTranslationManager implements ContentTranslationManagerInterface {
}
/**
+ * {@inheritdoc}
+ */
+ public function setBundleTranslationSettings($entity_type_id, $bundle, array $settings) {
+ $config = $this->loadContentLanguageSettings($entity_type_id, $bundle);
+ $config->setThirdPartySetting('content_translation', 'bundle_settings', $settings)
+ ->save();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getBundleTranslationSettings($entity_type_id, $bundle) {
+ $config = $this->loadContentLanguageSettings($entity_type_id, $bundle);
+ return $config->getThirdPartySetting('content_translation', 'bundle_settings', []);
+ }
+
+ /**
* Loads a content language config entity based on the entity type and bundle.
*
* @param string $entity_type_id
diff --git a/core/modules/content_translation/tests/src/Functional/ContentTranslationTestBase.php b/core/modules/content_translation/tests/src/Functional/ContentTranslationTestBase.php
index ec7f87d..d3e81a6 100644
--- a/core/modules/content_translation/tests/src/Functional/ContentTranslationTestBase.php
+++ b/core/modules/content_translation/tests/src/Functional/ContentTranslationTestBase.php
@@ -138,7 +138,7 @@ abstract class ContentTranslationTestBase extends BrowserTestBase {
* Returns an array of permissions needed for the administrator.
*/
protected function getAdministratorPermissions() {
- return array_merge($this->getEditorPermissions(), $this->getTranslatorPermissions(), ['administer content translation']);
+ return array_merge($this->getEditorPermissions(), $this->getTranslatorPermissions(), ['administer languages', 'administer content translation']);
}
/**
diff --git a/core/modules/content_translation/tests/src/Functional/ContentTranslationUntranslatableFieldsTest.php b/core/modules/content_translation/tests/src/Functional/ContentTranslationUntranslatableFieldsTest.php
new file mode 100644
index 0000000..31431e6
--- /dev/null
+++ b/core/modules/content_translation/tests/src/Functional/ContentTranslationUntranslatableFieldsTest.php
@@ -0,0 +1,119 @@
+<?php
+
+namespace Drupal\Tests\content_translation\Functional;
+
+use Drupal\Core\Url;
+use Drupal\language\Entity\ConfigurableLanguage;
+
+/**
+ * Tests the untranslatable fields behaviors.
+ *
+ * @group content_translation
+ */
+class ContentTranslationUntranslatableFieldsTest extends ContentTranslationTestBase {
+
+ /**
+ * Modules to enable.
+ *
+ * @var array
+ */
+ public static $modules = ['language', 'content_translation', 'entity_test'];
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function setUp() {
+ parent::setUp();
+
+ // Configure one field as untranslatable.
+ $this->drupalLogin($this->administrator);
+ $edit = [
+ 'settings[' . $this->entityTypeId . '][' . $this->bundle . '][fields][' . $this->fieldName . ']' => 0,
+ ];
+ $this->drupalPostForm('admin/config/regional/content-language', $edit, 'Save configuration');
+
+ /** @var \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager */
+ $entity_field_manager = $this->container->get('entity_field.manager');
+ $entity_field_manager->clearCachedFieldDefinitions();
+ $definitions = $entity_field_manager->getFieldDefinitions($this->entityTypeId, $this->bundle);
+ $this->assertFalse($definitions[$this->fieldName]->isTranslatable());
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getEditorPermissions() {
+ return array_merge(parent::getTranslatorPermissions(), ['administer entity_test content', 'view test entity']);
+ }
+
+ /**
+ * Tests that hiding untranslatable field widgets works correctly.
+ */
+ public function testHiddenWidgets() {
+ /** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */
+ $entity_type_manager = $this->container->get('entity_type.manager');
+ $id = $this->createEntity([], 'en');
+ /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
+ $entity = $entity_type_manager
+ ->getStorage($this->entityTypeId)
+ ->load($id);
+
+ // Check that the untranslatable field widget is displayed on the edit form
+ // and no translatability clue is displayed yet.
+ $this->drupalGet($entity->toUrl('edit-form'));
+ $field_xpath = '//input[@name="' . $this->fieldName . '[0][value]"]';
+ $this->assertNotEmpty($this->xpath($field_xpath));
+ $clue_xpath = '//label[@for="edit-' . strtr($this->fieldName, '_', '-') . '-0-value"]/span[text()="(all languages)"]';
+ $this->assertEmpty($this->xpath($clue_xpath));
+
+ // Add a translation and check that the untranslatable field widget is
+ // displayed on the translation and edit forms along with translatability
+ // clues.
+ $add_url = Url::fromRoute("entity.{$this->entityTypeId}.content_translation_add", [
+ $entity->getEntityTypeId() => $entity->id(),
+ 'source' => 'en',
+ 'target' => 'it'
+ ]);
+ $this->drupalGet($add_url);
+ $this->assertNotEmpty($this->xpath($field_xpath));
+ $this->assertNotEmpty($this->xpath($clue_xpath));
+ $this->drupalPostForm(NULL, [], 'Save');
+
+ // Check that the widget is displayed along with its clue in the edit form
+ // for both languages.
+ $this->drupalGet($entity->toUrl('edit-form'));
+ $this->assertNotEmpty($this->xpath($field_xpath));
+ $this->assertNotEmpty($this->xpath($clue_xpath));
+ $it_language = ConfigurableLanguage::load('it');
+ $this->drupalGet($entity->toUrl('edit-form', ['language' => $it_language]));
+ $this->assertNotEmpty($this->xpath($field_xpath));
+ $this->assertNotEmpty($this->xpath($clue_xpath));
+
+ // Configure untranslatable field widgets to be hidden on non-default
+ // language edit forms.
+ $edit = [
+ 'settings[' . $this->entityTypeId . '][' . $this->bundle . '][settings][content_translation][untranslatable_fields_hide]' => 1,
+ ];
+ $this->drupalPostForm('admin/config/regional/content-language', $edit, 'Save configuration');
+
+ // Verify that the widget is displayed in the default language edit form,
+ // but no clue is displayed.
+ $this->drupalGet($entity->toUrl('edit-form'));
+ $field_xpath = '//input[@name="' . $this->fieldName . '[0][value]"]';
+ $this->assertNotEmpty($this->xpath($field_xpath));
+ $this->assertEmpty($this->xpath($clue_xpath));
+
+ // Verify no widget is displayed on the non-default language edit form.
+ $this->drupalGet($entity->toUrl('edit-form', ['language' => $it_language]));
+ $this->assertEmpty($this->xpath($field_xpath));
+ $this->assertEmpty($this->xpath($clue_xpath));
+
+ // Verify a warning is displayed.
+ $this->assertSession()->pageTextContains('Fields that apply to all languages are hidden to avoid conflicting changes.');
+ $edit_path = $entity->toUrl('edit-form')->toString();
+ $link_xpath = '//a[@href=:edit_path and text()="Edit them on the original language form"]';
+ $elements = $this->xpath($link_xpath, [':edit_path' => $edit_path]);
+ $this->assertNotEmpty($elements);
+ }
+
+}
diff --git a/core/modules/node/src/Form/NodeRevisionRevertTranslationForm.php b/core/modules/node/src/Form/NodeRevisionRevertTranslationForm.php
index 0c68d8b..eb07b7a 100644
--- a/core/modules/node/src/Form/NodeRevisionRevertTranslationForm.php
+++ b/core/modules/node/src/Form/NodeRevisionRevertTranslationForm.php
@@ -88,10 +88,15 @@ class NodeRevisionRevertTranslationForm extends NodeRevisionRevertForm {
$this->langcode = $langcode;
$form = parent::buildForm($form, $form_state, $node_revision);
+ // Unless untranslatable fields are configured to affect only the default
+ // translation, we need to ask the user whether they should be included in
+ // the revert process.
+ $default_translation_affected = $this->revision->isDefaultTranslationAffectedOnly();
$form['revert_untranslated_fields'] = [
'#type' => 'checkbox',
'#title' => $this->t('Revert content shared among translations'),
- '#default_value' => FALSE,
+ '#default_value' => $default_translation_affected && $this->revision->getTranslation($this->langcode)->isDefaultTranslation(),
+ '#access' => !$default_translation_affected,
];
return $form;
diff --git a/core/modules/system/tests/modules/entity_test/entity_test.module b/core/modules/system/tests/modules/entity_test/entity_test.module
index 7d4df70..a934ad6 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.module
+++ b/core/modules/system/tests/modules/entity_test/entity_test.module
@@ -217,6 +217,9 @@ function entity_test_entity_bundle_info_alter(&$bundles) {
if ($state->get('entity_test.translation')) {
foreach ($all_bundle_info as $bundle_name => &$bundle_info) {
$bundle_info['translatable'] = TRUE;
+ if ($state->get('entity_test.untranslatable_fields.default_translation_affected')) {
+ $bundle_info['untranslatable_fields.default_translation_affected'] = TRUE;
+ }
}
}
}
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRev.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRev.php
index 724385f..b4493e3 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRev.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRev.php
@@ -58,7 +58,8 @@ class EntityTestMulRev extends EntityTestRev {
$fields['non_mul_field'] = BaseFieldDefinition::create('string')
->setLabel(t('Non translatable'))
- ->setDescription(t('A non-translatable string field'));
+ ->setDescription(t('A non-translatable string field'))
+ ->setRevisionable(TRUE);
return $fields;
}
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRevChanged.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRevChanged.php
index 3913075..13a169d 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRevChanged.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRevChanged.php
@@ -71,6 +71,7 @@ class EntityTestMulRevChanged extends EntityTestMulChanged {
$fields['name']->setRevisionable(TRUE);
$fields['user_id']->setRevisionable(TRUE);
$fields['changed']->setRevisionable(TRUE);
+ $fields['not_translatable']->setRevisionable(TRUE);
return $fields;
}