diff --git a/core/modules/user/src/Form/UserPasswordForm.php b/core/modules/user/src/Form/UserPasswordForm.php
index b805641989..85742e723e 100644
--- a/core/modules/user/src/Form/UserPasswordForm.php
+++ b/core/modules/user/src/Form/UserPasswordForm.php
@@ -133,9 +133,16 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
    * {@inheritdoc}
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
+    $account = $form_state->getValue('account');
+
+    // Get the UI langcode as default lang.
     $langcode = $this->languageManager->getCurrentLanguage()->getId();
 
-    $account = $form_state->getValue('account');
+    // When the user has a preferred lang, use it instead of UI lang.
+    if ($account->getPreferredLangcode()) {
+      $langcode = $account->getPreferredLangcode();
+    }
+
     // Mail one time login URL and instructions using current language.
     $mail = _user_mail_notify('password_reset', $account, $langcode);
     if (!empty($mail)) {
diff --git a/core/modules/user/tests/src/Functional/UserPasswordResetTest.php b/core/modules/user/tests/src/Functional/UserPasswordResetTest.php
index ba71ddacee..37c7a0d71a 100644
--- a/core/modules/user/tests/src/Functional/UserPasswordResetTest.php
+++ b/core/modules/user/tests/src/Functional/UserPasswordResetTest.php
@@ -8,6 +8,7 @@
 use Drupal\Core\Url;
 use Drupal\Tests\system\Functional\Cache\PageCacheTagsTestBase;
 use Drupal\user\Entity\User;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Ensure that password reset methods work as expected.
@@ -32,7 +33,10 @@ class UserPasswordResetTest extends PageCacheTagsTestBase {
    *
    * @var array
    */
-  public static $modules = ['block'];
+  public static $modules = [
+    'block',
+    'locale',
+  ];
 
   /**
    * {@inheritdoc}
@@ -59,6 +63,10 @@ protected function setUp() {
       ->fields(['login' => $account->getLastLoginTime()])
       ->condition('uid', $account->id())
       ->execute();
+
+    // Create two languages: Spanish and German.
+    ConfigurableLanguage::createFromLangcode('fr')->save();
+    ConfigurableLanguage::createFromLangcode('es')->save();
   }
 
   /**
@@ -324,4 +332,48 @@ public function testResetImpersonation() {
     $this->assertText('You have tried to use a one-time login link that has either been used or is no longer valid. Please request a new one using the form below.');
   }
 
+  /**
+   * Test the locale on the user password reset page.
+   *
+   * @dataProvider UserPasswordResetLocaleProvider
+   */
+  public function testUserPasswordResetLocale($locale, $expected) {
+    // Set preferred langcode for user.
+    $this->account->preferred_langcode = $locale;
+    $this->account->save();
+
+    $edit['name'] = $this->account->getUsername();
+    $this->drupalPostForm('user/password', $edit, t('Submit'));
+    $resetURL = $this->getResetURL();
+    $this->drupalGet($resetURL);
+
+    // Assert the page is displayed in the expected langcode.
+    $language = $this->drupalGetHeaders()['Content-language'];
+    $this->assertEquals([$expected], $language);
+  }
+
+  /**
+   * Provides locales to tests on user password reset page.
+   */
+  public function userPasswordResetLocaleProvider() {
+    return [
+      'Assert default language' => [
+        NULL,
+        'en',
+      ],
+      'Assert the prefered lang - when same as site default lang' => [
+        'en',
+        'en',
+      ],
+      'Assert on unknown langcode the default lang is used' => [
+        'blah-blah',
+        'en',
+      ],
+      'Assert an alternative prefered lang is used' => [
+        'es',
+        'es',
+      ]
+    ];
+  }
+
 }
