WordPress.org

Make WordPress Core

Ticket #39295: 39295.2.alt.diff

File 39295.2.alt.diff, 1.8 KB (added by SergeyBiryukov, 4 months ago)
  • src/wp-includes/l10n.php

     
    8888 *
    8989 * @since 4.7.0
    9090 *
     91 * @global string $locale The current locale.
     92 *
    9193 * @param int|WP_User $user_id User's ID or a WP_User object. Defaults to current user.
    9294 * @return string The locale of the user.
    9395 */
    9496function get_user_locale( $user_id = 0 ) {
     97        global $locale;
     98
    9599        $user = false;
    96100        if ( 0 === $user_id && function_exists( 'wp_get_current_user' ) ) {
    97101                $user = wp_get_current_user();
     
    101105                $user = get_user_by( 'id', $user_id );
    102106        }
    103107
    104         if ( ! $user ) {
    105                 return get_locale();
     108        if ( $user && $user->locale ) {
     109                $user_locale = $user->locale;
     110        } elseif ( ! doing_filter( 'locale' ) ) {
     111                $user_locale = get_locale();
     112        } else {
     113                $user_locale = $locale;
    106114        }
    107115
    108         $locale = $user->locale;
    109         return $locale ? $locale : get_locale();
     116        return $user_locale;
    110117}
    111118
    112119/**
  • tests/phpunit/tests/l10n/getUserLocale.php

     
    136136                $user_locale = get_user_locale( 'string' );
    137137                $this->assertSame( get_locale(), $user_locale );
    138138        }
     139
     140        /**
     141         * @ticket 39295
     142         */
     143        public function test_get_user_locale_as_locale_filter_works_as_expected() {
     144                wp_set_current_user( 0 );
     145                switch_to_locale( 'de_DE');
     146
     147                $user_locale1 = get_user_locale();
     148
     149                add_filter( 'locale', 'get_user_locale' );
     150
     151                $user_locale2 = get_user_locale();
     152
     153                remove_filter( 'locale', 'get_user_locale' );
     154
     155                restore_current_locale();
     156
     157                $this->assertSame( 'de_DE', $user_locale1 );
     158                $this->assertSame( 'en_US', $user_locale2 );
     159        }
    139160}