diff --git a/src/wp-includes/l10n.php b/src/wp-includes/l10n.php index a0c7bba903..9467a6b19c 100644 --- a/src/wp-includes/l10n.php +++ b/src/wp-includes/l10n.php @@ -717,6 +717,28 @@ function load_textdomain( $domain, $mofile, $locale = null ) { $l10n_unloaded = (array) $l10n_unloaded; + /** + * Filters whether to short-circuit loading .mo file. + * + * Returning a non-null value from the filter will effectively short-circuit + * the loading, returning the passed value instead. + * + * @since 6.3.0 + * + * @param bool|null $loaded The result of loading a .mo file. Default null. + * @param string $domain Text domain. Unique identifier for retrieving translated strings. + * @param string $mofile Path to the MO file. + * @param string|null $locale Locale. + */ + $loaded = apply_filters( 'pre_load_textdomain', null, $domain, $mofile, $locale ); + if ( null !== $loaded ) { + if ( true === $loaded ) { + unset( $l10n_unloaded[ $domain ] ); + } + + return $loaded; + } + /** * Filters whether to override the .mo file loading. * diff --git a/tests/phpunit/tests/l10n/loadTextdomain.php b/tests/phpunit/tests/l10n/loadTextdomain.php index 26e567d663..234e98015a 100644 --- a/tests/phpunit/tests/l10n/loadTextdomain.php +++ b/tests/phpunit/tests/l10n/loadTextdomain.php @@ -300,4 +300,20 @@ class Tests_L10n_LoadTextdomain extends WP_UnitTestCase { $this->assertSame( get_user_locale(), $this->locale ); } + + /** + * @ticket 58035 + * + * @covers ::load_theme_textdomain + */ + public function test_pre_load_textdomain_filter() { + $override_load_textdomain_callback = new MockAction(); + add_filter( 'override_load_textdomain', array( $override_load_textdomain_callback, 'action' ) ); + + add_filter( 'pre_load_textdomain', '__return_true' ); + load_plugin_textdomain( 'wp-tests-domain' ); + remove_filter( 'pre_load_textdomain', '__return_true' ); + + $this->assertSame( 0, $override_load_textdomain_callback->get_call_count(), 'Expected override_load_textdomain not to be called.' ); + } }