Make WordPress Core


Ignore:
Timestamp:
08/11/2022 12:37:05 PM (2 years ago)
Author:
swissspidy
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 $locale parameter to load_textdomain() to specify the locale the translation file is for.
  • 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 caught this issue earlier.
  • Adds a new test plugin and 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.

Previously added in [49236] and reverted in [49236] to investigate concerns which are now addressed here.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/l10n/loadTextdomainJustInTime.php

    r53866 r53874  
    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
     
    4244        $GLOBALS['wp_theme_directories'] = $this->orig_theme_dir;
    4345        wp_clean_themes_cache();
    44         unset( $GLOBALS['wp_themes'] );
    45         unset( $GLOBALS['l10n'] );
    46         unset( $GLOBALS['l10n_unloaded'] );
    47         _get_path_to_translation( null, true );
     46        unset( $GLOBALS['wp_themes'], $GLOBALS['l10n'], $GLOBALS['l10n_unloaded'] );
     47
     48        /** @var WP_Textdomain_Registry $wp_textdomain_registry */
     49        global $wp_textdomain_registry;
     50
     51        $wp_textdomain_registry->reset();
    4852
    4953        parent::tear_down();
     
    178182    /**
    179183     * @ticket 37997
     184     * @ticket 39210
    180185     *
    181186     * @covers ::switch_to_locale
     
    193198
    194199        $this->assertSame( 'Das ist ein Dummy Plugin', $actual_de_de );
    195         $this->assertSame( 'This is a dummy plugin', $actual_es_es );
     200        $this->assertSame( 'Este es un plugin dummy', $actual_es_es );
    196201    }
    197202
Note: See TracChangeset for help on using the changeset viewer.