WordPress.org

Make WordPress Core

Changeset 37855


Ignore:
Timestamp:
06/23/2016 02:47:44 PM (4 years ago)
Author:
swissspidy
Message:

I18N: Enable unloading of text domains that have been loaded just in time.

[37415] removed the requirement to call load_plugin_textdomain() / load_theme_textdomain(). This caused unload_textdomain() to not work properly anymore in these cases.

With this change, unloaded text domains need to be explicitly loaded manually if you want to use them again.

Props swissspidy, ocean90.
Fixes #37113. See #34114.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/l10n.php

    r37517 r37855  
    510510 * @since 1.5.0
    511511 *
    512  * @global array $l10n
     512 * @global array $l10n          An array of all currently loaded text domains.
     513 * @global array $l10n_unloaded An array of all text domains that have been unloaded again.
    513514 *
    514515 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
     
    517518 */
    518519function load_textdomain( $domain, $mofile ) {
    519     global $l10n;
     520    global $l10n, $l10n_unloaded;
     521
     522    $l10n_unloaded = (array) $l10n_unloaded;
    520523
    521524    /**
     
    531534
    532535    if ( true == $plugin_override ) {
     536        unset( $l10n_unloaded[ $domain ] );
     537
    533538        return true;
    534539    }
     
    562567        $mo->merge_with( $l10n[$domain] );
    563568
     569    unset( $l10n_unloaded[ $domain ] );
     570
    564571    $l10n[$domain] = &$mo;
    565572
     
    572579 * @since 3.0.0
    573580 *
    574  * @global array $l10n
     581 * @global array $l10n          An array of all currently loaded text domains.
     582 * @global array $l10n_unloaded An array of all text domains that have been unloaded again.
    575583 *
    576584 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
     
    578586 */
    579587function unload_textdomain( $domain ) {
    580     global $l10n;
     588    global $l10n, $l10n_unloaded;
     589
     590    $l10n_unloaded = (array) $l10n_unloaded;
    581591
    582592    /**
     
    590600    $plugin_override = apply_filters( 'override_unload_textdomain', false, $domain );
    591601
    592     if ( $plugin_override )
     602    if ( $plugin_override ) {
     603        $l10n_unloaded[ $domain ] = true;
     604
    593605        return true;
     606    }
    594607
    595608    /**
     
    604617    if ( isset( $l10n[$domain] ) ) {
    605618        unset( $l10n[$domain] );
     619
     620        $l10n_unloaded[ $domain ] = true;
     621
    606622        return true;
    607623    }
     
    794810 *
    795811 * @see get_translations_for_domain()
     812 * @global array $l10n_unloaded An array of all text domains that have been unloaded again.
    796813 *
    797814 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
     
    799816 */
    800817function _load_textdomain_just_in_time( $domain ) {
     818    global $l10n_unloaded;
     819
     820    $l10n_unloaded = (array) $l10n_unloaded;
     821
    801822    static $cached_mofiles = null;
    802823
    803824    // Short-circuit if domain is 'default' which is reserved for core.
    804     if ( 'default' === $domain ) {
     825    if ( 'default' === $domain || isset( $l10n_unloaded[ $domain ] ) ) {
    805826        return false;
    806827    }
  • trunk/tests/phpunit/tests/l10n/loadTextdomainJustInTime.php

    r37440 r37855  
    2323        wp_clean_themes_cache();
    2424        unset( $GLOBALS['wp_themes'] );
     25
     26        unset( $GLOBALS['l10n_unloaded'] );
    2527    }
    2628
     
    9092
    9193    /**
    92      * @ticket 341142
     94     * @ticket 34114
    9395     */
    9496    public function test_get_translations_for_domain_does_not_return_null_if_override_load_textdomain_is_used() {
     
    101103        $this->assertTrue( $translations instanceof NOOP_Translations );
    102104    }
     105
     106    /**
     107     * @ticket 37113
     108     */
     109    public function test_should_allow_unloading_of_text_domain() {
     110        add_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
     111
     112        require_once DIR_TESTDATA . '/plugins/internationalized-plugin.php';
     113
     114        $expected_output_before      = i18n_plugin_test();
     115        $is_textdomain_loaded_before = is_textdomain_loaded( 'internationalized-plugin' );
     116
     117        unload_textdomain( 'internationalized-plugin' );
     118        remove_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
     119
     120        $expected_output_after      = i18n_plugin_test();
     121        $is_textdomain_loaded_after = is_textdomain_loaded( 'internationalized-plugin' );
     122
     123        add_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
     124        load_textdomain( 'internationalized-plugin', WP_LANG_DIR . '/plugins/internationalized-plugin-de_DE.mo' );
     125
     126        $expected_output_final      = i18n_plugin_test();
     127        $is_textdomain_loaded_final = is_textdomain_loaded( 'internationalized-plugin' );
     128
     129        unload_textdomain( 'internationalized-plugin' );
     130        remove_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
     131
     132        // Text domain loaded just in time.
     133        $this->assertSame( 'Das ist ein Dummy Plugin', $expected_output_before );
     134        $this->assertTrue( $is_textdomain_loaded_before );
     135
     136        // Text domain unloaded.
     137        $this->assertSame( 'This is a dummy plugin', $expected_output_after );
     138        $this->assertFalse( $is_textdomain_loaded_after );
     139
     140        // Text domain loaded manually again.
     141        $this->assertSame( 'Das ist ein Dummy Plugin', $expected_output_final );
     142        $this->assertTrue( $is_textdomain_loaded_final );
     143    }
    103144}
Note: See TracChangeset for help on using the changeset viewer.