Make WordPress Core

Changeset 39169


Ignore:
Timestamp:
11/08/2016 11:00:38 PM (8 years ago)
Author:
swissspidy
Message:

I18N: Add ability to change user's locale back to site's locale.

Previously there was no way to remove the user locale setting again, even though that might be desirable.

This adds a new 'Site Default' option to the user-specific language setting by introducing a new show_site_locale_default argument to wp_dropdown_languages().

Props ocean90.
See #29783.
Fixes #38632.

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/user.php

    r38705 r39169  
    9999        if ( isset( $_POST['locale'] ) ) {
    100100            $locale = sanitize_text_field( $_POST['locale'] );
    101             if ( ! in_array( $locale, get_available_languages(), true ) ) {
     101            if ( 'site-default' === $locale ) {
    102102                $locale = '';
     103            } elseif ( ! in_array( $locale, get_available_languages(), true ) ) {
     104                $locale = 'en_US';
    103105            }
    104106
    105             $user->locale = ( '' === $locale ) ? 'en_US' : $locale;
     107            $user->locale = $locale;
    106108        }
    107109    }
  • trunk/src/wp-admin/user-edit.php

    r39040 r39169  
    285285
    286286        if ( 'en_US' === $user_locale ) {
    287             $user_locale = false;
    288         } elseif ( ! in_array( $user_locale, $languages, true ) ) {
    289             $user_locale = get_locale();
     287            $user_locale = '';
     288        } elseif ( '' === $user_locale || ! in_array( $user_locale, $languages, true ) ) {
     289            $user_locale = 'site-default';
    290290        }
    291291
     
    295295            'selected'                    => $user_locale,
    296296            'languages'                   => $languages,
    297             'show_available_translations' => false
     297            'show_available_translations' => false,
     298            'show_site_locale_default'    => true
    298299        ) );
    299300        ?>
  • trunk/src/wp-includes/l10n.php

    r39134 r39169  
    10491049 * @since 4.0.0
    10501050 * @since 4.3.0 Introduced the `echo` argument.
     1051 * @since 4.7.0 Introduced the `show_site_locale_default` argument.
    10511052 *
    10521053 * @see get_available_languages()
     
    10661067 *                                                  boolean equivalents. Default 1.
    10671068 *     @type bool     $show_available_translations  Whether to show available translations. Default true.
     1069 *     @type bool     $show_site_locale_default     Whether to show an option to fall back to the site's locale. Default false.
    10681070 * }
    10691071 * @return string HTML content
     
    10791081        'echo'         => 1,
    10801082        'show_available_translations' => true,
     1083        'show_site_locale_default'    => false,
    10811084    ) );
     1085
     1086    // English (United States) uses an empty string for the value attribute.
     1087    if ( 'en_US' === $args['selected'] ) {
     1088        $args['selected'] = '';
     1089    }
    10821090
    10831091    $translations = $args['translations'];
     
    11231131        $structure[] = '<optgroup label="' . esc_attr_x( 'Installed', 'translations' ) . '">';
    11241132    }
    1125     $structure[] = '<option value="" lang="en" data-installed="1">English (United States)</option>';
     1133
     1134    if ( $args['show_site_locale_default'] ) {
     1135        $structure[] = sprintf(
     1136            '<option value="site-default" data-installed="1"%s>%s</option>',
     1137            selected( 'site-default', $args['selected'], false ),
     1138            _x( 'Site Default', 'default site language' )
     1139        );
     1140    }
     1141
     1142    $structure[] = sprintf(
     1143        '<option value="" lang="en" data-installed="1"%s>English (United States)</option>',
     1144        selected( '', $args['selected'], false )
     1145    );
     1146
    11261147    foreach ( $languages as $language ) {
    11271148        $structure[] = sprintf(
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php

    r39126 r39169  
    10751075                    'description' => __( 'Locale for the resource.' ),
    10761076                    'type'        => 'string',
    1077                     'enum'        => array_merge( array( 'en_US' ), get_available_languages() ),
     1077                    'enum'        => array_merge( array( '', 'en_US' ), get_available_languages() ),
    10781078                    'context'     => array( 'edit' ),
    10791079                ),
  • trunk/tests/phpunit/tests/l10n.php

    r39125 r39169  
    101101
    102102    /**
     103     * @ticket 38632
     104     */
     105    function test_wp_dropdown_languages_site_default() {
     106        $args = array(
     107            'id'                       => 'foo',
     108            'name'                     => 'bar',
     109            'languages'                => array( 'de_DE' ),
     110            'translations'             => $this->wp_dropdown_languages_filter(),
     111            'selected'                 => 'de_DE',
     112            'echo'                     => false,
     113            'show_site_locale_default' => true,
     114        );
     115        $actual = wp_dropdown_languages( $args );
     116
     117        $this->assertContains( 'id="foo"', $actual );
     118        $this->assertContains( 'name="bar"', $actual );
     119        $this->assertContains( '<option value="site-default" data-installed="1">Site Default</option>', $actual );
     120        $this->assertContains( '<option value="" lang="en" data-installed="1">English (United States)</option>', $actual );
     121        $this->assertContains( '<option value="de_DE" lang="de" selected=\'selected\' data-installed="1">Deutsch</option>', $actual );
     122        $this->assertContains( '<option value="it_IT" lang="it">Italiano</option>', $actual );
     123    }
     124
     125    /**
     126     * @ticket 38632
     127     */
     128    function test_wp_dropdown_languages_en_US_selected() {
     129        $args = array(
     130            'id'           => 'foo',
     131            'name'         => 'bar',
     132            'languages'    => array( 'de_DE' ),
     133            'translations' => $this->wp_dropdown_languages_filter(),
     134            'selected'     => 'en_US',
     135            'echo'         => false,
     136        );
     137        $actual = wp_dropdown_languages( $args );
     138
     139        $this->assertContains( 'id="foo"', $actual );
     140        $this->assertContains( 'name="bar"', $actual );
     141        $this->assertContains( '<option value="" lang="en" data-installed="1" selected=\'selected\'>English (United States)</option>', $actual );
     142        $this->assertContains( '<option value="de_DE" lang="de" data-installed="1">Deutsch</option>', $actual );
     143        $this->assertContains( '<option value="it_IT" lang="it">Italiano</option>', $actual );
     144    }
     145
     146    /**
    103147     * We don't want to call the API when testing.
    104148     *
  • trunk/tests/phpunit/tests/rest-api/rest-users-controller.php

    r39126 r39169  
    878878        $user = get_userdata( $user_id );
    879879        $this->assertEquals( 'en_US', $user->locale );
     880    }
     881
     882    /**
     883     * @ticket 38632
     884     */
     885    public function test_update_item_empty_locale() {
     886        $user_id = $this->factory->user->create( array( 'user_login' => 'test_json_user', 'user_email' => 'testjson@example.com', 'locale' => 'de_DE' ) );
     887        $this->allow_user_to_manage_multisite();
     888        wp_set_current_user( self::$user );
     889
     890        $request = new WP_REST_Request( 'PUT', '/wp/v2/users/' . $user_id );
     891        $request->set_param( 'locale', '' );
     892        $response = $this->server->dispatch( $request );
     893        $this->check_add_edit_user_response( $response, true );
     894
     895        $data = $response->get_data();
     896        $this->assertEquals( get_locale(), $data['locale'] );
     897        $user = get_userdata( $user_id );
     898        $this->assertEquals( '', $user->locale );
    880899    }
    881900
Note: See TracChangeset for help on using the changeset viewer.