WordPress.org

Make WordPress Core

Ticket #26511: 26511.2.patch

File 26511.2.patch, 8.4 KB (added by ocean90, 19 months ago)
  • src/wp-includes/class-wp-locale-storage.php

     
     1<?php 
     2/** 
     3 * Locale API: WP_Locale_Storage class 
     4 * 
     5 * @package WordPress 
     6 * @subpackage i18n 
     7 * @since 4.6.0 
     8 */ 
     9 
     10/** 
     11 * Core class for locale storage objects with a getter. 
     12 * 
     13 * @since 4.6.0 
     14 */ 
     15class WP_Locale_Storage { 
     16 
     17        /** 
     18         * The stored locale. 
     19         * 
     20         * @since 4.6.0 
     21         * @var string 
     22         */ 
     23        private $locale; 
     24 
     25        /** 
     26         * Constructor. Stores the given locale. 
     27         * 
     28         * @since 4.6.0 
     29         * 
     30         * @param string $locale The locale. 
     31         */ 
     32        public function __construct( $locale ) { 
     33                $this->locale = (string) $locale; 
     34        } 
     35 
     36        /** 
     37         * Returns the stored locale. 
     38         * 
     39         * @since 4.6.0 
     40         * 
     41         * @return string The stored locale. 
     42         */ 
     43        public function get() { 
     44                return $this->locale; 
     45        } 
     46} 
  • 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.6.0 
     8 */ 
     9 
     10/** 
     11 * Core class used for switching locales. 
     12 * 
     13 * @since 4.6.0 
     14 */ 
     15class WP_Locale_Switcher { 
     16 
     17        /** 
     18         * Filter callbacks. 
     19         * 
     20         * @since 4.6.0 
     21         * @var callback[] 
     22         */ 
     23        private $filters = array(); 
     24 
     25        /** 
     26         * Locale stack. 
     27         * 
     28         * @since 4.6.0 
     29         * @var string[] 
     30         */ 
     31        private $locales = array(); 
     32 
     33        /** 
     34         * Original locale. 
     35         * 
     36         * @since 4.6.0 
     37         * @var string 
     38         */ 
     39        private $original_locale; 
     40 
     41        /** 
     42         * Translation objects. 
     43         * 
     44         * @since 4.6.0 
     45         * @var NOOP_Translations[][] 
     46         */ 
     47        private $translations = array(); 
     48 
     49        /** 
     50         * Constructor. Stores the original locale. 
     51         * 
     52         * @since 4.6.0 
     53         */ 
     54        public function __construct() { 
     55                $this->original_locale = get_locale(); 
     56        } 
     57 
     58        /** 
     59         * Switches the translations according to the given locale. 
     60         * 
     61         * @since 4.6.0 
     62         * 
     63         * @param string $locale The locale. 
     64         * @return bool True on success, false on failure. 
     65         */ 
     66        public function switch_to_locale( $locale ) { 
     67                $current_locale = get_locale(); 
     68                if ( $current_locale === $locale ) { 
     69                        return false; 
     70                } 
     71 
     72                /** 
     73                 * @global MO[] $l10n 
     74                 */ 
     75                global $l10n; 
     76 
     77                $textdomains = array_keys( $l10n ); 
     78 
     79                if ( ! $this->has_translations_for_locale( $current_locale ) ) { 
     80                        foreach ( $textdomains as $textdomain ) { 
     81                                $this->translations[ $current_locale ][ $textdomain ] = get_translations_for_domain( $textdomain ); 
     82                        } 
     83                } 
     84 
     85                $this->remove_filters(); 
     86 
     87                $this->add_filter_for_locale( $locale ); 
     88 
     89                if ( $this->has_translations_for_locale( $locale ) ) { 
     90                        foreach ( $textdomains as $textdomain ) { 
     91                                if ( isset( $this->translations[ $locale ][ $textdomain ] ) ) { 
     92                                        $l10n[ $textdomain ] = $this->translations[ $locale ][ $textdomain ]; 
     93                                } 
     94                        } 
     95                } else { 
     96                        foreach ( $l10n as $textdomain => $mo ) { 
     97                                if ( 'default' === $textdomain ) { 
     98                                        load_default_textdomain(); 
     99 
     100                                        continue; 
     101                                } 
     102 
     103                                unload_textdomain( $textdomain ); 
     104 
     105                                if ( $mofile = $mo->get_filename() ) { 
     106                                        load_textdomain( $textdomain, $mofile ); 
     107                                } 
     108 
     109                                $this->translations[ $locale ][ $textdomain ] = get_translations_for_domain( $textdomain ); 
     110                        } 
     111                } 
     112 
     113                /** 
     114                 * @global WP_Locale $wp_locale 
     115                 */ 
     116                $GLOBALS['wp_locale'] = new WP_Locale(); 
     117 
     118                $this->locales[] = $locale; 
     119 
     120                return true; 
     121        } 
     122 
     123        /** 
     124         * Restores the translations according to the previous locale. 
     125         * 
     126         * @since 4.6.0 
     127         * 
     128         * @return string|false Locale on success, false on error. 
     129         */ 
     130        public function restore_locale() { 
     131                if ( ! array_pop( $this->locales ) ) { 
     132                        // The stack is empty, bail. 
     133                        return false; 
     134                } 
     135 
     136                $this->remove_filters(); 
     137 
     138                if ( $locale = end( $this->locales ) ) { 
     139                        if ( isset( $this->filters[ $locale ] ) ) { 
     140                                add_filter( 'locale', $this->filters[ $locale ] ); 
     141                        } 
     142                } else { 
     143                        // There's nothing left in the stack: go back to the original locale. 
     144                        $locale = $this->original_locale; 
     145                } 
     146 
     147                /** 
     148                 * @global MO[] $l10n 
     149                 */ 
     150                global $l10n; 
     151 
     152                foreach ( array_keys( $l10n ) as $textdomain ) { 
     153                        if ( isset( $this->translations[ $locale ][ $textdomain ] ) ) { 
     154                                $l10n[ $textdomain ] = $this->translations[ $locale ][ $textdomain ]; 
     155                        } 
     156                } 
     157 
     158                /** 
     159                 * @global WP_Locale $wp_locale 
     160                 */ 
     161                $GLOBALS['wp_locale'] = new WP_Locale(); 
     162 
     163                return $locale; 
     164        } 
     165 
     166        /** 
     167         * Checks if there are cached translations for the given locale. 
     168         * 
     169         * @since 4.6.0 
     170         * 
     171         * @param string $locale The locale. 
     172         * @return bool True if there are cached translations for the given locale, false otherwise. 
     173         */ 
     174        private function has_translations_for_locale( $locale ) { 
     175                return ! empty( $this->translations[ $locale ] ); 
     176        } 
     177 
     178        /** 
     179         * Removes all filter callbacks added before. 
     180         * 
     181         * @since 4.6.0 
     182         */ 
     183        private function remove_filters() { 
     184                foreach ( $this->filters as $filter ) { 
     185                        remove_filter( 'locale', $filter ); 
     186                } 
     187        } 
     188 
     189        /** 
     190         * Adds a filter callback returning the given locale. 
     191         * 
     192         * @since 4.6.0 
     193         * 
     194         * @param string $locale The locale. 
     195         */ 
     196        private function add_filter_for_locale( $locale ) { 
     197                if ( ! isset( $this->filters[ $locale ] ) ) { 
     198                        require_once ABSPATH . WPINC . '/class-wp-locale-storage.php'; 
     199 
     200                        // This SHOULD be a closure. 
     201                        $this->filters[ $locale ] = array( new WP_Locale_Storage( $locale ), 'get' ); 
     202                } 
     203 
     204                add_filter( 'locale', $this->filters[ $locale ] ); 
     205        } 
     206} 
  • src/wp-includes/locale.php

     
    1010/** WP_Locale class */ 
    1111require_once ABSPATH . WPINC . '/class-wp-locale.php'; 
    1212 
     13/** WP_Locale_Switcher class */ 
     14require_once ABSPATH . WPINC . '/class-wp-locale-switcher.php'; 
     15 
    1316/** 
    1417 * Checks if current locale is RTL. 
    1518 * 
     
    2124 */ 
    2225function is_rtl() { 
    2326        global $wp_locale; 
     27 
    2428        return $wp_locale->is_rtl(); 
    2529} 
     30 
     31/** 
     32 * Switches the translations according to the given locale. 
     33 * 
     34 * @since 4.6.0 
     35 * 
     36 * @global WP_Locale_Switcher $wp_locale_switcher 
     37 * 
     38 * @param string $locale The locale. 
     39 * @return bool True on success, false on failure. 
     40 */ 
     41function switch_to_locale( $locale ) { 
     42        global $wp_locale_switcher; 
     43 
     44        return $wp_locale_switcher->switch_to_locale( $locale ); 
     45} 
     46 
     47/** 
     48 * Restores the translations according to the previous locale. 
     49 * 
     50 * @since 4.6.0 
     51 * 
     52 * @global WP_Locale_Switcher $wp_locale_switcher 
     53 * 
     54 * @return string|false Locale on success, false on error. 
     55 */ 
     56function restore_locale() { 
     57        global $wp_locale_switcher; 
     58 
     59        return $wp_locale_switcher->restore_locale(); 
     60} 
  • src/wp-includes/pomo/mo.php

     
    1616        var $_nplurals = 2; 
    1717 
    1818        /** 
     19         * Loaded MO file. 
     20         * 
     21         * @since 4.6.0 
     22         * @var string 
     23         */ 
     24        private $filename = ''; 
     25 
     26        /** 
     27         * Returns the loaded MO file. 
     28         * 
     29         * @since 4.6.0 
     30         * 
     31         * @return string The loaded MO file. 
     32         */ 
     33        public function get_filename() { 
     34                return $this->filename; 
     35        } 
     36 
     37        /** 
    1938         * Fills up with the entries from MO file $filename 
    2039         * 
    2140         * @param string $filename MO file to load 
     
    2443                $reader = new POMO_FileReader($filename); 
    2544                if (!$reader->is_resource()) 
    2645                        return false; 
     46                $this->filename = (string) $filename; 
    2747                return $this->import_from_reader($reader); 
    2848        } 
    2949 
     
    299319                return $this->_nplurals; 
    300320        } 
    301321} 
    302 endif; 
    303  No newline at end of file 
     322endif; 
  • src/wp-settings.php

     
    379379 */ 
    380380$GLOBALS['wp_locale'] = new WP_Locale(); 
    381381 
     382/** 
     383 * WordPress Locale Switcher object for switching locales. 
     384 * @global WP_Locale_Switcher $wp_locale_switcher 
     385 * @since 4.6.0 
     386 */ 
     387$GLOBALS['wp_locale_switcher'] = new WP_Locale_Switcher(); 
     388 
    382389// Load the functions for the active theme, for both parent and child theme if applicable. 
    383390if ( ! wp_installing() || 'wp-activate.php' === $pagenow ) { 
    384391        if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )