diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php index e242544..66d2647 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php @@ -259,6 +259,23 @@ public function postCreate(EntityStorageInterface $storage) { /** * {@inheritdoc} */ + public static function postLoad(EntityStorageInterface $storage, array &$entities) { + $entity_load_langcode = \Drupal::configFactory()->get('system.site')->get('entity_load_langcode'); + if ($entity_load_langcode == LanguageInterface::TYPE_CONTENT) { + $langcode = \Drupal::languageManager()->getCurrentLanguage($entity_load_langcode)->getId(); + /** @var \Drupal\Core\Entity\ContentEntityBase $entity */ + foreach ($entities as $entity) { + if ($entity->hasTranslation($langcode)) { + $entity->activeLangcode = $langcode; + } + } + } + parent::postLoad($storage, $entities); + } + + /** + * {@inheritdoc} + */ public function setNewRevision($value = TRUE) { if (!$this->getEntityType()->hasKey('revision')) { throw new \LogicException("Entity type {$this->getEntityTypeId()} does not support revisions."); diff --git a/core/modules/system/config/install/system.site.yml b/core/modules/system/config/install/system.site.yml index b5a932b..600a953 100644 --- a/core/modules/system/config/install/system.site.yml +++ b/core/modules/system/config/install/system.site.yml @@ -10,3 +10,4 @@ admin_compact_mode: false weight_select_max: 100 langcode: en default_langcode: en +entity_load_langcode: 'x-default' diff --git a/core/modules/system/config/schema/system.schema.yml b/core/modules/system/config/schema/system.schema.yml index c23ed7e..464f0a7 100644 --- a/core/modules/system/config/schema/system.schema.yml +++ b/core/modules/system/config/schema/system.schema.yml @@ -38,6 +38,9 @@ system.site: default_langcode: type: string label: 'Site default language code' + entity_load_langcode: + type: string + label: 'The language type for which to load entities by default' mail_notification: type: string label: 'Notification email address' diff --git a/core/modules/system/system.install b/core/modules/system/system.install index 6dc2663..47f0593 100644 --- a/core/modules/system/system.install +++ b/core/modules/system/system.install @@ -13,6 +13,7 @@ use Drupal\Core\Url; use Drupal\Core\Database\Database; use Drupal\Core\DrupalKernel; +use Drupal\Core\Language\LanguageInterface; use Drupal\Core\Site\Settings; use Drupal\Core\StreamWrapper\PrivateStream; use Drupal\Core\StreamWrapper\PublicStream; @@ -1794,3 +1795,19 @@ function system_update_8203() { ->set('logging', 1) ->save(TRUE); } + +/** + * @addtogroup updates-8.3.0 + * @{ + */ + +/** + * Add the new system site setting "entity_load_langcode". + */ +function system_update_8300() { + \Drupal::configFactory()->getEditable('system.site')->set('entity_load_langcode', LanguageInterface::LANGCODE_DEFAULT)->save(TRUE); +} + +/** + * @} End of "addtogroup updates-8.3.0". + */ diff --git a/core/tests/Drupal/KernelTests/Core/Entity/EntityTranslationTest.php b/core/tests/Drupal/KernelTests/Core/Entity/EntityTranslationTest.php index ed6140d..36ff690 100644 --- a/core/tests/Drupal/KernelTests/Core/Entity/EntityTranslationTest.php +++ b/core/tests/Drupal/KernelTests/Core/Entity/EntityTranslationTest.php @@ -5,6 +5,7 @@ use Drupal\Component\Utility\SafeMarkup; use Drupal\Core\Language\LanguageInterface; use Drupal\Core\TypedData\TranslationStatusInterface; +use Drupal\entity_test\Entity\EntityTestMul; use Drupal\entity_test\Entity\EntityTestMulRev; use Drupal\field\Entity\FieldConfig; use Drupal\field\Entity\FieldStorageConfig; @@ -1013,4 +1014,71 @@ public function testTranslationStatus() { } } + /** + * Tests the translation of the loaded entity. + */ + public function testEntityLoadLanguage() { + // Test the default behavior, where the entity is loaded in its default + // translation. + $count = count($this->langcodes); + for ($i = 0; $i < $count; $i++) { + $default_langcode = $this->langcodes[$i]; + $entity = EntityTestMul::create([ + 'name' => $this->randomString(), + 'langcode' => $default_langcode, + ]); + $entity->save(); + + foreach ($this->langcodes as $langcode) { + if ($langcode != $default_langcode) { + $entity->addTranslation($langcode); + } + } + $entity->save(); + + $entity = \Drupal::entityTypeManager()->getStorage($entity->getEntityTypeId())->loadUnchanged($entity->id()); + $this->assertEquals($entity->getUntranslated()->language()->getId(), $entity->language()->getId()); + } + + // Test the new behavior, where the entity is loaded in the current content + // language. + \Drupal::configFactory()->getEditable('system.site')->set('entity_load_langcode', LanguageInterface::TYPE_CONTENT)->save(TRUE); + $default_content_langcode = $this->languageManager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->getId(); + + // Test when the entity has a translation for the current content language. + $default_langcode = NULL; + foreach ($this->langcodes as $langcode) { + $default_langcode = $langcode != $default_content_langcode ? $langcode : $default_langcode; + } + + $entity = EntityTestMul::create([ + 'name' => $this->randomString(), + 'langcode' => $default_langcode, + ]); + $entity->save(); + $entity->addTranslation($default_content_langcode) + ->save(); + + $entity = \Drupal::entityTypeManager()->getStorage($entity->getEntityTypeId())->loadUnchanged($entity->id()); + $this->assertEquals($default_content_langcode, $entity->language()->getId()); + + // Test when the entity doesn't have a translation for the current content + // language. + $langcodes = array_diff($this->langcodes, [$default_content_langcode]); + + $entity = EntityTestMul::create([ + 'name' => $this->randomString(), + 'langcode' => $langcodes[0], + ]); + $entity->save(); + + for ($i = 1; $i < count($langcodes); $i++) { + $entity->addTranslation($langcodes[$i]); + } + $entity->save(); + + $entity = \Drupal::entityTypeManager()->getStorage($entity->getEntityTypeId())->loadUnchanged($entity->id()); + $this->assertEquals($entity->getUntranslated()->language()->getId(), $entity->language()->getId()); + } + }