WordPress.org

Make WordPress Core

Ticket #26511: 26511.3.patch

File 26511.3.patch, 8.8 KB (added by tfrommen, 22 months ago)

Refreshed patch for 4.7

  • src/wp-includes/class-wp-locale-switcher.php

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

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    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 *
     
    2225function is_rtl() {
    2326        global $wp_locale;
    2427        return $wp_locale->is_rtl();
     28}
     29
     30/**
     31 * Switches the translations according to the given locale.
     32 *
     33 * @since 4.7.0
     34 *
     35 * @param string $locale The locale.
     36 */
     37function switch_to_locale( $locale ) {
     38
     39        /**
     40         * @global WP_Locale_Switcher $wp_locale_switcher
     41         */
     42        global $wp_locale_switcher;
     43
     44        $wp_locale_switcher->switch_to_locale( $locale );
     45}
     46
     47/**
     48 * Restores the translations according to the previous locale.
     49 *
     50 * @since 4.7.0
     51 *
     52 * @return string|false Locale on success, false on error.
     53 */
     54function restore_locale() {
     55
     56        /**
     57         * @global WP_Locale_Switcher $wp_locale_switcher
     58         */
     59        global $wp_locale_switcher;
     60
     61        return $wp_locale_switcher->restore_locale();
    2562}
  • src/wp-includes/pomo/mo.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    1616        var $_nplurals = 2;
    1717
    1818        /**
     19         * Loaded MO file.
     20         *
     21         * @since 4.7.0
     22         * @var string
     23         */
     24        private $filename = '';
     25
     26        /**
     27         * Returns the loaded MO file.
     28         *
     29         * @since 4.7.0
     30         *
     31         * @return string The loaded MO file.
     32         */
     33        public function get_filename() {
     34
     35                return $this->filename;
     36        }
     37
     38        /**
    1939         * Fills up with the entries from MO file $filename
    2040         *
    2141         * @param string $filename MO file to load
     
    2444                $reader = new POMO_FileReader($filename);
    2545                if (!$reader->is_resource())
    2646                        return false;
     47
     48                $this->filename = (string) $filename;
     49
    2750                return $this->import_from_reader($reader);
    2851        }
    2952
     53 No newline at end of file
  • src/wp-settings.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    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.7.0
     386 */
     387$GLOBALS['wp_locale_switcher'] = new WP_Locale_Switcher( $locale );
     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' ) )
  • src/wp-includes/class-wp-locale-storage.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
     1<?php
     2/**
     3 * Simple locale storage.
     4 *
     5 * @package WordPress
     6 * @subpackage i18n
     7 * @since 4.7.0
     8 */
     9
     10/**
     11 * Class for locale storage objects with a getter.
     12 *
     13 * @since 4.7.0
     14 */
     15class WP_Locale_Storage {
     16
     17        /**
     18         * The stored locale.
     19         *
     20         * @since 4.7.0
     21         * @var string
     22         */
     23        private $locale;
     24
     25        /**
     26         * Constructor. Stores the given locale.
     27         *
     28         * @since 4.7.0
     29         *
     30         * @param string $locale A locale.
     31         */
     32        public function __construct( $locale ) {
     33
     34                $this->locale = (string) $locale;
     35        }
     36
     37        /**
     38         * Returns the stored locale.
     39         *
     40         * @since 4.7.0
     41         *
     42         * @return string The stored locale.
     43         */
     44        public function get_locale() {
     45
     46                return $this->locale;
     47        }
     48}