From abc9d961d5534756a6198dc18cbf08fd025b4791 Mon Sep 17 00:00:00 2001 From: Dominik Schilling Date: Thu, 12 Nov 2020 14:43:09 +0000 Subject: [PATCH] I18N: Revert [49236] for now to investigate alternative implementations. See #39210, #51678, #26511. Built from https://develop.svn.wordpress.org/trunk@49566 git-svn-id: http://core.svn.wordpress.org/trunk@49304 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/class-wp-locale-switcher.php | 8 +- wp-includes/class-wp-textdomain-registry.php | 130 ---------------- wp-includes/deprecated.php | 82 ---------- wp-includes/l10n.php | 155 +++++++++++-------- wp-includes/version.php | 2 +- wp-settings.php | 12 -- 6 files changed, 98 insertions(+), 291 deletions(-) delete mode 100644 wp-includes/class-wp-textdomain-registry.php diff --git a/wp-includes/class-wp-locale-switcher.php b/wp-includes/class-wp-locale-switcher.php index 8a9bbc3903..7ec7622161 100644 --- a/wp-includes/class-wp-locale-switcher.php +++ b/wp-includes/class-wp-locale-switcher.php @@ -196,12 +196,11 @@ class WP_Locale_Switcher { load_default_textdomain( $locale ); foreach ( $domains as $domain ) { - // The default text domain is handled by `load_default_textdomain()`. if ( 'default' === $domain ) { continue; } - unload_textdomain( $domain, true ); + unload_textdomain( $domain ); get_translations_for_domain( $domain ); } } @@ -219,11 +218,12 @@ class WP_Locale_Switcher { * @param string $locale The locale to change to. */ private function change_locale( $locale ) { - global $wp_locale; + // Reset translation availability information. + _get_path_to_translation( null, true ); $this->load_translations( $locale ); - $wp_locale = new WP_Locale(); + $GLOBALS['wp_locale'] = new WP_Locale(); /** * Fires when the locale is switched to or restored. diff --git a/wp-includes/class-wp-textdomain-registry.php b/wp-includes/class-wp-textdomain-registry.php deleted file mode 100644 index 5a5da5ee9c..0000000000 --- a/wp-includes/class-wp-textdomain-registry.php +++ /dev/null @@ -1,130 +0,0 @@ -domains[ $domain ] ) ) { - return $this->domains[ $domain ]; - } - - return $this->get_path_from_lang_dir( $domain ); - } - - /** - * Sets the MO file path for a specific domain. - * - * @since 5.6.0 - * - * @param string $domain Text domain. - * @param string|false $path Language directory path or false if there is none available. - */ - public function set( $domain, $path ) { - $this->domains[ $domain ] = $path ? trailingslashit( $path ) : false; - } - - /** - * Resets the registry state. - * - * @since 5.6.0 - */ - public function reset() { - $this->cached_mo_files = null; - $this->domains = array(); - } - - /** - * Gets the path to a translation file in the languages directory for the current locale. - * - * @since 5.6.0 - * - * @param string $domain Text domain. - * @return string|false MO file path or false if there is none available. - */ - private function get_path_from_lang_dir( $domain ) { - if ( null === $this->cached_mo_files ) { - $this->cached_mo_files = array(); - - $this->set_cached_mo_files(); - } - - $locale = determine_locale(); - $mofile = "{$domain}-{$locale}.mo"; - - $path = WP_LANG_DIR . '/plugins/' . $mofile; - if ( in_array( $path, $this->cached_mo_files, true ) ) { - $path = WP_LANG_DIR . '/plugins/'; - $this->set( $domain, $path ); - - return $path; - } - - $path = WP_LANG_DIR . '/themes/' . $mofile; - if ( in_array( $path, $this->cached_mo_files, true ) ) { - $path = WP_LANG_DIR . '/themes/'; - $this->set( $domain, $path ); - - return $path; - } - - $this->set( $domain, false ); - - return false; - } - - /** - * Reads and caches all available MO files from the plugins and themes language directories. - * - * @since 5.6.0 - */ - protected function set_cached_mo_files() { - $locations = array( - WP_LANG_DIR . '/plugins', - WP_LANG_DIR . '/themes', - ); - - foreach ( $locations as $location ) { - $mo_files = glob( $location . '/*.mo' ); - - if ( $mo_files ) { - $this->cached_mo_files = array_merge( $this->cached_mo_files, $mo_files ); - } - } - } -} diff --git a/wp-includes/deprecated.php b/wp-includes/deprecated.php index ca83d3dfb0..44999504dc 100644 --- a/wp-includes/deprecated.php +++ b/wp-includes/deprecated.php @@ -4134,85 +4134,3 @@ function wp_slash_strings_only( $value ) { function addslashes_strings_only( $value ) { return is_string( $value ) ? addslashes( $value ) : $value; } - -/** - * Gets the path to a translation file for loading a textdomain just in time. - * - * Caches the retrieved results internally. - * - * @since 4.7.0 - * @deprecated 5.6.0 - * @access private - * - * @see _load_textdomain_just_in_time() - * - * @param string $domain Text domain. Unique identifier for retrieving translated strings. - * @param bool $reset Whether to reset the internal cache. Used by the switch to locale functionality. - * @return string|false The path to the translation file or false if no translation file was found. - */ -function _get_path_to_translation( $domain, $reset = false ) { - _deprecated_function( __FUNCTION__, '5.6.0', 'WP_Textdomain_Registry' ); - - static $available_translations = array(); - - if ( true === $reset ) { - $available_translations = array(); - } - - if ( ! isset( $available_translations[ $domain ] ) ) { - $available_translations[ $domain ] = _get_path_to_translation_from_lang_dir( $domain ); - } - - return $available_translations[ $domain ]; -} - -/** - * Gets the path to a translation file in the languages directory for the current locale. - * - * Holds a cached list of available .mo files to improve performance. - * - * @since 4.7.0 - * @deprecated 5.6.0 - * @access private - * - * @see _get_path_to_translation() - * - * @param string $domain Text domain. Unique identifier for retrieving translated strings. - * @return string|false The path to the translation file or false if no translation file was found. - */ -function _get_path_to_translation_from_lang_dir( $domain ) { - _deprecated_function( __FUNCTION__, '5.6.0', 'WP_Textdomain_Registry' ); - - static $cached_mofiles = null; - - if ( null === $cached_mofiles ) { - $cached_mofiles = array(); - - $locations = array( - WP_LANG_DIR . '/plugins', - WP_LANG_DIR . '/themes', - ); - - foreach ( $locations as $location ) { - $mofiles = glob( $location . '/*.mo' ); - if ( $mofiles ) { - $cached_mofiles = array_merge( $cached_mofiles, $mofiles ); - } - } - } - - $locale = determine_locale(); - $mofile = "{$domain}-{$locale}.mo"; - - $path = WP_LANG_DIR . '/plugins/' . $mofile; - if ( in_array( $path, $cached_mofiles, true ) ) { - return $path; - } - - $path = WP_LANG_DIR . '/themes/' . $mofile; - if ( in_array( $path, $cached_mofiles, true ) ) { - return $path; - } - - return false; -} diff --git a/wp-includes/l10n.php b/wp-includes/l10n.php index 6bca550e98..0c6b75ea24 100644 --- a/wp-includes/l10n.php +++ b/wp-includes/l10n.php @@ -689,16 +689,15 @@ function translate_nooped_plural( $nooped_plural, $count, $domain = 'default' ) * * @since 1.5.0 * - * @global MO[] $l10n An array of all currently loaded text domains. - * @global MO[] $l10n_unloaded An array of all text domains that have been unloaded again. - * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry. + * @global MO[] $l10n An array of all currently loaded text domains. + * @global MO[] $l10n_unloaded An array of all text domains that have been unloaded again. * * @param string $domain Text domain. Unique identifier for retrieving translated strings. * @param string $mofile Path to the .mo file. * @return bool True on success, false on failure. */ function load_textdomain( $domain, $mofile ) { - global $l10n, $l10n_unloaded, $wp_textdomain_registry; + global $l10n, $l10n_unloaded; $l10n_unloaded = (array) $l10n_unloaded; @@ -756,9 +755,6 @@ function load_textdomain( $domain, $mofile ) { $l10n[ $domain ] = &$mo; - /** @var WP_Textdomain_Registry $wp_textdomain_registry */ - $wp_textdomain_registry->set( $domain, dirname( $mofile ) ); - return true; } @@ -766,16 +762,14 @@ function load_textdomain( $domain, $mofile ) { * Unload translations for a text domain. * * @since 3.0.0 - * @since 5.6.0 Added the `$reloadable` parameter. * * @global MO[] $l10n An array of all currently loaded text domains. * @global MO[] $l10n_unloaded An array of all text domains that have been unloaded again. * - * @param string $domain Text domain. Unique identifier for retrieving translated strings. - * @param bool $reloadable Whether the text domain can be loaded just-in-time again. + * @param string $domain Text domain. Unique identifier for retrieving translated strings. * @return bool Whether textdomain was unloaded. */ -function unload_textdomain( $domain, $reloadable = false ) { +function unload_textdomain( $domain ) { global $l10n, $l10n_unloaded; $l10n_unloaded = (array) $l10n_unloaded; @@ -784,18 +778,14 @@ function unload_textdomain( $domain, $reloadable = false ) { * Filters whether to override the text domain unloading. * * @since 3.0.0 - * @since 5.6.0 Added the `$reloadable` parameter. * - * @param bool $override Whether to override the text domain unloading. Default false. - * @param string $domain Text domain. Unique identifier for retrieving translated strings. - * @param bool $reloadable Whether the text domain can be loaded just-in-time again. + * @param bool $override Whether to override the text domain unloading. Default false. + * @param string $domain Text domain. Unique identifier for retrieving translated strings. */ - $plugin_override = apply_filters( 'override_unload_textdomain', false, $domain, $reloadable ); + $plugin_override = apply_filters( 'override_unload_textdomain', false, $domain ); if ( $plugin_override ) { - if ( ! $reloadable ) { - $l10n_unloaded[ $domain ] = true; - } + $l10n_unloaded[ $domain ] = true; return true; } @@ -804,19 +794,15 @@ function unload_textdomain( $domain, $reloadable = false ) { * Fires before the text domain is unloaded. * * @since 3.0.0 - * @since 5.6.0 Added the `$reloadable` parameter. * - * @param string $domain Text domain. Unique identifier for retrieving translated strings. - * @param bool $reloadable Whether the text domain can be loaded just-in-time again. + * @param string $domain Text domain. Unique identifier for retrieving translated strings. */ - do_action( 'unload_textdomain', $domain, $reloadable ); + do_action( 'unload_textdomain', $domain ); if ( isset( $l10n[ $domain ] ) ) { unset( $l10n[ $domain ] ); - if ( ! $reloadable ) { - $l10n_unloaded[ $domain ] = true; - } + $l10n_unloaded[ $domain ] = true; return true; } @@ -881,8 +867,6 @@ function load_default_textdomain( $locale = null ) { * @return bool True when textdomain is successfully loaded, false otherwise. */ function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path = false ) { - global $wp_textdomain_registry; - /** * Filters a plugin's locale. * @@ -909,9 +893,6 @@ function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path $path = WP_PLUGIN_DIR; } - /* @var WP_Textdomain_Registry $wp_textdomain_registry */ - $wp_textdomain_registry->set( $domain, $path ); - return load_textdomain( $domain, $path . '/' . $mofile ); } @@ -921,16 +902,12 @@ function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path * @since 3.0.0 * @since 4.6.0 The function now tries to load the .mo file from the languages directory first. * - * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry. - * * @param string $domain Text domain. Unique identifier for retrieving translated strings. * @param string $mu_plugin_rel_path Optional. Relative to `WPMU_PLUGIN_DIR` directory in which the .mo * file resides. Default empty string. * @return bool True when textdomain is successfully loaded, false otherwise. */ function load_muplugin_textdomain( $domain, $mu_plugin_rel_path = '' ) { - global $wp_textdomain_registry; - /** This filter is documented in wp-includes/l10n.php */ $locale = apply_filters( 'plugin_locale', determine_locale(), $domain ); @@ -943,9 +920,6 @@ function load_muplugin_textdomain( $domain, $mu_plugin_rel_path = '' ) { $path = WPMU_PLUGIN_DIR . '/' . ltrim( $mu_plugin_rel_path, '/' ); - /* @var WP_Textdomain_Registry $wp_textdomain_registry */ - $wp_textdomain_registry->set( $domain, $path ); - return load_textdomain( $domain, $path . '/' . $mofile ); } @@ -960,16 +934,12 @@ function load_muplugin_textdomain( $domain, $mu_plugin_rel_path = '' ) { * @since 1.5.0 * @since 4.6.0 The function now tries to load the .mo file from the languages directory first. * - * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry. - * * @param string $domain Text domain. Unique identifier for retrieving translated strings. * @param string $path Optional. Path to the directory containing the .mo file. * Default false. * @return bool True when textdomain is successfully loaded, false otherwise. */ function load_theme_textdomain( $domain, $path = false ) { - global $wp_textdomain_registry; - /** * Filters a theme's locale. * @@ -991,9 +961,6 @@ function load_theme_textdomain( $domain, $path = false ) { $path = get_template_directory(); } - /* @var WP_Textdomain_Registry $wp_textdomain_registry */ - $wp_textdomain_registry->set( $domain, $path ); - return load_textdomain( $domain, $path . '/' . $locale . '.mo' ); } @@ -1223,14 +1190,14 @@ function load_script_translations( $file, $handle, $domain ) { * @since 4.6.0 * @access private * - * @global MO[] $l10n_unloaded An array of all text domains that have been unloaded again. - * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry. + * @see get_translations_for_domain() + * @global MO[] $l10n_unloaded An array of all text domains that have been unloaded again. * * @param string $domain Text domain. Unique identifier for retrieving translated strings. * @return bool True when the textdomain is successfully loaded, false otherwise. */ function _load_textdomain_just_in_time( $domain ) { - global $l10n_unloaded, $wp_textdomain_registry; + global $l10n_unloaded; $l10n_unloaded = (array) $l10n_unloaded; @@ -1239,24 +1206,88 @@ function _load_textdomain_just_in_time( $domain ) { return false; } - /** @var WP_Textdomain_Registry $wp_textdomain_registry */ - $path = $wp_textdomain_registry->get( $domain ); - if ( ! $path ) { + $translation_path = _get_path_to_translation( $domain ); + if ( false === $translation_path ) { return false; } - $locale = determine_locale(); + return load_textdomain( $domain, $translation_path ); +} - // Themes with their language directory outside of WP_LANG_DIR have a different file name. - $template_directory = trailingslashit( get_template_directory() ); - $stylesheet_directory = trailingslashit( get_stylesheet_directory() ); - if ( 0 === strpos( $path, $template_directory ) || 0 === strpos( $path, $stylesheet_directory ) ) { - $mofile = "{$path}{$locale}.mo"; - } else { - $mofile = "{$path}{$domain}-{$locale}.mo"; +/** + * Gets the path to a translation file for loading a textdomain just in time. + * + * Caches the retrieved results internally. + * + * @since 4.7.0 + * @access private + * + * @see _load_textdomain_just_in_time() + * + * @param string $domain Text domain. Unique identifier for retrieving translated strings. + * @param bool $reset Whether to reset the internal cache. Used by the switch to locale functionality. + * @return string|false The path to the translation file or false if no translation file was found. + */ +function _get_path_to_translation( $domain, $reset = false ) { + static $available_translations = array(); + + if ( true === $reset ) { + $available_translations = array(); } - return load_textdomain( $domain, $mofile ); + if ( ! isset( $available_translations[ $domain ] ) ) { + $available_translations[ $domain ] = _get_path_to_translation_from_lang_dir( $domain ); + } + + return $available_translations[ $domain ]; +} + +/** + * Gets the path to a translation file in the languages directory for the current locale. + * + * Holds a cached list of available .mo files to improve performance. + * + * @since 4.7.0 + * @access private + * + * @see _get_path_to_translation() + * + * @param string $domain Text domain. Unique identifier for retrieving translated strings. + * @return string|false The path to the translation file or false if no translation file was found. + */ +function _get_path_to_translation_from_lang_dir( $domain ) { + static $cached_mofiles = null; + + if ( null === $cached_mofiles ) { + $cached_mofiles = array(); + + $locations = array( + WP_LANG_DIR . '/plugins', + WP_LANG_DIR . '/themes', + ); + + foreach ( $locations as $location ) { + $mofiles = glob( $location . '/*.mo' ); + if ( $mofiles ) { + $cached_mofiles = array_merge( $cached_mofiles, $mofiles ); + } + } + } + + $locale = determine_locale(); + $mofile = "{$domain}-{$locale}.mo"; + + $path = WP_LANG_DIR . '/plugins/' . $mofile; + if ( in_array( $path, $cached_mofiles, true ) ) { + return $path; + } + + $path = WP_LANG_DIR . '/themes/' . $mofile; + if ( in_array( $path, $cached_mofiles, true ) ) { + return $path; + } + + return false; } /** @@ -1266,7 +1297,7 @@ function _load_textdomain_just_in_time( $domain ) { * * @since 2.8.0 * - * @global MO[] $l10n An array of all currently loaded text domains. + * @global MO[] $l10n * * @param string $domain Text domain. Unique identifier for retrieving translated strings. * @return Translations|NOOP_Translations A Translations instance. @@ -1290,7 +1321,7 @@ function get_translations_for_domain( $domain ) { * * @since 3.0.0 * - * @global MO[] $l10n An array of all currently loaded text domains. + * @global MO[] $l10n * * @param string $domain Text domain. Unique identifier for retrieving translated strings. * @return bool Whether there are translations. diff --git a/wp-includes/version.php b/wp-includes/version.php index 6c26c65a64..85284cd56f 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -13,7 +13,7 @@ * * @global string $wp_version */ -$wp_version = '5.6-beta3-49565'; +$wp_version = '5.6-beta3-49566'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. diff --git a/wp-settings.php b/wp-settings.php index 9f1f24beb0..71868ecc89 100644 --- a/wp-settings.php +++ b/wp-settings.php @@ -152,7 +152,6 @@ if ( SHORTINIT ) { // Load the L10n library. require_once ABSPATH . WPINC . '/l10n.php'; -require_once ABSPATH . WPINC . '/class-wp-textdomain-registry.php'; require_once ABSPATH . WPINC . '/class-wp-locale.php'; require_once ABSPATH . WPINC . '/class-wp-locale-switcher.php'; @@ -302,17 +301,6 @@ require ABSPATH . WPINC . '/block-supports/typography.php'; $GLOBALS['wp_embed'] = new WP_Embed(); -/** - * WordPress Textdomain Registry object. - * - * Used to support just-in-time translations for manually loaded textdomains. - * - * @since 5.6.0 - * - * @global WP_Locale_Switcher $wp_locale_switcher WordPress Textdomain Registry. - */ -$GLOBALS['wp_textdomain_registry'] = new WP_Textdomain_Registry(); - // Load multisite-specific files. if ( is_multisite() ) { require ABSPATH . WPINC . '/ms-functions.php';