diff --git a/src/wp-includes/l10n.php b/src/wp-includes/l10n.php index 8444bf2c82..951c1c316b 100644 --- a/src/wp-includes/l10n.php +++ b/src/wp-includes/l10n.php @@ -145,12 +145,14 @@ function determine_locale() { } else { $determined_locale = sanitize_locale_name( $_COOKIE['wp_lang'] ); } - } else if ( - ( isset( $_GET['_locale'] ) && 'user' === $_GET['_locale'] && wp_is_json_request() ) || - is_admin() + } elseif ( + is_admin() || + ( isset( $_GET['_locale'] ) && 'user' === $_GET['_locale'] && wp_is_json_request() ) ) { $determined_locale = get_user_locale(); - } else { + } + + if ( ! $determined_locale ) { $determined_locale = get_locale(); } diff --git a/tests/phpunit/tests/l10n/determineLocale.php b/tests/phpunit/tests/l10n/determineLocale.php index 702690e6c1..a2c3febd4a 100644 --- a/tests/phpunit/tests/l10n/determineLocale.php +++ b/tests/phpunit/tests/l10n/determineLocale.php @@ -211,6 +211,22 @@ class Tests_L10n_DetermineLocale extends WP_UnitTestCase { $this->assertSame( 'siteLocale', determine_locale() ); } + public function test_wp_login_get_param_on_login_page_incorrect_string() { + add_filter( + 'locale', + static function() { + return 'siteLocale'; + } + ); + + wp_set_current_user( self::$user_id ); + + $GLOBALS['pagenow'] = 'wp-login.php'; + $_GET['wp_lang'] = '###'; // Something sanitize_locale_name() strips away. + + $this->assertSame( 'siteLocale', determine_locale() ); + } + public function test_wp_login_cookie_not_on_login_page() { add_filter( 'locale',