Make WordPress Core

Changeset 49236


Ignore:
Timestamp:
10/20/2020 04:03:58 PM (6 years ago)
Author:
ocean90
Message:

I18N: Introduce WP_Textdomain_Registry to store text domains and their language directory paths.

Previously, when using switch_to_locale() all current loaded text domains were unloaded and added to the $l10n_unloaded global. This prevented the just-in-time loading for text domains after a switch. The just-in-time loading was also only possible if the translations were stored in WP_LANG_DIR. Both issues have been fixed.

  • Adds WP_Textdomain_Registry to keep track of the language directory paths for all plugins and themes.
  • Updates all load_*_textdomain() functions to store the path in WP_Textdomain_Registry.
  • Adds $reloadable parameter to unload_textdomain() to define whether a text domain can be loaded just-in-time again. This is used by WP_Locale_Switcher::load_translations().
  • Extends _load_textdomain_just_in_time() to also support text domains of plugins and themes with custom language directories.
  • Fixes the incorrect test_plugin_translation_after_switching_locale_twice() test which should have catch this issue earlier.
  • Adds a new test plugin/theme to test the loading of translations with a custom language directory.
  • Deprecates the now unused and private _get_path_to_translation() and _get_path_to_translation_from_lang_dir() functions.

Props yoavf, swissspidy, dd32, ocean90.
See #26511.
Fixes #39210.

Location:
trunk
Files:
19 added
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-locale-switcher.php

    r46586 r49236  
    197197
    198198                foreach ( $domains as $domain ) {
     199                        // The default text domain is handled by `load_default_textdomain()`.
    199200                        if ( 'default' === $domain ) {
    200201                                continue;
    201202                        }
    202203
    203                         unload_textdomain( $domain );
     204                        unload_textdomain( $domain, true );
    204205                        get_translations_for_domain( $domain );
    205206                }
    … …  
    219220         */
    220221        private function change_locale( $locale ) {
    221                 // Reset translation availability information.
    222                 _get_path_to_translation( null, true );
     222                global $wp_locale;
    223223
    224224                $this->load_translations( $locale );
    225225
    226                 $GLOBALS['wp_locale'] = new WP_Locale();
     226                $wp_locale = new WP_Locale();
    227227
    228228                /**
  • trunk/src/wp-includes/deprecated.php

    r49197 r49236  
    41354135        return is_string( $value ) ? addslashes( $value ) : $value;
    41364136}
     4137
     4138/**
     4139 * Gets the path to a translation file for loading a textdomain just in time.
     4140 *
     4141 * Caches the retrieved results internally.
     4142 *
     4143 * @since 4.7.0
     4144 * @deprecated 5.6.0
     4145 * @access private
     4146 *
     4147 * @see _load_textdomain_just_in_time()
     4148 *
     4149 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
     4150 * @param bool   $reset  Whether to reset the internal cache. Used by the switch to locale functionality.
     4151 * @return string|false The path to the translation file or false if no translation file was found.
     4152 */
     4153function _get_path_to_translation( $domain, $reset = false ) {
     4154        _deprecated_function( __FUNCTION__, '5.6.0', 'WP_Textdomain_Registry' );
     4155
     4156        static $available_translations = array();
     4157
     4158        if ( true === $reset ) {
     4159                $available_translations = array();
     4160        }
     4161
     4162        if ( ! isset( $available_translations[ $domain ] ) ) {
     4163                $available_translations[ $domain ] = _get_path_to_translation_from_lang_dir( $domain );
     4164        }
     4165
     4166        return $available_translations[ $domain ];
     4167}
     4168
     4169/**
     4170 * Gets the path to a translation file in the languages directory for the current locale.
     4171 *
     4172 * Holds a cached list of available .mo files to improve performance.
     4173 *
     4174 * @since 4.7.0
     4175 * @deprecated 5.6.0
     4176 * @access private
     4177 *
     4178 * @see _get_path_to_translation()
     4179 *
     4180 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
     4181 * @return string|false The path to the translation file or false if no translation file was found.
     4182 */
     4183function _get_path_to_translation_from_lang_dir( $domain ) {
     4184        _deprecated_function( __FUNCTION__, '5.6.0', 'WP_Textdomain_Registry' );
     4185
     4186        static $cached_mofiles = null;
     4187
     4188        if ( null === $cached_mofiles ) {
     4189                $cached_mofiles = array();
     4190
     4191                $locations = array(
     4192                        WP_LANG_DIR . '/plugins',
     4193                        WP_LANG_DIR . '/themes',
     4194                );
     4195
     4196                foreach ( $locations as $location ) {
     4197                        $mofiles = glob( $location . '/*.mo' );
     4198                        if ( $mofiles ) {
     4199                                $cached_mofiles = array_merge( $cached_mofiles, $mofiles );
     4200                        }
     4201                }
     4202        }
     4203
     4204        $locale = determine_locale();
     4205        $mofile = "{$domain}-{$locale}.mo";
     4206
     4207        $path = WP_LANG_DIR . '/plugins/' . $mofile;
     4208        if ( in_array( $path, $cached_mofiles, true ) ) {
     4209                return $path;
     4210        }
     4211
     4212        $path = WP_LANG_DIR . '/themes/' . $mofile;
     4213        if ( in_array( $path, $cached_mofiles, true ) ) {
     4214                return $path;
     4215        }
     4216
     4217        return false;
     4218}
  • trunk/src/wp-includes/l10n.php

    r49193 r49236  
    690690 * @since 1.5.0
    691691 *
    692  * @global MO[] $l10n          An array of all currently loaded text domains.
    693  * @global MO[] $l10n_unloaded An array of all text domains that have been unloaded again.
     692 * @global MO[]                   $l10n                   An array of all currently loaded text domains.
     693 * @global MO[]                   $l10n_unloaded          An array of all text domains that have been unloaded again.
     694 * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry.
    694695 *
    695696 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
    … …  
    698699 */
    699700function load_textdomain( $domain, $mofile ) {
    700         global $l10n, $l10n_unloaded;
     701        global $l10n, $l10n_unloaded, $wp_textdomain_registry;
    701702
    702703        $l10n_unloaded = (array) $l10n_unloaded;
    … …  
    756757        $l10n[ $domain ] = &$mo;
    757758
     759        /** @var WP_Textdomain_Registry $wp_textdomain_registry */
     760        $wp_textdomain_registry->set( $domain, dirname( $mofile ) );
     761
    758762        return true;
    759763}
    … …  
    763767 *
    764768 * @since 3.0.0
     769 * @since 5.6.0 Added the `$reloadable` parameter.
    765770 *
    766771 * @global MO[] $l10n          An array of all currently loaded text domains.
    767772 * @global MO[] $l10n_unloaded An array of all text domains that have been unloaded again.
    768773 *
    769  * @param string $domain Text domain. Unique identifier for retrieving translated strings.
     774 * @param string $domain     Text domain. Unique identifier for retrieving translated strings.
     775 * @param bool   $reloadable Whether the text domain can be loaded just-in-time again.
    770776 * @return bool Whether textdomain was unloaded.
    771777 */
    772 function unload_textdomain( $domain ) {
     778function unload_textdomain( $domain, $reloadable = false ) {
    773779        global $l10n, $l10n_unloaded;
    774780
    … …  
    779785         *
    780786         * @since 3.0.0
    781          *
    782          * @param bool   $override Whether to override the text domain unloading. Default false.
    783          * @param string $domain   Text domain. Unique identifier for retrieving translated strings.
    784          */
    785         $plugin_override = apply_filters( 'override_unload_textdomain', false, $domain );
     787         * @since 5.6.0 Added the `$reloadable` parameter.
     788         *
     789         * @param bool   $override   Whether to override the text domain unloading. Default false.
     790         * @param string $domain     Text domain. Unique identifier for retrieving translated strings.
     791         * @param bool   $reloadable Whether the text domain can be loaded just-in-time again.
     792         */
     793        $plugin_override = apply_filters( 'override_unload_textdomain', false, $domain, $reloadable );
    786794
    787795        if ( $plugin_override ) {
    788                 $l10n_unloaded[ $domain ] = true;
     796                if ( ! $reloadable ) {
     797                        $l10n_unloaded[ $domain ] = true;
     798                }
    789799
    790800                return true;
    … …  
    795805         *
    796806         * @since 3.0.0
    797          *
    798          * @param string $domain Text domain. Unique identifier for retrieving translated strings.
    799          */
    800         do_action( 'unload_textdomain', $domain );
     807         * @since 5.6.0 Added the `$reloadable` parameter.
     808         *
     809         * @param string $domain     Text domain. Unique identifier for retrieving translated strings.
     810         * @param bool   $reloadable Whether the text domain can be loaded just-in-time again.
     811         */
     812        do_action( 'unload_textdomain', $domain, $reloadable );
    801813
    802814        if ( isset( $l10n[ $domain ] ) ) {
    803815                unset( $l10n[ $domain ] );
    804816
    805                 $l10n_unloaded[ $domain ] = true;
     817                if ( ! $reloadable ) {
     818                        $l10n_unloaded[ $domain ] = true;
     819                }
    806820
    807821                return true;
    … …  
    868882 */
    869883function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path = false ) {
     884        global $wp_textdomain_registry;
     885
    870886        /**
    871887         * Filters a plugin's locale.
    … …  
    894910        }
    895911
     912        /* @var WP_Textdomain_Registry $wp_textdomain_registry */
     913        $wp_textdomain_registry->set( $domain, $path );
     914
    896915        return load_textdomain( $domain, $path . '/' . $mofile );
    897916}
    … …  
    902921 * @since 3.0.0
    903922 * @since 4.6.0 The function now tries to load the .mo file from the languages directory first.
     923 *
     924 * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry.
    904925 *
    905926 * @param string $domain             Text domain. Unique identifier for retrieving translated strings.
    … …  
    909930 */
    910931function load_muplugin_textdomain( $domain, $mu_plugin_rel_path = '' ) {
     932        global $wp_textdomain_registry;
     933
    911934        /** This filter is documented in wp-includes/l10n.php */
    912935        $locale = apply_filters( 'plugin_locale', determine_locale(), $domain );
    … …  
    921944        $path = WPMU_PLUGIN_DIR . '/' . ltrim( $mu_plugin_rel_path, '/' );
    922945
     946        /* @var WP_Textdomain_Registry $wp_textdomain_registry */
     947        $wp_textdomain_registry->set( $domain, $path );
     948
    923949        return load_textdomain( $domain, $path . '/' . $mofile );
    924950}
    … …  
    934960 * @since 1.5.0
    935961 * @since 4.6.0 The function now tries to load the .mo file from the languages directory first.
     962 *
     963 * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry.
    936964 *
    937965 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
    … …  
    941969 */
    942970function load_theme_textdomain( $domain, $path = false ) {
     971        global $wp_textdomain_registry;
     972
    943973        /**
    944974         * Filters a theme's locale.
    … …  
    961991                $path = get_template_directory();
    962992        }
     993
     994        /* @var WP_Textdomain_Registry $wp_textdomain_registry */
     995        $wp_textdomain_registry->set( $domain, $path );
    963996
    964997        return load_textdomain( $domain, $path . '/' . $locale . '.mo' );
    … …  
    11911224 * @access private
    11921225 *
    1193  * @see get_translations_for_domain()
    1194  * @global MO[] $l10n_unloaded An array of all text domains that have been unloaded again.
     1226 * @global MO[]                   $l10n_unloaded          An array of all text domains that have been unloaded again.
     1227 * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry.
    11951228 *
    11961229 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
    … …  
    11981231 */
    11991232function _load_textdomain_just_in_time( $domain ) {
    1200         global $l10n_unloaded;
     1233        global $l10n_unloaded, $wp_textdomain_registry;
    12011234
    12021235        $l10n_unloaded = (array) $l10n_unloaded;
    … …  
    12071240        }
    12081241
    1209         $translation_path = _get_path_to_translation( $domain );
    1210         if ( false === $translation_path ) {
     1242        /** @var WP_Textdomain_Registry $wp_textdomain_registry */
     1243        $path = $wp_textdomain_registry->get( $domain );
     1244        if ( ! $path ) {
    12111245                return false;
    12121246        }
    12131247
    1214         return load_textdomain( $domain, $translation_path );
    1215 }
    1216 
    1217 /**
    1218  * Gets the path to a translation file for loading a textdomain just in time.
    1219  *
    1220  * Caches the retrieved results internally.
    1221  *
    1222  * @since 4.7.0
    1223  * @access private
    1224  *
    1225  * @see _load_textdomain_just_in_time()
    1226  *
    1227  * @param string $domain Text domain. Unique identifier for retrieving translated strings.
    1228  * @param bool   $reset  Whether to reset the internal cache. Used by the switch to locale functionality.
    1229  * @return string|false The path to the translation file or false if no translation file was found.
    1230  */
    1231 function _get_path_to_translation( $domain, $reset = false ) {
    1232         static $available_translations = array();
    1233 
    1234         if ( true === $reset ) {
    1235                 $available_translations = array();
    1236         }
    1237 
    1238         if ( ! isset( $available_translations[ $domain ] ) ) {
    1239                 $available_translations[ $domain ] = _get_path_to_translation_from_lang_dir( $domain );
    1240         }
    1241 
    1242         return $available_translations[ $domain ];
    1243 }
    1244 
    1245 /**
    1246  * Gets the path to a translation file in the languages directory for the current locale.
    1247  *
    1248  * Holds a cached list of available .mo files to improve performance.
    1249  *
    1250  * @since 4.7.0
    1251  * @access private
    1252  *
    1253  * @see _get_path_to_translation()
    1254  *
    1255  * @param string $domain Text domain. Unique identifier for retrieving translated strings.
    1256  * @return string|false The path to the translation file or false if no translation file was found.
    1257  */
    1258 function _get_path_to_translation_from_lang_dir( $domain ) {
    1259         static $cached_mofiles = null;
    1260 
    1261         if ( null === $cached_mofiles ) {
    1262                 $cached_mofiles = array();
    1263 
    1264                 $locations = array(
    1265                         WP_LANG_DIR . '/plugins',
    1266                         WP_LANG_DIR . '/themes',
    1267                 );
    1268 
    1269                 foreach ( $locations as $location ) {
    1270                         $mofiles = glob( $location . '/*.mo' );
    1271                         if ( $mofiles ) {
    1272                                 $cached_mofiles = array_merge( $cached_mofiles, $mofiles );
    1273                         }
    1274                 }
    1275         }
    1276 
    12771248        $locale = determine_locale();
    1278         $mofile = "{$domain}-{$locale}.mo";
    1279 
    1280         $path = WP_LANG_DIR . '/plugins/' . $mofile;
    1281         if ( in_array( $path, $cached_mofiles, true ) ) {
    1282                 return $path;
    1283         }
    1284 
    1285         $path = WP_LANG_DIR . '/themes/' . $mofile;
    1286         if ( in_array( $path, $cached_mofiles, true ) ) {
    1287                 return $path;
    1288         }
    1289 
    1290         return false;
     1249
     1250        // Themes with their language directory outside of WP_LANG_DIR have a different file name.
     1251        $template_directory   = trailingslashit( get_template_directory() );
     1252        $stylesheet_directory = trailingslashit( get_stylesheet_directory() );
     1253        if ( 0 === strpos( $path, $template_directory ) || 0 === strpos( $path, $stylesheet_directory ) ) {
     1254                $mofile = "{$path}{$locale}.mo";
     1255        } else {
     1256                $mofile = "{$path}{$domain}-{$locale}.mo";
     1257        }
     1258
     1259        return load_textdomain( $domain, $mofile );
    12911260}
    12921261
    … …  
    12981267 * @since 2.8.0
    12991268 *
    1300  * @global MO[] $l10n
     1269 * @global MO[] $l10n An array of all currently loaded text domains.
    13011270 *
    13021271 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
    … …  
    13221291 * @since 3.0.0
    13231292 *
    1324  * @global MO[] $l10n
     1293 * @global MO[] $l10n An array of all currently loaded text domains.
    13251294 *
    13261295 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
  • trunk/src/wp-settings.php

    r49226 r49236  
    153153// Load the L10n library.
    154154require_once ABSPATH . WPINC . '/l10n.php';
     155require_once ABSPATH . WPINC . '/class-wp-textdomain-registry.php';
    155156require_once ABSPATH . WPINC . '/class-wp-locale.php';
    156157require_once ABSPATH . WPINC . '/class-wp-locale-switcher.php';
    … …  
    302303$GLOBALS['wp_embed'] = new WP_Embed();
    303304
     305/**
     306 * WordPress Textdomain Registry object.
     307 *
     308 * Used to support just-in-time translations for manually loaded textdomains.
     309 *
     310 * @since 5.6.0
     311 *
     312 * @global WP_Locale_Switcher $wp_locale_switcher WordPress Textdomain Registry.
     313 */
     314$GLOBALS['wp_textdomain_registry'] = new WP_Textdomain_Registry();
     315
    304316// Load multisite-specific files.
    305317if ( is_multisite() ) {
  • trunk/tests/phpunit/data/languages/plugins/internationalized-plugin-de_DE.po

    r48930 r49236  
    33"Project-Id-Version: \n"
    44"POT-Creation-Date: 2015-12-31 16:31+0100\n"
    5 "PO-Revision-Date: 2016-10-26 00:02+0200\n"
     5"PO-Revision-Date: 2020-10-20 17:11+0200\n"
    66"Language: de_DE\n"
    77"MIME-Version: 1.0\n"
    88"Content-Type: text/plain; charset=UTF-8\n"
    99"Content-Transfer-Encoding: 8bit\n"
    10 "X-Generator: Poedit 1.8.10\n"
     10"X-Generator: Poedit 2.4.1\n"
    1111"X-Poedit-Basepath: .\n"
    1212"Plural-Forms: nplurals=2; plural=(n != 1);\n"
    … …  
    1515"esc_html_x:1,2c\n"
    1616"X-Textdomain-Support: yes\n"
     17"Language-Team: \n"
     18"Last-Translator: \n"
    1719"X-Poedit-SearchPath-0: .\n"
    1820
  • trunk/tests/phpunit/data/languages/themes/internationalized-theme-de_DE.po

    r48930 r49236  
    33"Project-Id-Version: \n"
    44"POT-Creation-Date: 2015-12-31 16:38+0100\n"
    5 "PO-Revision-Date: 2016-10-26 00:02+0200\n"
     5"PO-Revision-Date: 2020-10-20 17:09+0200\n"
    66"Language: de_DE\n"
    77"MIME-Version: 1.0\n"
    88"Content-Type: text/plain; charset=UTF-8\n"
    99"Content-Transfer-Encoding: 8bit\n"
    10 "X-Generator: Poedit 1.8.10\n"
     10"X-Generator: Poedit 2.4.1\n"
    1111"X-Poedit-Basepath: .\n"
    1212"Plural-Forms: nplurals=2; plural=(n != 1);\n"
    … …  
    1515"esc_html_x:1,2c\n"
    1616"X-Textdomain-Support: yes\n"
     17"Last-Translator: \n"
     18"Language-Team: \n"
    1719"X-Poedit-SearchPath-0: .\n"
    1820
  • trunk/tests/phpunit/data/plugins/hello.php

    r46586 r49236  
    55Description: This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from <cite>Hello, Dolly</cite> in the upper right of your admin screen on every page.
    66Author: Matt Mullenweg
    7 Version: 1.5.1
     7Version: 1.7.2
    88Author URI: http://ma.tt/
    99Text Domain: hello-dolly
    1010
    1111*/
    12 
    13 // Test for
    14 ?>
  • trunk/tests/phpunit/includes/bootstrap.php

    r49226 r49236  
    7777define( 'DIR_TESTROOT', realpath( dirname( __DIR__ ) ) );
    7878
    79 define( 'WP_LANG_DIR', DIR_TESTDATA . '/languages' );
     79define( 'WP_LANG_DIR', realpath( DIR_TESTDATA . '/languages' ) );
     80define( 'WP_PLUGIN_DIR', realpath( DIR_TESTDATA . '/plugins' ) );
    8081
    8182if ( ! defined( 'WP_TESTS_FORCE_KNOWN_BUGS' ) ) {
  • trunk/tests/phpunit/tests/admin/includesPlugin.php

    r49112 r49236  
    1515                        'Author'      => '<a href="http://ma.tt/">Matt Mullenweg</a>',
    1616                        'AuthorURI'   => 'http://ma.tt/',
    17                         'Version'     => '1.5.1',
     17                        'Version'     => '1.7.2',
    1818                        'TextDomain'  => 'hello-dolly',
    1919                        'DomainPath'  => '',
  • trunk/tests/phpunit/tests/l10n/loadTextdomain.php

    r46586 r49236  
    2525                add_filter( 'plugin_locale', array( $this, 'store_locale' ) );
    2626                add_filter( 'theme_locale', array( $this, 'store_locale' ) );
     27
     28                /** @var WP_Textdomain_Registry $wp_textdomain_registry */
     29                global $wp_textdomain_registry;
     30
     31                $wp_textdomain_registry->reset();
    2732        }
    2833
    … …  
    3136                remove_filter( 'theme_locale', array( $this, 'store_locale' ) );
    3237
     38                /** @var WP_Textdomain_Registry $wp_textdomain_registry */
     39                global $wp_textdomain_registry;
     40
     41                $wp_textdomain_registry->reset();
     42
    3343                parent::tearDown();
    3444        }
    … …  
    117127         * @ticket 21319
    118128         */
    119         function test_is_textdomain_is_not_loaded_after_gettext_call_with_no_translations() {
     129        public function test_is_textdomain_is_not_loaded_after_gettext_call_with_no_translations() {
    120130                $this->assertFalse( is_textdomain_loaded( 'wp-tests-domain' ) );
    121131                __( 'just some string', 'wp-tests-domain' );
    … …  
    123133        }
    124134
    125         function test_override_load_textdomain_noop() {
     135        public function test_override_load_textdomain_noop() {
    126136                add_filter( 'override_load_textdomain', '__return_true' );
    127137                $load_textdomain = load_textdomain( 'wp-tests-domain', DIR_TESTDATA . '/non-existent-file' );
    … …  
    132142        }
    133143
    134         function test_override_load_textdomain_non_existent_mofile() {
     144        public function test_override_load_textdomain_non_existent_mofile() {
    135145                add_filter( 'override_load_textdomain', array( $this, '_override_load_textdomain_filter' ), 10, 3 );
    136146                $load_textdomain = load_textdomain( 'wp-tests-domain', WP_LANG_DIR . '/non-existent-file.mo' );
    … …  
    146156        }
    147157
    148         function test_override_load_textdomain_custom_mofile() {
     158        public function test_override_load_textdomain_custom_mofile() {
    149159                add_filter( 'override_load_textdomain', array( $this, '_override_load_textdomain_filter' ), 10, 3 );
    150160                $load_textdomain = load_textdomain( 'wp-tests-domain', WP_LANG_DIR . '/plugins/internationalized-plugin-de_DE.mo' );
    … …  
    166176         * @return bool
    167177         */
    168         function _override_load_textdomain_filter( $override, $domain, $file ) {
     178        public function _override_load_textdomain_filter( $override, $domain, $file ) {
    169179                global $l10n;
    170180
  • trunk/tests/phpunit/tests/l10n/loadTextdomainJustInTime.php

    r47200 r49236  
    3333                add_filter( 'template_root', array( $this, 'filter_theme_root' ) );
    3434                wp_clean_themes_cache();
    35                 unset( $GLOBALS['wp_themes'] );
    36                 unset( $GLOBALS['l10n'] );
    37                 unset( $GLOBALS['l10n_unloaded'] );
    38                 _get_path_to_translation( null, true );
     35                unset( $GLOBALS['wp_themes'], $GLOBALS['l10n'], $GLOBALS['l10n_unloaded'] );
     36
     37                /** @var WP_Textdomain_Registry $wp_textdomain_registry */
     38                global $wp_textdomain_registry;
     39
     40                $wp_textdomain_registry->reset();
    3941        }
    4042
    … …  
    4547                remove_filter( 'template_root', array( $this, 'filter_theme_root' ) );
    4648                wp_clean_themes_cache();
    47                 unset( $GLOBALS['wp_themes'] );
    48                 unset( $GLOBALS['l10n'] );
    49                 unset( $GLOBALS['l10n_unloaded'] );
    50                 _get_path_to_translation( null, true );
     49                unset( $GLOBALS['wp_themes'], $GLOBALS['l10n'], $GLOBALS['l10n_unloaded'] );
     50
     51                /** @var WP_Textdomain_Registry $wp_textdomain_registry */
     52                global $wp_textdomain_registry;
     53
     54                $wp_textdomain_registry->reset();
    5155
    5256                parent::tearDown();
    … …  
    171175        /**
    172176         * @ticket 37997
     177         * @ticket 39210
    173178         */
    174179        public function test_plugin_translation_after_switching_locale_twice() {
    … …  
    184189
    185190                $this->assertSame( 'Das ist ein Dummy Plugin', $expected_de_de );
    186                 $this->assertSame( 'This is a dummy plugin', $expected_es_es );
     191                $this->assertSame( 'Este es un plugin dummy', $expected_es_es );
    187192        }
    188193
  • trunk/tests/phpunit/tests/l10n/localeSwitcher.php

    r48939 r49236  
    2323                $this->previous_locale = '';
    2424
    25                 unset( $GLOBALS['l10n'] );
    26                 unset( $GLOBALS['l10n_unloaded'] );
    27                 _get_path_to_translation( null, true );
     25                unset( $GLOBALS['l10n'], $GLOBALS['l10n_unloaded'] );
     26
     27                /** @var WP_Textdomain_Registry $wp_textdomain_registry */
     28                global $wp_textdomain_registry;
     29
     30                $wp_textdomain_registry->reset();
    2831        }
    2932
    3033        public function tearDown() {
    31                 unset( $GLOBALS['l10n'] );
    32                 unset( $GLOBALS['l10n_unloaded'] );
    33                 _get_path_to_translation( null, true );
     34                unset( $GLOBALS['l10n'], $GLOBALS['l10n_unloaded'] );
     35
     36                /** @var WP_Textdomain_Registry $wp_textdomain_registry */
     37                global $wp_textdomain_registry;
     38
     39                $wp_textdomain_registry->reset();
    3440
    3541                parent::tearDown();
    … …  
    389395        }
    390396
     397        /**
     398         * @ticket 39210
     399         */
     400        public function test_switch_reloads_plugin_translations_outside_wp_lang_dir() {
     401                global $wp_locale_switcher, $wp_textdomain_registry;
     402
     403                $locale_switcher = clone $wp_locale_switcher;
     404
     405                $wp_locale_switcher = new WP_Locale_Switcher();
     406                $wp_locale_switcher->init();
     407
     408                require_once DIR_TESTDATA . '/plugins/custom-internationalized-plugin/custom-internationalized-plugin.php';
     409
     410                $this->assertSame( WP_PLUGIN_DIR . '/custom-internationalized-plugin/languages/', $wp_textdomain_registry->get( 'custom-internationalized-plugin' ) );
     411
     412                $expected = custom_i18n_plugin_test();
     413                $this->assertSame( 'This is a dummy plugin', $expected );
     414
     415                switch_to_locale( 'es_ES' );
     416                switch_to_locale( 'de_DE' );
     417
     418                $expected = custom_i18n_plugin_test();
     419                $this->assertSame( 'Das ist ein Dummy Plugin', $expected );
     420
     421                restore_previous_locale();
     422
     423                $expected = custom_i18n_plugin_test();
     424                $this->assertSame( 'Este es un plugin dummy', $expected );
     425
     426                restore_current_locale();
     427
     428                $wp_locale_switcher = $locale_switcher;
     429        }
     430
     431        /**
     432         * @ticket 39210
     433         */
     434        public function test_switch_reloads_theme_translations_outside_wp_lang_dir() {
     435                global $wp_locale_switcher, $wp_textdomain_registry;
     436
     437                $locale_switcher = clone $wp_locale_switcher;
     438
     439                $wp_locale_switcher = new WP_Locale_Switcher();
     440                $wp_locale_switcher->init();
     441
     442                switch_theme( 'custom-internationalized-theme' );
     443
     444                require_once get_stylesheet_directory() . '/functions.php';
     445
     446                $this->assertSame( get_template_directory() . '/languages/', $wp_textdomain_registry->get( 'custom-internationalized-theme' ) );
     447
     448                $expected = custom_i18n_theme_test();
     449
     450                $this->assertSame( 'This is a dummy theme', $expected );
     451
     452                switch_to_locale( 'es_ES' );
     453                switch_to_locale( 'de_DE' );
     454
     455                $expected = custom_i18n_theme_test();
     456                $this->assertSame( 'Das ist ein Dummy Theme', $expected );
     457
     458                restore_previous_locale();
     459
     460                $expected = custom_i18n_theme_test();
     461                $this->assertSame( 'Este es un tema dummy', $expected );
     462
     463                restore_current_locale();
     464
     465                $wp_locale_switcher = $locale_switcher;
     466        }
     467
    391468        public function filter_locale() {
    392469                return 'es_ES';
  • trunk/tests/phpunit/tests/theme/themeDir.php

    r48937 r49236  
    163163                        'Theme with Spaces in the Directory',
    164164                        'Internationalized Theme',
     165                        'Custom Internationalized Theme',
    165166                        'camelCase',
    166167                        'REST Theme',
Note: See TracChangeset for help on using the changeset viewer.