WordPress.org

Make WordPress Core

Ticket #26511: 26511.8.diff

File 26511.8.diff, 27.3 KB (added by swissspidy, 20 months ago)
  • src/wp-admin/includes/ms.php

    diff --git src/wp-admin/includes/ms.php src/wp-admin/includes/ms.php
    index b2e4f86..6c046f3 100644
    function update_option_new_admin_email( $old_value, $value ) { 
    272272        );
    273273        update_option( 'adminhash', $new_admin_email );
    274274
     275        $switched = 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
    All at ###SITENAME### 
    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 ) {
     322                restore_previous_locale();
     323        }
    318324}
    319325
    320326/**
    function send_confirmation_on_profile_email() { 
    353359                );
    354360                update_user_meta( $current_user->ID, '_new_email', $new_user_email );
    355361
     362                $switched = 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
    All at ###SITENAME### 
    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 ) {
     408                        restore_previous_locale();
     409                }
    398410        }
    399411}
    400412
  • src/wp-admin/includes/upgrade.php

    diff --git src/wp-admin/includes/upgrade.php src/wp-admin/includes/upgrade.php
    index 6b04963..f76cd11 100644
    function wp_new_blog_notification($blog_title, $blog_url, $user_id, $password) { 
    373373        $email = $user->user_email;
    374374        $name = $user->user_login;
    375375        $login_url = wp_login_url();
     376
     377        $switched = switch_to_locale( $user->locale );
     378
    376379        $message = sprintf( __( "Your new WordPress site has been successfully set up at:
    377380
    378381%1\$s
  • src/wp-admin/ms-delete-site.php

    diff --git src/wp-admin/ms-delete-site.php src/wp-admin/ms-delete-site.php
    index a790fa2..998aade 100644
    if ( isset( $_POST['action'] ) && $_POST['action'] == 'deleteblog' && isset( $_P 
    4242
    4343        $url_delete = esc_url( admin_url( 'ms-delete-site.php?h=' . $hash ) );
    4444
     45        $switched = switch_to_locale( get_user_locale() );
     46
    4547        /* translators: Do not translate USERNAME, URL_DELETE, SITE_NAME: those are placeholders. */
    4648        $content = __( "Howdy ###USERNAME###,
    4749
    Webmaster 
    7375        $content = str_replace( '###SITE_NAME###', $current_site->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 ) {
     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

    diff --git src/wp-admin/user-new.php src/wp-admin/user-new.php
    index 38b78dd..e1acf52 100644
    if ( isset($_REQUEST['action']) && 'adduser' == $_REQUEST['action'] ) { 
    8787                         */
    8888                        do_action( 'invite_user', $user_id, $role, $newuser_key );
    8989
     90                        $switched = switch_to_locale( $user_details->locale );
     91
    9092                        /* translators: 1: Site name, 2: site URL, 3: role, 4: activation URL */
    9193                        $message = __( 'Hi,
    9294
    Please 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/" ) ) );
    99101                        $redirect = add_query_arg( array('update' => 'add'), 'user-new.php' );
     102
     103                        if ( $switched ) {
     104                                restore_previous_locale();
     105                        }
    100106                }
    101107        }
    102108        wp_redirect( $redirect );
  • new file src/wp-includes/class-wp-locale-switcher.php

    diff --git src/wp-includes/class-wp-locale-switcher.php src/wp-includes/class-wp-locale-switcher.php
    new file mode 100644
    index 0000000..7b4433d
    - +  
     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                $this->locales = array( $this->original_locale );
     143
     144                return $this->restore_previous_locale();
     145        }
     146
     147        /**
     148         * Whether switch_to_locale() is in effect.
     149         *
     150         * @since 4.7.0
     151         *
     152         * @return bool True if the locale has been switched, false otherwise.
     153         */
     154        public function is_switched() {
     155                return ! empty( $this->locales );
     156        }
     157
     158        /**
     159         * Filters the WordPress install's locale.
     160         *
     161         * @since 4.7.0
     162         *
     163         * @param string $locale The WordPress install's locale.
     164         * @return string The locale currently being switched to.
     165         */
     166        public function filter_locale( $locale ) {
     167                $switched_locale = end( $this->locales );
     168
     169                if ( $switched_locale ) {
     170                        return $switched_locale;
     171                }
     172
     173                return $locale;
     174        }
     175
     176        /**
     177         * Load translations for a given locale.
     178         *
     179         * When switching to a locale, translations for this locale must be loaded from scratch.
     180         *
     181         * @since 4.7.0
     182         * @access private
     183         *
     184         * @global Mo[] $l10n An array of all currently loaded text domains.
     185         *
     186         * @param string $locale The locale to load translations for.
     187         */
     188        private function load_translations( $locale ) {
     189                global $l10n;
     190
     191                if ( ! $l10n ) {
     192                        $l10n = array();
     193                }
     194
     195                load_default_textdomain( $locale );
     196
     197                /* @var MO $mo */
     198                foreach ( $l10n as $domain => $mo ) {
     199                        if ( 'default' === $domain ) {
     200                                continue;
     201                        }
     202
     203                        unload_textdomain( $domain );
     204
     205                        if ( $mo->get_filename() ) {
     206                                load_textdomain( $domain, $mo->get_filename() );
     207                        }
     208
     209                        get_translations_for_domain( $domain );
     210                }
     211        }
     212
     213        /**
     214         * Changes the site's locale to the given one.
     215         *
     216         * Loads the translations, changes the global `$wp_locale` object and updates
     217         * all post type labels.
     218         *
     219         * @since 4.7.0
     220         * @access private
     221         *
     222         * @global WP_Locale $wp_locale The WordPress date and time locale object.
     223         *
     224         * @param string $locale The locale to change to.
     225         */
     226        private function change_locale( $locale ) {
     227                $this->load_translations( $locale );
     228
     229                $GLOBALS['wp_locale'] = new WP_Locale();
     230
     231                /**
     232                 * Fires when the locale is switched to or restored.
     233                 *
     234                 * @since 4.7.0
     235                 *
     236                 * @param string $locale The new locale.
     237                 */
     238                do_action( 'change_locale', $locale );
     239        }
     240}
  • src/wp-includes/default-filters.php

    diff --git src/wp-includes/default-filters.php src/wp-includes/default-filters.php
    index 3402e48..d25b23e 100644
    add_action( 'init', 'create_initial_post_types', 0 ); // highest priority 
    399399add_action( 'admin_menu', '_add_post_type_submenus' );
    400400add_action( 'before_delete_post', '_reset_front_page_settings_for_post' );
    401401add_action( 'wp_trash_post',      '_reset_front_page_settings_for_post' );
     402add_action( 'change_locale', 'create_initial_post_types' );
    402403
    403404// Post Formats
    404405add_filter( 'request', '_post_format_request' );
    add_filter( 'style_loader_src', 'wp_style_loader_src', 10, 2 ); 
    424425
    425426// Taxonomy
    426427add_action( 'init', 'create_initial_taxonomies', 0 ); // highest priority
     428add_action( 'change_local', 'create_initial_taxonomies' );
    427429
    428430// Canonical
    429431add_action( 'template_redirect', 'redirect_canonical' );
  • src/wp-includes/l10n.php

    diff --git src/wp-includes/l10n.php src/wp-includes/l10n.php
    index 03a7a11..902a978 100644
    function is_rtl() { 
    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

    diff --git src/wp-includes/load.php src/wp-includes/load.php
    index 2aa4451..6932f83 100644
    function get_current_network_id() { 
    845845 * @since 3.4.0
    846846 * @access private
    847847 *
    848  * @global string    $text_direction
    849  * @global WP_Locale $wp_locale      The WordPress date and time locale object.
     848 * @global string             $text_direction
     849 * @global WP_Locale          $wp_locale      The WordPress date and time locale object.
     850 * @global WP_Locale_Switcher $wp_locale_switcher WordPress locale switcher object.
    850851 *
    851852 * @staticvar bool $loaded
    852853 */
    853854function wp_load_translations_early() {
    854         global $text_direction, $wp_locale;
     855        global $text_direction, $wp_locale, $wp_locale_switcher;
    855856
    856857        static $loaded = false;
    857858        if ( $loaded )
    function wp_load_translations_early() { 
    868869        require_once ABSPATH . WPINC . '/pomo/mo.php';
    869870        require_once ABSPATH . WPINC . '/l10n.php';
    870871        require_once ABSPATH . WPINC . '/class-wp-locale.php';
     872        require_once ABSPATH . WPINC . '/class-wp-locale-switcher.php';
    871873
    872874        // General libraries
    873875        require_once ABSPATH . WPINC . '/plugin.php';
    function wp_load_translations_early() { 
    919921        }
    920922
    921923        $wp_locale = new WP_Locale();
     924        $wp_locale_switcher = new WP_Locale_Switcher();
     925        $wp_locale_switcher->init();
    922926}
    923927
    924928/**
  • src/wp-includes/ms-functions.php

    diff --git src/wp-includes/ms-functions.php src/wp-includes/ms-functions.php
    index ca81761..0dfab9a 100644
    function wpmu_welcome_notification( $blog_id, $user_id, $password, $title, $meta 
    14481448        if ( ! apply_filters( 'wpmu_welcome_notification', $blog_id, $user_id, $password, $title, $meta ) )
    14491449                return false;
    14501450
     1451        $user = get_userdata( $user_id );
     1452
     1453        $switched = switch_to_locale( $user->locale );
     1454
    14511455        $welcome_email = get_site_option( 'welcome_email' );
    14521456        if ( $welcome_email == false ) {
    14531457                /* translators: Do not translate USERNAME, SITE_NAME, BLOG_URL, PASSWORD: those are placeholders. */
    We hope you enjoy your new site. Thanks! 
    14681472        }
    14691473
    14701474        $url = get_blogaddress_by_id($blog_id);
    1471         $user = get_userdata( $user_id );
    14721475
    14731476        $welcome_email = str_replace( 'SITE_NAME', $current_site->site_name, $welcome_email );
    14741477        $welcome_email = str_replace( 'BLOG_TITLE', $title, $welcome_email );
    We hope you enjoy your new site. Thanks! 
    15121515         */
    15131516        $subject = apply_filters( 'update_welcome_subject', sprintf( __( 'New %1$s Site: %2$s' ), $current_site->site_name, wp_unslash( $title ) ) );
    15141517        wp_mail( $user->user_email, wp_specialchars_decode( $subject ), $message, $message_headers );
     1518
     1519        if ( $switched ) {
     1520                restore_previous_locale();
     1521        }
     1522
    15151523        return true;
    15161524}
    15171525
    function wpmu_welcome_user_notification( $user_id, $password, $meta = array() ) 
    15511559
    15521560        $user = get_userdata( $user_id );
    15531561
     1562        $switched = switch_to_locale( $user->locale );
     1563
    15541564        /**
    15551565         * Filters the content of the welcome email after user activation.
    15561566         *
    function wpmu_welcome_user_notification( $user_id, $password, $meta = array() ) 
    15901600         */
    15911601        $subject = apply_filters( 'update_welcome_user_subject', sprintf( __( 'New %1$s User: %2$s' ), $current_site->site_name, $user->user_login) );
    15921602        wp_mail( $user->user_email, wp_specialchars_decode( $subject ), $message, $message_headers );
     1603
     1604        if ( $switched ) {
     1605                restore_previous_locale();
     1606        }
     1607
    15931608        return true;
    15941609}
    15951610
  • src/wp-includes/pluggable.php

    diff --git src/wp-includes/pluggable.php src/wp-includes/pluggable.php
    index d7713b7..52c13bc 100644
    function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() 
    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
    function wp_new_user_notification( $user_id, $deprecated = null, $notify = '' ) 
    17481748        $hashed = time() . ':' . $wp_hasher->HashPassword( $key );
    17491749        $wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user->user_login ) );
    17501750
     1751        $switched = switch_to_locale( $user->locale );
     1752
    17511753        $message = sprintf(__('Username: %s'), $user->user_login) . "\r\n\r\n";
    17521754        $message .= __('To set your password, visit the following address:') . "\r\n\r\n";
    17531755        $message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . ">\r\n\r\n";
    function wp_new_user_notification( $user_id, $deprecated = null, $notify = '' ) 
    17551757        $message .= wp_login_url() . "\r\n";
    17561758
    17571759        wp_mail($user->user_email, sprintf(__('[%s] Your username and password info'), $blogname), $message);
     1760
     1761        if ( $switched ) {
     1762                restore_previous_locale();
     1763        }
    17581764}
    17591765endif;
    17601766
  • src/wp-includes/pomo/mo.php

    diff --git src/wp-includes/pomo/mo.php src/wp-includes/pomo/mo.php
    index 6bc44d6..47e9b6a 100644
    class MO extends Gettext_Translations { 
    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        /**
    class MO extends Gettext_Translations { 
    299320                return $this->_nplurals;
    300321        }
    301322}
    302 endif;
    303  No newline at end of file
     323endif;
  • src/wp-includes/user.php

    diff --git src/wp-includes/user.php src/wp-includes/user.php
    index a83e57e..9405627 100644
    function wp_update_user($userdata) { 
    18021802                $blog_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
    18031803
    18041804                if ( ! empty( $send_password_change_email ) ) {
     1805                        $switched = isset( $user['locale'] ) && switch_to_locale( $user['locale'] );
    18051806
    18061807                        /* translators: Do not translate USERNAME, ADMIN_EMAIL, EMAIL, SITENAME, SITEURL: those are placeholders. */
    18071808                        $pass_change_text = __( 'Hi ###USERNAME###,
    All at ###SITENAME### 
    18581859                }
    18591860
    18601861                if ( ! empty( $send_email_change_email ) ) {
     1862                        $switched = isset( $user['locale'] ) && switch_to_locale( $user['locale'] );
     1863
    18611864                        /* translators: Do not translate USERNAME, ADMIN_EMAIL, EMAIL, SITENAME, SITEURL: those are placeholders. */
    18621865                        $email_change_text = __( 'Hi ###USERNAME###,
    18631866
    All at ###SITENAME### 
    19121915                }
    19131916        }
    19141917
     1918        if ( $switched ) {
     1919                restore_previous_locale();
     1920        }
     1921
    19151922        // Update the cookies if the password changed.
    19161923        $current_user = wp_get_current_user();
    19171924        if ( $current_user->ID == $ID ) {
  • src/wp-settings.php

    diff --git src/wp-settings.php src/wp-settings.php
    index 6ff4ab4..13504f7 100644
    if ( SHORTINIT ) 
    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();
    unset( $locale_file ); 
    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.php

    diff --git tests/phpunit/tests/l10n.php tests/phpunit/tests/l10n.php
    index f1048aa..d7fe894 100644
    class Tests_L10n extends WP_UnitTestCase { 
    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/l10n/loadTextdomainJustInTime.php

    diff --git tests/phpunit/tests/l10n/loadTextdomainJustInTime.php tests/phpunit/tests/l10n/loadTextdomainJustInTime.php
    index f73cfd5..1d39868 100644
    class Tests_L10n_loadTextdomainJustInTime extends WP_UnitTestCase { 
    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}
  • new file tests/phpunit/tests/l10n/localeSwitcher.php

    diff --git tests/phpunit/tests/l10n/localeSwitcher.php tests/phpunit/tests/l10n/localeSwitcher.php
    new file mode 100644
    index 0000000..af56516
    - +  
     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->assertFalse( 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->assertFalse( 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->assertFalse( 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/locale.php

    diff --git tests/phpunit/tests/locale.php tests/phpunit/tests/locale.php
    index 1c335f4..79372d6 100644
     
    11<?php
    22
    33/**
    4  * @group locale
     4 * @group l10n
    55 * @group i18n
    66 */
    77class Tests_Locale extends WP_UnitTestCase {