Make WordPress Core


Ignore:
Timestamp:
08/11/2022 12:37:05 PM (3 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/src/wp-includes/class-wp-locale-switcher.php

    r49566 r53874  
    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 current text domain but allow them to be reloaded
     205            // after switching back or to another locale.
     206            unload_textdomain( $domain, true );
    204207            get_translations_for_domain( $domain );
    205208        }
     
    219222     */
    220223    private function change_locale( $locale ) {
    221         // Reset translation availability information.
    222         _get_path_to_translation( null, true );
     224        global $wp_locale;
    223225
    224226        $this->load_translations( $locale );
    225227
    226         $GLOBALS['wp_locale'] = new WP_Locale();
     228        $wp_locale = new WP_Locale();
    227229
    228230        /**
Note: See TracChangeset for help on using the changeset viewer.