diff --git a/core/lib/Drupal/Core/Entity/EntityFieldManager.php b/core/lib/Drupal/Core/Entity/EntityFieldManager.php index ef6ac0e41a..5919f9f243 100644 --- a/core/lib/Drupal/Core/Entity/EntityFieldManager.php +++ b/core/lib/Drupal/Core/Entity/EntityFieldManager.php @@ -325,11 +325,10 @@ protected function buildBaseFieldDefinitions($entity_type_id) { * {@inheritdoc} */ public function getFieldDefinitions($entity_type_id, $bundle) { - $langcode = $this->languageManager->getCurrentLanguage()->getId(); - if (!isset($this->fieldDefinitions[$entity_type_id][$bundle][$langcode])) { + if (!isset($this->fieldDefinitions[$entity_type_id][$bundle])) { $base_field_definitions = $this->getBaseFieldDefinitions($entity_type_id); // Not prepared, try to load from cache. - $cid = 'entity_bundle_field_definitions:' . $entity_type_id . ':' . $bundle . ':' . $langcode; + $cid = 'entity_bundle_field_definitions:' . $entity_type_id . ':' . $bundle . ':' . $this->languageManager->getCurrentLanguage()->getId(); if ($cache = $this->cacheGet($cid)) { $bundle_field_definitions = $cache->data; } @@ -342,9 +341,9 @@ public function getFieldDefinitions($entity_type_id, $bundle) { // base fields, merge them together. Use array_replace() to replace base // fields with by bundle overrides and keep them in order, append // additional by bundle fields. - $this->fieldDefinitions[$entity_type_id][$bundle][$langcode] = array_replace($base_field_definitions, $bundle_field_definitions); + $this->fieldDefinitions[$entity_type_id][$bundle] = array_replace($base_field_definitions, $bundle_field_definitions); } - return $this->fieldDefinitions[$entity_type_id][$bundle][$langcode]; + return $this->fieldDefinitions[$entity_type_id][$bundle]; } /** diff --git a/core/modules/language/tests/src/Functional/ConfigurableLanguageManagerTest.php b/core/modules/language/tests/src/Functional/ConfigurableLanguageManagerTest.php index d36aee0ac7..f1732920c4 100644 --- a/core/modules/language/tests/src/Functional/ConfigurableLanguageManagerTest.php +++ b/core/modules/language/tests/src/Functional/ConfigurableLanguageManagerTest.php @@ -3,6 +3,9 @@ namespace Drupal\Tests\language\Functional; use Drupal\Core\Cache\Cache; +use Drupal\Core\Entity\Entity\EntityFormDisplay; +use Drupal\field\Entity\FieldConfig; +use Drupal\field\Entity\FieldStorageConfig; use Drupal\language\Entity\ConfigurableLanguage; use Drupal\language\Entity\ContentLanguageSettings; use Drupal\node\Entity\Node; @@ -186,4 +189,76 @@ public function testUrlContentTranslationWithSessionLanguage() { $assert_session->pageTextContains('Powered by'); } + /** + * Tests translation of the user profile edit form. + * + * The user profile edit form is a special case when used with the preferred + * admin language negotiator because of the recursive way that the negotiator + * is called. + */ + public function testUserProfileTranslationWithPreferredAdminLanguage() { + $assert_session = $this->assertSession(); + // Set the interface language to use the preferred administration language. + /** @var \Drupal\language\LanguageNegotiatorInterface $language_negotiator */ + $language_negotiator = \Drupal::getContainer()->get('language_negotiator'); + $language_negotiator->saveConfiguration('language_interface', [ + 'language-user-admin' => 1, + 'language-selected' => 2, + ]); + + // Create a field on the user entity. + $field_name = mb_strtolower($this->randomMachineName()); + $label = mb_strtolower($this->randomMachineName()); + $field_label_en = "English $label"; + $field_label_es = "EspaƱol $label"; + + $field_storage = FieldStorageConfig::create([ + 'field_name' => $field_name, + 'entity_type' => 'user', + 'type' => 'string', + ]); + $field_storage->save(); + + $instance = FieldConfig::create([ + 'field_storage' => $field_storage, + 'bundle' => 'user', + 'label' => $field_label_en, + ]); + $instance->save(); + + // Add a Spanish translation. + \Drupal::languageManager() + ->getLanguageConfigOverride('es', "field.field.user.user.$field_name") + ->set('label', $field_label_es) + ->save(); + + // Add the new field to the edit form. + EntityFormDisplay::create([ + 'targetEntityType' => 'user', + 'bundle' => 'user', + 'mode' => 'default', + 'status' => TRUE, + ]) + ->setComponent($field_name, [ + 'type' => 'string_textfield', + ]) + ->save(); + + $user_id = \Drupal::currentUser()->id(); + $this->drupalGet("/user/$user_id/edit"); + // Admin language choice is "No preference" so we should get the default. + $assert_session->pageTextContains($field_label_en); + $assert_session->pageTextNotContains($field_label_es); + + // Set admin language to Spanish. + $this->drupalPostForm(NULL, ['edit-preferred-admin-langcode' => 'es'], 'edit-submit'); + $assert_session->pageTextContains($field_label_es); + $assert_session->pageTextNotContains($field_label_en); + + // Set admin language to English. + $this->drupalPostForm(NULL, ['edit-preferred-admin-langcode' => 'en'], 'edit-submit'); + $assert_session->pageTextContains($field_label_en); + $assert_session->pageTextNotContains($field_label_es); + } + }