diff --git a/core/lib/Drupal/Core/Session/UserSession.php b/core/lib/Drupal/Core/Session/UserSession.php
index 912d755..4a76326 100644
--- a/core/lib/Drupal/Core/Session/UserSession.php
+++ b/core/lib/Drupal/Core/Session/UserSession.php
@@ -201,7 +201,7 @@ function getPreferredAdminLangcode($default = NULL) {
       return $language_list[$this->preferred_admin_langcode]->id;
     }
     else {
-      return $default ? $default : language_default()->id;
+      return !is_null($default) ? $default : language_default()->id;
     }
   }
 
diff --git a/core/modules/user/src/AccountForm.php b/core/modules/user/src/AccountForm.php
index a72c497..54716bd 100644
--- a/core/modules/user/src/AccountForm.php
+++ b/core/modules/user/src/AccountForm.php
@@ -248,7 +248,7 @@ public function form(array $form, FormStateInterface $form_state) {
 
     $user_preferred_langcode = $register ? $language_interface->id : $account->getPreferredLangcode();
 
-    $user_preferred_admin_langcode = $register ? $language_interface->id : $account->getPreferredAdminLangcode();
+    $user_preferred_admin_langcode = $register ? $language_interface->id : $account->getPreferredAdminLangcode('');
 
     // Is the user preferred language added?
     $user_language_added = FALSE;
@@ -286,6 +286,8 @@ public function form(array $form, FormStateInterface $form_state) {
       '#languages' => LanguageInterface::STATE_CONFIGURABLE,
       '#default_value' => $user_preferred_admin_langcode,
       '#access' => $show_admin_language,
+      '#empty_option' => $this->t('- No preference -'),
+      '#empty_value' => '',
     );
     // User entities contain both a langcode property (for identifying the
     // language of the entity data) and a preferred_langcode property (see
diff --git a/core/modules/user/src/Entity/User.php b/core/modules/user/src/Entity/User.php
index 307cfc2..6e2d44c 100644
--- a/core/modules/user/src/Entity/User.php
+++ b/core/modules/user/src/Entity/User.php
@@ -387,7 +387,7 @@ function getPreferredAdminLangcode($default = NULL) {
       return $language_list[$preferred_langcode]->id;
     }
     else {
-      return $default ? $default : language_default()->id;
+      return !is_null($default) ? $default : language_default()->id;
     }
   }
 
diff --git a/core/modules/user/src/Plugin/LanguageNegotiation/LanguageNegotiationUserAdmin.php b/core/modules/user/src/Plugin/LanguageNegotiation/LanguageNegotiationUserAdmin.php
index cdd2695..3ce8184 100644
--- a/core/modules/user/src/Plugin/LanguageNegotiation/LanguageNegotiationUserAdmin.php
+++ b/core/modules/user/src/Plugin/LanguageNegotiation/LanguageNegotiationUserAdmin.php
@@ -92,17 +92,12 @@ public static function create(ContainerInterface $container, array $configuratio
   public function getLangcode(Request $request = NULL) {
     $langcode = NULL;
 
-    // User preference (only for authenticated users).
-    if ($this->languageManager && $this->currentUser->isAuthenticated() && $this->isAdminPath($request)) {
-      $preferred_admin_langcode = $this->currentUser->getPreferredAdminLangcode();
-      $default_langcode = $this->languageManager->getDefaultLanguage()->id;
-      $languages = $this->languageManager->getLanguages();
-      if (!empty($preferred_admin_langcode) && $preferred_admin_langcode != $default_langcode && isset($languages[$preferred_admin_langcode])) {
-        $langcode = $preferred_admin_langcode;
-      }
+    // User preference (only for administrators).
+    if ($this->currentUser->hasPermission('access administration pages') && ($preferred_admin_langcode = $this->currentUser->getPreferredAdminLangcode('')) && $this->isAdminPath($request)) {
+      $langcode = $preferred_admin_langcode;
     }
 
-    // No language preference from the user or not on an admin path.
+    // Not an admin, no admin language preference or not on an admin path.
     return $langcode;
   }
 
