WordPress.org

Make WordPress Core

Ticket #26511: 26511.11.diff

File 26511.11.diff, 29.3 KB (added by ocean90, 15 months ago)
  • src/wp-admin/includes/ms.php

     
    272272        ); 
    273273        update_option( 'adminhash', $new_admin_email ); 
    274274 
     275        $switched_locale = switch_to_locale( get_user_locale() ); 
     276 
    275277        /* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */ 
    276278        $email_text = __( 'Howdy ###USERNAME###, 
    277279 
     
    315317        $content = str_replace( '###SITEURL###', network_home_url(), $content ); 
    316318 
    317319        wp_mail( $value, sprintf( __( '[%s] New Admin Email Address' ), wp_specialchars_decode( get_option( 'blogname' ) ) ), $content ); 
     320 
     321        if ( $switched_locale ) { 
     322                restore_previous_locale(); 
     323        } 
    318324} 
    319325 
    320326/** 
     
    353359                ); 
    354360                update_user_meta( $current_user->ID, '_new_email', $new_user_email ); 
    355361 
     362                $switched_locale = switch_to_locale( get_user_locale() ); 
     363 
    356364                /* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */ 
    357365                $email_text = __( 'Howdy ###USERNAME###, 
    358366 
     
    395403 
    396404                wp_mail( $_POST['email'], sprintf( __( '[%s] New Email Address' ), wp_specialchars_decode( get_option( 'blogname' ) ) ), $content ); 
    397405                $_POST['email'] = $current_user->user_email; 
     406 
     407                if ( $switched_locale ) { 
     408                        restore_previous_locale(); 
     409                } 
    398410        } 
    399411} 
    400412 
  • src/wp-admin/includes/upgrade.php

     
    373373        $email = $user->user_email; 
    374374        $name = $user->user_login; 
    375375        $login_url = wp_login_url(); 
     376 
     377        $switched_locale = switch_to_locale( $user->locale ); 
     378 
    376379        $message = sprintf( __( "Your new WordPress site has been successfully set up at: 
    377380 
    378381%1\$s 
     
    390393"), $blog_url, $name, $password, $login_url ); 
    391394 
    392395        @wp_mail($email, __('New WordPress Site'), $message); 
     396 
     397        if ( $switched_locale ) { 
     398                restore_previous_locale(); 
     399        } 
    393400} 
    394401endif; 
    395402 
  • src/wp-admin/ms-delete-site.php

     
    4242 
    4343        $url_delete = esc_url( admin_url( 'ms-delete-site.php?h=' . $hash ) ); 
    4444 
     45        $switched_locale = switch_to_locale( get_locale() ); 
     46 
    4547        /* translators: Do not translate USERNAME, URL_DELETE, SITE_NAME: those are placeholders. */ 
    4648        $content = __( "Howdy ###USERNAME###, 
    4749 
     
    7375        $content = str_replace( '###SITE_NAME###', get_network()->site_name, $content ); 
    7476 
    7577        wp_mail( get_option( 'admin_email' ), "[ " . wp_specialchars_decode( get_option( 'blogname' ) ) . " ] ".__( 'Delete My Site' ), $content ); 
     78 
     79        if ( $switched_locale ) { 
     80                restore_previous_locale(); 
     81        } 
    7682        ?> 
    7783 
    7884        <p><?php _e( 'Thank you. Please check your email for a link to confirm your action. Your site will not be deleted until this link is clicked.' ) ?></p> 
  • src/wp-admin/user-new.php

     
    8787                         */ 
    8888                        do_action( 'invite_user', $user_id, $role, $newuser_key ); 
    8989 
     90                        $switched_locale = switch_to_locale( $user_details->locale ); 
     91 
    9092                        /* translators: 1: Site name, 2: site URL, 3: role, 4: activation URL */ 
    9193                        $message = __( 'Hi, 
    9294 
     
    9698Please click the following link to confirm the invite: 
    9799%4$s' ); 
    98100                        wp_mail( $new_user_email, sprintf( __( '[%s] Joining confirmation' ), wp_specialchars_decode( get_option( 'blogname' ) ) ), sprintf( $message, get_option( 'blogname' ), home_url(), wp_specialchars_decode( translate_user_role( $role['name'] ) ), home_url( "/newbloguser/$newuser_key/" ) ) ); 
     101 
     102                        if ( $switched_locale ) { 
     103                                restore_previous_locale(); 
     104                        } 
     105 
    99106                        $redirect = add_query_arg( array('update' => 'add'), 'user-new.php' ); 
    100107                } 
    101108        } 
  • src/wp-includes/class-wp-locale-switcher.php

     
     1<?php 
     2/** 
     3 * Locale API: WP_Locale_Switcher class 
     4 * 
     5 * @package WordPress 
     6 * @subpackage i18n 
     7 * @since 4.7.0 
     8 */ 
     9 
     10/** 
     11 * Core class used for switching locales. 
     12 * 
     13 * @since 4.7.0 
     14 */ 
     15class WP_Locale_Switcher { 
     16        /** 
     17         * Locale stack. 
     18         * 
     19         * @since 4.7.0 
     20         * @access private 
     21         * @var string[] 
     22         */ 
     23        private $locales = array(); 
     24 
     25        /** 
     26         * Original locale. 
     27         * 
     28         * @since 4.7.0 
     29         * @access private 
     30         * @var string 
     31         */ 
     32        private $original_locale; 
     33 
     34        /** 
     35         * Holds all available languages. 
     36         * 
     37         * @since 4.7.0 
     38         * @access private 
     39         * @var array An array of language codes (file names without the .mo extension). 
     40         */ 
     41        private $available_languages = array(); 
     42 
     43        /** 
     44         * Constructor. 
     45         * 
     46         * Stores the original locale as well as a list of all available languages. 
     47         * 
     48         * @since 4.7.0 
     49         */ 
     50        public function __construct() { 
     51                $this->original_locale     = get_locale(); 
     52                $this->available_languages = get_available_languages(); 
     53        } 
     54 
     55        /** 
     56         * Initializes the locale switcher. 
     57         * 
     58         * Hooks into the {@see 'locale'} filter to change the locale on the fly. 
     59         */ 
     60        public function init() { 
     61                add_filter( 'locale', array( $this, 'filter_locale' ) ); 
     62        } 
     63 
     64        /** 
     65         * Switches the translations according to the given locale. 
     66         * 
     67         * @since 4.7.0 
     68         * 
     69         * @param string $locale The locale to switch to. 
     70         * @return bool True on success, false on failure. 
     71         */ 
     72        public function switch_to_locale( $locale ) { 
     73                if ( $locale === get_locale() ) { 
     74                        return false; 
     75                } 
     76 
     77                if ( ! in_array( $locale, $this->available_languages ) ) { 
     78                        return false; 
     79                } 
     80 
     81                $this->locales[] = $locale; 
     82 
     83                $this->change_locale( $locale ); 
     84 
     85                /** 
     86                 * Fires when the locale is switched. 
     87                 * 
     88                 * @since 4.7.0 
     89                 * 
     90                 * @param string $locale The new locale. 
     91                 */ 
     92                do_action( 'switch_locale', $locale ); 
     93 
     94                return true; 
     95        } 
     96 
     97        /** 
     98         * Restores the translations according to the previous locale. 
     99         * 
     100         * @since 4.7.0 
     101         * 
     102         * @return string|false Locale on success, false on failure. 
     103         */ 
     104        public function restore_previous_locale() { 
     105                $previous_locale = array_pop( $this->locales ); 
     106 
     107                if ( null === $previous_locale ) { 
     108                        // The stack is empty, bail. 
     109                        return false; 
     110                } 
     111 
     112                $locale = end( $this->locales ); 
     113 
     114                if ( ! $locale ) { 
     115                        // There's nothing left in the stack: go back to the original locale. 
     116                        $locale = $this->original_locale; 
     117                } 
     118 
     119                $this->change_locale( $locale ); 
     120 
     121                /** 
     122                 * Fires when the locale is restored to the previous one. 
     123                 * 
     124                 * @since 4.7.0 
     125                 * 
     126                 * @param string $locale          The new locale. 
     127                 * @param string $previous_locale The previous locale. 
     128                 */ 
     129                do_action( 'restore_previous_locale', $locale, $previous_locale ); 
     130 
     131                return $locale; 
     132        } 
     133 
     134        /** 
     135         * Restores the translations according to the original locale. 
     136         * 
     137         * @since 4.7.0 
     138         * 
     139         * @return string|false Locale on success, false on failure. 
     140         */ 
     141        public function restore_current_locale() { 
     142                if ( empty( $this->locales ) ) { 
     143                        return false; 
     144                } 
     145 
     146                $this->locales = array( $this->original_locale ); 
     147 
     148                return $this->restore_previous_locale(); 
     149        } 
     150 
     151        /** 
     152         * Whether switch_to_locale() is in effect. 
     153         * 
     154         * @since 4.7.0 
     155         * 
     156         * @return bool True if the locale has been switched, false otherwise. 
     157         */ 
     158        public function is_switched() { 
     159                return ! empty( $this->locales ); 
     160        } 
     161 
     162        /** 
     163         * Filters the WordPress install's locale. 
     164         * 
     165         * @since 4.7.0 
     166         * 
     167         * @param string $locale The WordPress install's locale. 
     168         * @return string The locale currently being switched to. 
     169         */ 
     170        public function filter_locale( $locale ) { 
     171                $switched_locale = end( $this->locales ); 
     172 
     173                if ( $switched_locale ) { 
     174                        return $switched_locale; 
     175                } 
     176 
     177                return $locale; 
     178        } 
     179 
     180        /** 
     181         * Load translations for a given locale. 
     182         * 
     183         * When switching to a locale, translations for this locale must be loaded from scratch. 
     184         * 
     185         * @since 4.7.0 
     186         * @access private 
     187         * 
     188         * @global Mo[] $l10n An array of all currently loaded text domains. 
     189         * 
     190         * @param string $locale The locale to load translations for. 
     191         */ 
     192        private function load_translations( $locale ) { 
     193                global $l10n; 
     194 
     195                if ( ! $l10n ) { 
     196                        $l10n = array(); 
     197                } 
     198 
     199                load_default_textdomain( $locale ); 
     200 
     201                /* @var MO $mo */ 
     202                foreach ( $l10n as $domain => $mo ) { 
     203                        if ( 'default' === $domain ) { 
     204                                continue; 
     205                        } 
     206 
     207                        unload_textdomain( $domain ); 
     208 
     209                        if ( $mo->get_filename() ) { 
     210                                load_textdomain( $domain, $mo->get_filename() ); 
     211                        } 
     212 
     213                        get_translations_for_domain( $domain ); 
     214                } 
     215        } 
     216 
     217        /** 
     218         * Changes the site's locale to the given one. 
     219         * 
     220         * Loads the translations, changes the global `$wp_locale` object and updates 
     221         * all post type labels. 
     222         * 
     223         * @since 4.7.0 
     224         * @access private 
     225         * 
     226         * @global WP_Locale $wp_locale The WordPress date and time locale object. 
     227         * 
     228         * @param string $locale The locale to change to. 
     229         */ 
     230        private function change_locale( $locale ) { 
     231                $this->load_translations( $locale ); 
     232 
     233                $GLOBALS['wp_locale'] = new WP_Locale(); 
     234 
     235                /** 
     236                 * Fires when the locale is switched to or restored. 
     237                 * 
     238                 * @since 4.7.0 
     239                 * 
     240                 * @param string $locale The new locale. 
     241                 */ 
     242                do_action( 'change_locale', $locale ); 
     243        } 
     244} 
  • src/wp-includes/default-filters.php

     
    401401add_action( 'admin_menu', '_add_post_type_submenus' ); 
    402402add_action( 'before_delete_post', '_reset_front_page_settings_for_post' ); 
    403403add_action( 'wp_trash_post',      '_reset_front_page_settings_for_post' ); 
     404add_action( 'change_locale', 'create_initial_post_types' ); 
    404405 
    405406// Post Formats 
    406407add_filter( 'request', '_post_format_request' ); 
     
    426427 
    427428// Taxonomy 
    428429add_action( 'init', 'create_initial_taxonomies', 0 ); // highest priority 
     430add_action( 'change_local', 'create_initial_taxonomies' ); 
    429431 
    430432// Canonical 
    431433add_action( 'template_redirect', 'redirect_canonical' ); 
  • src/wp-includes/l10n.php

     
    11661166        } 
    11671167        return $wp_locale->is_rtl(); 
    11681168} 
     1169 
     1170/** 
     1171 * Switches the translations according to the given locale. 
     1172 * 
     1173 * @since 4.7.0 
     1174 * 
     1175 * @global WP_Locale_Switcher $wp_locale_switcher 
     1176 * 
     1177 * @param string $locale The locale. 
     1178 * @return bool True on success, false on failure. 
     1179 */ 
     1180function switch_to_locale( $locale ) { 
     1181        /* @var WP_Locale_Switcher $wp_locale_switcher */ 
     1182        global $wp_locale_switcher; 
     1183 
     1184        return $wp_locale_switcher->switch_to_locale( $locale ); 
     1185} 
     1186 
     1187/** 
     1188 * Restores the translations according to the previous locale. 
     1189 * 
     1190 * @since 4.7.0 
     1191 * 
     1192 * @global WP_Locale_Switcher $wp_locale_switcher 
     1193 * 
     1194 * @return string|false Locale on success, false on error. 
     1195 */ 
     1196function restore_previous_locale() { 
     1197        /* @var WP_Locale_Switcher $wp_locale_switcher */ 
     1198        global $wp_locale_switcher; 
     1199 
     1200        return $wp_locale_switcher->restore_previous_locale(); 
     1201} 
     1202 
     1203/** 
     1204 * Restores the translations according to the original locale. 
     1205 * 
     1206 * @since 4.7.0 
     1207 * 
     1208 * @global WP_Locale_Switcher $wp_locale_switcher 
     1209 * 
     1210 * @return string|false Locale on success, false on error. 
     1211 */ 
     1212function restore_current_locale() { 
     1213        /* @var WP_Locale_Switcher $wp_locale_switcher */ 
     1214        global $wp_locale_switcher; 
     1215 
     1216        return $wp_locale_switcher->restore_current_locale(); 
     1217} 
     1218 
     1219/** 
     1220 * Whether switch_to_locale() is in effect. 
     1221 * 
     1222 * @since 4.7.0 
     1223 * 
     1224 * @global WP_Locale_Switcher $wp_locale_switcher 
     1225 * 
     1226 * @return bool True if the locale has been switched, false otherwise. 
     1227 */ 
     1228function is_locale_switched() { 
     1229        /* @var WP_Locale_Switcher $wp_locale_switcher */ 
     1230        global $wp_locale_switcher; 
     1231 
     1232        return $wp_locale_switcher->is_switched(); 
     1233} 
  • src/wp-includes/load.php

     
    843843 * @since 3.4.0 
    844844 * @access private 
    845845 * 
    846  * @global string    $text_direction 
    847  * @global WP_Locale $wp_locale      The WordPress date and time locale object. 
     846 * @global string             $text_direction 
     847 * @global WP_Locale          $wp_locale      The WordPress date and time locale object. 
     848 * @global WP_Locale_Switcher $wp_locale_switcher WordPress locale switcher object. 
    848849 * 
    849850 * @staticvar bool $loaded 
    850851 */ 
    851852function wp_load_translations_early() { 
    852         global $text_direction, $wp_locale; 
     853        global $text_direction, $wp_locale, $wp_locale_switcher; 
    853854 
    854855        static $loaded = false; 
    855856        if ( $loaded ) 
     
    866867        require_once ABSPATH . WPINC . '/pomo/mo.php'; 
    867868        require_once ABSPATH . WPINC . '/l10n.php'; 
    868869        require_once ABSPATH . WPINC . '/class-wp-locale.php'; 
     870        require_once ABSPATH . WPINC . '/class-wp-locale-switcher.php'; 
    869871 
    870872        // General libraries 
    871873        require_once ABSPATH . WPINC . '/plugin.php'; 
     
    917919        } 
    918920 
    919921        $wp_locale = new WP_Locale(); 
     922        $wp_locale_switcher = new WP_Locale_Switcher(); 
     923        $wp_locale_switcher->init(); 
    920924} 
    921925 
    922926/** 
  • src/wp-includes/ms-functions.php

     
    800800                $admin_email = 'support@' . $_SERVER['SERVER_NAME']; 
    801801        $from_name = get_site_option( 'site_name' ) == '' ? 'WordPress' : esc_html( get_site_option( 'site_name' ) ); 
    802802        $message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n"; 
     803 
     804        $user = get_user_by( 'login', $user ); 
     805        $switched_locale = switch_to_locale( $user && $user->locale ? $user->locale : get_locale() ); 
     806 
    803807        $message = sprintf( 
    804808                /** 
    805809                 * Filters the message content of the new blog notification email. 
     
    849853                esc_url( 'http://' . $domain . $path ) 
    850854        ); 
    851855        wp_mail( $user_email, wp_specialchars_decode( $subject ), $message, $message_headers ); 
     856 
     857        if ( $switched_locale ) { 
     858                restore_previous_locale(); 
     859        } 
     860 
    852861        return true; 
    853862} 
    854863 
     
    887896        if ( ! apply_filters( 'wpmu_signup_user_notification', $user, $user_email, $key, $meta ) ) 
    888897                return false; 
    889898 
     899        $user = get_user_by( 'login', $user ); 
     900        $switched_locale = switch_to_locale( $user && $user->locale ? $user->locale : get_locale() ); 
     901 
    890902        // Send email with activation link. 
    891903        $admin_email = get_site_option( 'admin_email' ); 
    892904        if ( $admin_email == '' ) 
     
    934946                $user 
    935947        ); 
    936948        wp_mail( $user_email, wp_specialchars_decode( $subject ), $message, $message_headers ); 
     949 
     950        if ( $switched_locale ) { 
     951                restore_previous_locale(); 
     952        } 
     953 
    937954        return true; 
    938955} 
    939956 
     
    14481465        if ( ! apply_filters( 'wpmu_welcome_notification', $blog_id, $user_id, $password, $title, $meta ) ) 
    14491466                return false; 
    14501467 
     1468        $user = get_userdata( $user_id ); 
     1469 
     1470        $switched_locale = switch_to_locale( $user->locale ); 
     1471 
    14511472        $welcome_email = get_site_option( 'welcome_email' ); 
    14521473        if ( $welcome_email == false ) { 
    14531474                /* translators: Do not translate USERNAME, SITE_NAME, BLOG_URL, PASSWORD: those are placeholders. */ 
     
    14681489        } 
    14691490 
    14701491        $url = get_blogaddress_by_id($blog_id); 
    1471         $user = get_userdata( $user_id ); 
    14721492 
    14731493        $welcome_email = str_replace( 'SITE_NAME', $current_network->site_name, $welcome_email ); 
    14741494        $welcome_email = str_replace( 'BLOG_TITLE', $title, $welcome_email ); 
     
    15121532         */ 
    15131533        $subject = apply_filters( 'update_welcome_subject', sprintf( __( 'New %1$s Site: %2$s' ), $current_network->site_name, wp_unslash( $title ) ) ); 
    15141534        wp_mail( $user->user_email, wp_specialchars_decode( $subject ), $message, $message_headers ); 
     1535 
     1536        if ( $switched_locale ) { 
     1537                restore_previous_locale(); 
     1538        } 
     1539 
    15151540        return true; 
    15161541} 
    15171542 
     
    15511576 
    15521577        $user = get_userdata( $user_id ); 
    15531578 
     1579        $switched_locale = switch_to_locale( $user->locale ); 
     1580 
    15541581        /** 
    15551582         * Filters the content of the welcome email after user activation. 
    15561583         * 
     
    15901617         */ 
    15911618        $subject = apply_filters( 'update_welcome_user_subject', sprintf( __( 'New %1$s User: %2$s' ), $current_network->site_name, $user->user_login) ); 
    15921619        wp_mail( $user->user_email, wp_specialchars_decode( $subject ), $message, $message_headers ); 
     1620 
     1621        if ( $switched_locale ) { 
     1622                restore_previous_locale(); 
     1623        } 
     1624 
    15931625        return true; 
    15941626} 
    15951627 
  • src/wp-includes/pluggable.php

     
    211211        // (Re)create it, if it's gone missing 
    212212        if ( ! ( $phpmailer instanceof PHPMailer ) ) { 
    213213                require_once ABSPATH . WPINC . '/class-phpmailer.php'; 
    214                 require_once ABSPATH . WPINC . '/class-smtp.php';  
     214                require_once ABSPATH . WPINC . '/class-smtp.php'; 
    215215                $phpmailer = new PHPMailer( true ); 
    216216        } 
    217217 
     
    15691569                        $emails[] = $user->user_email; 
    15701570        } 
    15711571 
     1572        $switched_locale = switch_to_locale( get_locale() ); 
     1573 
    15721574        $comment_author_domain = @gethostbyaddr($comment->comment_author_IP); 
    15731575        $comments_waiting = $wpdb->get_var("SELECT count(comment_ID) FROM $wpdb->comments WHERE comment_approved = '0'"); 
    15741576 
     
    16641666                @wp_mail( $email, wp_specialchars_decode( $subject ), $notify_message, $message_headers ); 
    16651667        } 
    16661668 
     1669        if ( $switched_locale ) { 
     1670                restore_previous_locale(); 
     1671        } 
     1672 
    16671673        return true; 
    16681674} 
    16691675endif; 
     
    17231729        $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); 
    17241730 
    17251731        if ( 'user' !== $notify ) { 
     1732                $switched_locale = switch_to_locale( get_locale() ); 
    17261733                $message  = sprintf( __( 'New user registration on your site %s:' ), $blogname ) . "\r\n\r\n"; 
    17271734                $message .= sprintf( __( 'Username: %s' ), $user->user_login ) . "\r\n\r\n"; 
    17281735                $message .= sprintf( __( 'Email: %s' ), $user->user_email ) . "\r\n"; 
    17291736 
    17301737                @wp_mail( get_option( 'admin_email' ), sprintf( __( '[%s] New User Registration' ), $blogname ), $message ); 
     1738 
     1739                if ( $switched_locale ) { 
     1740                        restore_previous_locale(); 
     1741                } 
    17311742        } 
    17321743 
    17331744        // `$deprecated was pre-4.3 `$plaintext_pass`. An empty `$plaintext_pass` didn't sent a user notifcation. 
     
    17481759        $hashed = time() . ':' . $wp_hasher->HashPassword( $key ); 
    17491760        $wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user->user_login ) ); 
    17501761 
     1762        $switched_locale = switch_to_locale( $user->locale ); 
     1763 
    17511764        $message = sprintf(__('Username: %s'), $user->user_login) . "\r\n\r\n"; 
    17521765        $message .= __('To set your password, visit the following address:') . "\r\n\r\n"; 
    17531766        $message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . ">\r\n\r\n"; 
     
    17551768        $message .= wp_login_url() . "\r\n"; 
    17561769 
    17571770        wp_mail($user->user_email, sprintf(__('[%s] Your username and password info'), $blogname), $message); 
     1771 
     1772        if ( $switched_locale ) { 
     1773                restore_previous_locale(); 
     1774        } 
    17581775} 
    17591776endif; 
    17601777 
  • src/wp-includes/pomo/mo.php

     
    1616        var $_nplurals = 2; 
    1717 
    1818        /** 
     19         * Loaded MO file. 
     20         * 
     21         * @var string 
     22         */ 
     23        private $filename = ''; 
     24 
     25        /** 
     26         * Returns the loaded MO file. 
     27         * 
     28         * @return string The loaded MO file. 
     29         */ 
     30        public function get_filename() { 
     31                return $this->filename; 
     32        } 
     33 
     34        /** 
    1935         * Fills up with the entries from MO file $filename 
    2036         * 
    2137         * @param string $filename MO file to load 
    2238         */ 
    2339        function import_from_file($filename) { 
    24                 $reader = new POMO_FileReader($filename); 
    25                 if (!$reader->is_resource()) 
     40                $reader = new POMO_FileReader( $filename ); 
     41 
     42                if ( ! $reader->is_resource() ) { 
    2643                        return false; 
    27                 return $this->import_from_reader($reader); 
     44                } 
     45 
     46                $this->filename = (string) $filename; 
     47 
     48                return $this->import_from_reader( $reader ); 
    2849        } 
    2950 
    3051        /** 
     
    299320                return $this->_nplurals; 
    300321        } 
    301322} 
    302 endif; 
    303  No newline at end of file 
     323endif; 
  • src/wp-includes/user.php

     
    18011801 
    18021802                $blog_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); 
    18031803 
     1804                $switched_locale = false; 
     1805                if ( ! empty( $send_password_change_email ) || ! empty( $send_email_change_email ) ) { 
     1806                        $switched_locale = switch_to_locale( isset( $user['locale'] ) ? $user['locale'] : get_locale() ); 
     1807                } 
     1808 
    18041809                if ( ! empty( $send_password_change_email ) ) { 
    1805  
    18061810                        /* translators: Do not translate USERNAME, ADMIN_EMAIL, EMAIL, SITENAME, SITEURL: those are placeholders. */ 
    18071811                        $pass_change_text = __( 'Hi ###USERNAME###, 
    18081812 
     
    19101914 
    19111915                        wp_mail( $email_change_email['to'], sprintf( $email_change_email['subject'], $blog_name ), $email_change_email['message'], $email_change_email['headers'] ); 
    19121916                } 
     1917 
     1918                if ( $switched_locale ) { 
     1919                        restore_previous_locale(); 
     1920                } 
    19131921        } 
    19141922 
    19151923        // Update the cookies if the password changed. 
  • src/wp-settings.php

     
    131131// Load the L10n library. 
    132132require_once( ABSPATH . WPINC . '/l10n.php' ); 
    133133require_once( ABSPATH . WPINC . '/class-wp-locale.php' ); 
     134require_once( ABSPATH . WPINC . '/class-wp-locale-switcher.php' ); 
    134135 
    135136// Run the installer if WordPress is not installed. 
    136137wp_not_installed(); 
     
    385386 */ 
    386387$GLOBALS['wp_locale'] = new WP_Locale(); 
    387388 
     389/** 
     390 *  WordPress Locale Switcher object for switching locales. 
     391 * 
     392 * @since 4.7.0 
     393 * 
     394 * @global WP_Locale_Switcher $wp_locale_switcher WordPress locale switcher object. 
     395 */ 
     396$GLOBALS['wp_locale_switcher'] = new WP_Locale_Switcher(); 
     397$GLOBALS['wp_locale_switcher']->init(); 
     398 
    388399// Load the functions for the active theme, for both parent and child theme if applicable. 
    389400if ( ! wp_installing() || 'wp-activate.php' === $pagenow ) { 
    390401        if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) ) 
  • tests/phpunit/tests/l10n/loadTextdomainJustInTime.php

     
    141141                $this->assertSame( 'Das ist ein Dummy Plugin', $expected_output_final ); 
    142142                $this->assertTrue( $is_textdomain_loaded_final ); 
    143143        } 
     144 
     145        /** 
     146         * @ticket 26511 
     147         */ 
     148        public function test_plugin_translation_after_switching_locale() { 
     149                require_once DIR_TESTDATA . '/plugins/internationalized-plugin.php'; 
     150 
     151                switch_to_locale( 'de_DE' ); 
     152                $expected = i18n_plugin_test(); 
     153                restore_previous_locale(); 
     154 
     155                $this->assertSame( 'Das ist ein Dummy Plugin', $expected ); 
     156        } 
     157 
     158        /** 
     159         * @ticket 26511 
     160         */ 
     161        public function test_theme_translation_after_switching_locale() { 
     162                switch_theme( 'internationalized-theme' ); 
     163 
     164                require_once get_stylesheet_directory() . '/functions.php'; 
     165 
     166                switch_to_locale( 'de_DE' ); 
     167                $expected = i18n_theme_test(); 
     168                restore_previous_locale(); 
     169 
     170                $this->assertSame( 'Das ist ein Dummy Theme', $expected ); 
     171        } 
    144172} 
  • tests/phpunit/tests/l10n/localeSwitcher.php

     
     1<?php 
     2 
     3/** 
     4 * @group l10n 
     5 * @group i18n 
     6 * @group 26511 
     7 */ 
     8class Tests_Locale_Switcher extends WP_UnitTestCase { 
     9        /** 
     10         * @var string 
     11         */ 
     12        protected $locale = ''; 
     13 
     14        /** 
     15         * @var string 
     16         */ 
     17        protected $previous_locale = ''; 
     18 
     19        public function setUp() { 
     20                $this->locale = ''; 
     21                $this->previous_locale = ''; 
     22        } 
     23 
     24        public function test_switch_to_non_existent_locale_returns_false() { 
     25                $this->assertTrue( ! switch_to_locale( 'foo_BAR' ) ); 
     26        } 
     27 
     28        public function test_switch_to_non_existent_locale_does_not_change_locale() { 
     29                switch_to_locale( 'foo_BAR' ); 
     30 
     31                $this->assertSame( 'en_US', get_locale() ); 
     32        } 
     33 
     34        public function test_switch_to_locale_returns_true() { 
     35                $expected = switch_to_locale( 'en_GB' ); 
     36 
     37                // Cleanup. 
     38                restore_previous_locale(); 
     39 
     40                $this->assertTrue( $expected ); 
     41        } 
     42 
     43        public function test_switch_to_locale_changes_the_locale() { 
     44                switch_to_locale( 'en_GB' ); 
     45 
     46                $locale = get_locale(); 
     47 
     48                // Cleanup. 
     49                restore_previous_locale(); 
     50 
     51                $this->assertSame( 'en_GB', $locale ); 
     52        } 
     53 
     54        public function test_switch_to_locale_loads_translation() { 
     55                switch_to_locale( 'es_ES' ); 
     56 
     57                $actual = __( 'Invalid parameter.' ); 
     58 
     59                // Cleanup. 
     60                restore_previous_locale(); 
     61 
     62                $this->assertSame( 'Parámetro no válido. ', $actual ); 
     63        } 
     64 
     65        public function test_switch_to_locale_changes_wp_locale_global() { 
     66                global $wp_locale; 
     67 
     68                $expected = array( 
     69                        'thousands_sep' => '.', 
     70                        'decimal_point' => ',', 
     71                ); 
     72 
     73                switch_to_locale( 'de_DE' ); 
     74 
     75                $wp_locale_de_DE = clone $wp_locale; 
     76 
     77                // Cleanup. 
     78                restore_previous_locale(); 
     79 
     80                $this->assertEqualSetsWithIndex( $expected, $wp_locale_de_DE->number_format ); 
     81        } 
     82 
     83        public function test_switch_to_locale_multiple_times() { 
     84                switch_to_locale( 'en_GB' ); 
     85                switch_to_locale( 'es_ES' ); 
     86                $locale = get_locale(); 
     87 
     88                // Cleanup. 
     89                restore_previous_locale(); 
     90                restore_previous_locale(); 
     91 
     92                $this->assertSame( 'es_ES', $locale ); 
     93        } 
     94 
     95        public function test_switch_to_locale_multiple_times_loads_translation() { 
     96                switch_to_locale( 'en_GB' ); 
     97                switch_to_locale( 'de_DE' ); 
     98                switch_to_locale( 'es_ES' ); 
     99 
     100                $actual = __( 'Invalid parameter.' ); 
     101 
     102                // Cleanup. 
     103                restore_previous_locale(); 
     104                restore_previous_locale(); 
     105                restore_previous_locale(); 
     106 
     107                $this->assertSame( 'Parámetro no válido. ', $actual ); 
     108        } 
     109 
     110        public function test_restore_previous_locale_without_switching() { 
     111                $this->assertTrue( ! restore_previous_locale() ); 
     112        } 
     113 
     114        public function test_restore_previous_locale_changes_the_locale_back() { 
     115                switch_to_locale( 'en_GB' ); 
     116 
     117                // Cleanup. 
     118                restore_previous_locale(); 
     119 
     120                $this->assertSame( 'en_US', get_locale() ); 
     121        } 
     122 
     123        public function test_restore_previous_locale_after_switching_multiple_times() { 
     124                switch_to_locale( 'en_GB' ); 
     125                switch_to_locale( 'es_ES' ); 
     126                restore_previous_locale(); 
     127 
     128                $locale = get_locale(); 
     129 
     130                // Cleanup. 
     131                restore_previous_locale(); 
     132 
     133                $this->assertSame( 'en_GB', $locale ); 
     134        } 
     135 
     136        public function test_restore_previous_locale_restores_translation() { 
     137                switch_to_locale( 'es_ES' ); 
     138                restore_previous_locale(); 
     139 
     140                $actual = __( 'Invalid parameter.' ); 
     141 
     142                $this->assertSame( 'Invalid parameter.', $actual ); 
     143        } 
     144 
     145        public function test_restore_previous_locale_action_passes_previous_locale() { 
     146                switch_to_locale( 'en_GB' ); 
     147                switch_to_locale( 'es_ES' ); 
     148 
     149                add_action( 'restore_previous_locale', array( $this, 'store_locale' ), 10, 2 ); 
     150 
     151                restore_previous_locale(); 
     152 
     153                $previous_locale = $this->previous_locale; 
     154 
     155                // Cleanup. 
     156                restore_previous_locale(); 
     157 
     158                $this->assertSame( 'es_ES', $previous_locale ); 
     159        } 
     160 
     161        public function test_restore_previous_locale_restores_wp_locale_global() { 
     162                global $wp_locale; 
     163 
     164                $expected = array( 
     165                        'thousands_sep' => ',', 
     166                        'decimal_point' => '.', 
     167                ); 
     168 
     169                switch_to_locale( 'de_DE' ); 
     170                restore_previous_locale(); 
     171 
     172                $this->assertEqualSetsWithIndex( $expected, $wp_locale->number_format ); 
     173        } 
     174 
     175        public function test_restore_current_locale_without_switching() { 
     176                $this->assertTrue( ! restore_current_locale() ); 
     177        } 
     178 
     179        public function test_restore_current_locale_after_switching_multiple_times() { 
     180                switch_to_locale( 'en_GB' ); 
     181                switch_to_locale( 'nl_NL' ); 
     182                switch_to_locale( 'es_ES' ); 
     183 
     184                restore_current_locale(); 
     185 
     186                $this->assertSame( 'en_US', get_locale() ); 
     187        } 
     188 
     189        public function store_locale( $locale, $previous_locale ) { 
     190                $this->locale = $locale; 
     191                $this->previous_locale = $previous_locale; 
     192        } 
     193 
     194        public function test_is_locale_switched_if_not_switched() { 
     195                $this->assertTrue( ! is_locale_switched() ); 
     196        } 
     197 
     198        public function test_is_locale_switched_original_locale() { 
     199                $original_locale = get_locale(); 
     200 
     201                switch_to_locale( 'en_GB' ); 
     202                switch_to_locale( $original_locale ); 
     203 
     204                $is_locale_switched = is_locale_switched(); 
     205 
     206                restore_current_locale(); 
     207 
     208                $this->assertTrue( $is_locale_switched ); 
     209        } 
     210 
     211        public function test_is_locale_switched() { 
     212                switch_to_locale( 'en_GB' ); 
     213                switch_to_locale( 'nl_NL' ); 
     214 
     215                $is_locale_switched = is_locale_switched(); 
     216 
     217                restore_current_locale(); 
     218 
     219                $this->assertTrue( $is_locale_switched ); 
     220        } 
     221} 
  • tests/phpunit/tests/l10n.php

     
    8585                $this->assertEmpty( $array ); 
    8686 
    8787                $array = get_available_languages( DIR_TESTDATA . '/languages/' ); 
    88                 $this->assertEquals( array( 'en_GB', 'es_ES' ), $array ); 
     88                $this->assertEquals( array( 'de_DE', 'en_GB', 'es_ES' ), $array ); 
    8989        } 
    9090 
    9191        /** 
  • tests/phpunit/tests/locale.php

     
    11<?php 
    22 
    33/** 
    4  * @group locale 
     4 * @group l10n 
    55 * @group i18n 
    66 */ 
    77class Tests_Locale extends WP_UnitTestCase {