diff --git a/core/modules/user/src/Form/UserPasswordForm.php b/core/modules/user/src/Form/UserPasswordForm.php
index 04f0bf629c..b881d6f053 100644
--- a/core/modules/user/src/Form/UserPasswordForm.php
+++ b/core/modules/user/src/Form/UserPasswordForm.php
@@ -168,11 +168,9 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
    * {@inheritdoc}
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
-    $langcode = $this->languageManager->getCurrentLanguage()->getId();
-
     $account = $form_state->getValue('account');
     // Mail one time login URL and instructions using current language.
-    $mail = _user_mail_notify('password_reset', $account, $langcode);
+    $mail = _user_mail_notify('password_reset', $account);
     if (!empty($mail)) {
       $this->logger('user')->notice('Password reset instructions mailed to %name at %email.', ['%name' => $account->getAccountName(), '%email' => $account->getEmail()]);
       $this->messenger()->addStatus($this->t('Further instructions have been sent to your email address.'));
diff --git a/core/modules/user/tests/src/Functional/UserPasswordResetTest.php b/core/modules/user/tests/src/Functional/UserPasswordResetTest.php
index d6a9af5cd3..7d65b4786c 100644
--- a/core/modules/user/tests/src/Functional/UserPasswordResetTest.php
+++ b/core/modules/user/tests/src/Functional/UserPasswordResetTest.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Database\Database;
 use Drupal\Core\Test\AssertMailTrait;
 use Drupal\Core\Url;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\Tests\BrowserTestBase;
 use Drupal\user\Entity\User;
 
@@ -27,12 +28,19 @@ class UserPasswordResetTest extends BrowserTestBase {
    */
   protected $account;
 
+  /**
+   * Language manager object.
+   *
+   * @var \Drupal\language\LanguageManagerInterface
+   */
+  protected $languageManager;
+
   /**
    * Modules to enable.
    *
    * @var array
    */
-  protected static $modules = ['block'];
+  protected static $modules = ['block', 'language'];
 
   /**
    * {@inheritdoc}
@@ -205,6 +213,105 @@ public function testUserPasswordReset() {
     $this->assertSession()->statusCodeEquals(403);
   }
 
+  /**
+   * Tests password reset functionality when user has set preferred language.
+   *
+   * @dataProvider languagePrefixTestProvider
+   */
+  public function testUserPasswordResetPreferredLanguage($setPreferredLangcode, $activeLangcode, $prefix, $visitingUrl, $expectedResetUrl, $unexpectedResetUrl) {
+    // Set two new languages.
+    ConfigurableLanguage::createFromLangcode('fr')->save();
+    ConfigurableLanguage::createFromLangcode('zh-hant')->save();
+
+    $this->languageManager = \Drupal::languageManager();
+
+    // Set language prefixes.
+    $config = $this->config('language.negotiation');
+    $config->set('url.prefixes', ['en' => '', 'fr' => 'fr', 'zh-hant' => 'zh'])->save();
+    \Drupal::configFactory()->reset('language.negotiation');
+    $this->rebuildContainer();
+
+    $this->account->preferred_langcode = $setPreferredLangcode;
+    $this->account->save();
+    $this->assertSame($setPreferredLangcode, $this->account->getPreferredLangcode(FALSE));
+
+    // Test Default langcode is different from active langcode when visiting different.
+    if ($setPreferredLangcode !== 'en') {
+      $this->assertLangcodeDifferent($prefix, $activeLangcode, 'en');
+    }
+
+    // Test password reset with language prefixes.
+    $this->assertLanguagePrefixResetUrl($visitingUrl, $expectedResetUrl, $unexpectedResetUrl);
+  }
+
+  public function languagePrefixTestProvider() {
+    return [
+      'Test language prefix set as \'\', visiting default with preferred language as en' => [
+        'setPreferredLangcode' => 'en',
+        'activeLangcode' => 'en',
+        'prefix' => '',
+        'visitingUrl' => 'user/password',
+        'expectedResetUrl' => 'user/reset',
+        'unexpectedResetUrl' => 'en/user/reset',
+      ],
+      'Test language prefix set as fr, visiting zh with preferred language as fr' => [
+        'setPreferredLangcode' => 'fr',
+        'activeLangcode' => 'fr',
+        'prefix' => 'fr',
+        'visitingUrl' => 'zh/user/password',
+        'expectedResetUrl' => 'fr/user/reset',
+        'unexpectedResetUrl' => 'zh/user/reset',
+      ],
+      'Test language prefix set as zh, visiting zh with preferred language as \'\'' => [
+        'setPreferredLangcode' => '',
+        'activeLangcode' => 'zh-hant',
+        'prefix' => 'zh',
+        'visitingUrl' => 'zh/user/password',
+        'expectedResetUrl' => 'user/reset',
+        'unexpectedResetUrl' => 'zh/user/reset',
+      ],
+    ];
+  }
+
+  /**
+   * Helper method for language prefix and reset url assertion.
+   *
+   * @param string $url
+   *   Url for drupalGet.
+   * @param string $expectContainString
+   *   String to expect from reset Url.
+   * @param string $expectNotContainString
+   *   String not to expect from reset Url.
+   */
+  public function assertLanguagePrefixResetUrl($url, $expectContainString, $expectNotContainString) {
+    $this->drupalGet($url);
+    $edit = ['name' => $this->account->getAccountName()];
+    $this->submitForm($edit, t('Submit'));
+    $this->assertValidPasswordReset($edit['name']);
+
+    $resetURL = $this->getResetURL();
+    $this->assertStringContainsString($expectContainString, $resetURL);
+    $this->assertStringNotContainsString($expectNotContainString, $resetURL);
+  }
+
+  /**
+   * Helper method to assert expected active language and
+   * default language is different.
+   *
+   * @param string $prefix
+   *   The prefix to visit /user/password.
+   * @param string $activeLangcode
+   *   The active language code of your current session.
+   * @param string $defaultLangcode
+   *   The default language code of your site settings.
+   */
+  public function assertLangcodeDifferent($prefix, $activeLangcode, $defaultLangcode) {
+    $this->drupalGet($prefix . '/user/password');
+    $this->assertSame($activeLangcode, $this->drupalGetHeader('Content-language'));
+    $this->assertSame($defaultLangcode, $this->languageManager->getDefaultLanguage()->getId());
+    $this->assertNotSame($this->languageManager->getDefaultLanguage()->getId(), $this->drupalGetHeader('Content-language'));
+  }
+
   /**
    * Retrieves password reset email and extracts the login link.
    */
