From d9519bae252af0c3d3fb557bc15c35e57ece7d83 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Sun, 2 Jun 2019 10:12:49 +0100
Subject: [PATCH] Issue #3048196 by tetranz, Tom Konda, Berdir: A field title
 isn't translated if "Account administration pages" plugin is enabled

---
 .../Drupal/Core/Entity/EntityFieldManager.php |  9 ++-
 .../ConfigurableLanguageManagerTest.php       | 75 +++++++++++++++++++
 2 files changed, 80 insertions(+), 4 deletions(-)

diff --git a/core/lib/Drupal/Core/Entity/EntityFieldManager.php b/core/lib/Drupal/Core/Entity/EntityFieldManager.php
index 253439decf85..75f25eb6294f 100644
--- a/core/lib/Drupal/Core/Entity/EntityFieldManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityFieldManager.php
@@ -325,10 +325,11 @@ protected function buildBaseFieldDefinitions($entity_type_id) {
    * {@inheritdoc}
    */
   public function getFieldDefinitions($entity_type_id, $bundle) {
-    if (!isset($this->fieldDefinitions[$entity_type_id][$bundle])) {
+    $langcode = $this->languageManager->getCurrentLanguage()->getId();
+    if (!isset($this->fieldDefinitions[$entity_type_id][$bundle][$langcode])) {
       $base_field_definitions = $this->getBaseFieldDefinitions($entity_type_id);
       // Not prepared, try to load from cache.
-      $cid = 'entity_bundle_field_definitions:' . $entity_type_id . ':' . $bundle . ':' . $this->languageManager->getCurrentLanguage()->getId();
+      $cid = 'entity_bundle_field_definitions:' . $entity_type_id . ':' . $bundle . ':' . $langcode;
       if ($cache = $this->cacheGet($cid)) {
         $bundle_field_definitions = $cache->data;
       }
@@ -341,9 +342,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] = array_replace($base_field_definitions, $bundle_field_definitions);
+      $this->fieldDefinitions[$entity_type_id][$bundle][$langcode] = array_replace($base_field_definitions, $bundle_field_definitions);
     }
-    return $this->fieldDefinitions[$entity_type_id][$bundle];
+    return $this->fieldDefinitions[$entity_type_id][$bundle][$langcode];
   }
 
   /**
diff --git a/core/modules/language/tests/src/Functional/ConfigurableLanguageManagerTest.php b/core/modules/language/tests/src/Functional/ConfigurableLanguageManagerTest.php
index d36aee0ac70d..f1732920c4f8 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);
+  }
+
 }
-- 
GitLab