Wordpress/tests/phpunit/tests/l10n/loadTextdomainJustInTime.php

271 lines
8.2 KiB
PHP

<?php
/**
* @group l10n
* @group i18n
*/
class Tests_L10n_loadTextdomainJustInTime extends WP_UnitTestCase {
protected $orig_theme_dir;
protected $theme_root;
protected static $user_id;
private $locale_count;
public static function wpSetUpBeforeClass( $factory ) {
self::$user_id = $factory->user->create(
array(
'role' => 'administrator',
'locale' => 'de_DE',
)
);
}
public function setUp() {
parent::setUp();
$this->theme_root = DIR_TESTDATA . '/themedir1';
$this->orig_theme_dir = $GLOBALS['wp_theme_directories'];
$this->locale_count = 0;
// /themes is necessary as theme.php functions assume /themes is the root if there is only one root.
$GLOBALS['wp_theme_directories'] = array( WP_CONTENT_DIR . '/themes', $this->theme_root );
add_filter( 'theme_root', array( $this, 'filter_theme_root' ) );
add_filter( 'stylesheet_root', array( $this, 'filter_theme_root' ) );
add_filter( 'template_root', array( $this, 'filter_theme_root' ) );
wp_clean_themes_cache();
unset( $GLOBALS['wp_themes'], $GLOBALS['l10n'], $GLOBALS['l10n_unloaded'] );
/** @var WP_Textdomain_Registry $wp_textdomain_registry */
global $wp_textdomain_registry;
$wp_textdomain_registry->reset();
}
public function tearDown() {
$GLOBALS['wp_theme_directories'] = $this->orig_theme_dir;
remove_filter( 'theme_root', array( $this, 'filter_theme_root' ) );
remove_filter( 'stylesheet_root', array( $this, 'filter_theme_root' ) );
remove_filter( 'template_root', array( $this, 'filter_theme_root' ) );
wp_clean_themes_cache();
unset( $GLOBALS['wp_themes'], $GLOBALS['l10n'], $GLOBALS['l10n_unloaded'] );
/** @var WP_Textdomain_Registry $wp_textdomain_registry */
global $wp_textdomain_registry;
$wp_textdomain_registry->reset();
parent::tearDown();
}
/**
* Replace the normal theme root dir with our pre-made test dir.
*/
public function filter_theme_root() {
return $this->theme_root;
}
public function filter_set_locale_to_german() {
return 'de_DE';
}
/**
* @ticket 34114
*/
public function test_plugin_translation_should_be_translated_without_calling_load_plugin_textdomain() {
add_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
require_once DIR_TESTDATA . '/plugins/internationalized-plugin.php';
$is_textdomain_loaded_before = is_textdomain_loaded( 'internationalized-plugin' );
$expected_output = i18n_plugin_test();
$is_textdomain_loaded_after = is_textdomain_loaded( 'internationalized-plugin' );
remove_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
$this->assertFalse( $is_textdomain_loaded_before );
$this->assertSame( 'Das ist ein Dummy Plugin', $expected_output );
$this->assertTrue( $is_textdomain_loaded_after );
}
/**
* @ticket 34114
*/
public function test_theme_translation_should_be_translated_without_calling_load_theme_textdomain() {
add_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
switch_theme( 'internationalized-theme' );
require_once get_stylesheet_directory() . '/functions.php';
$is_textdomain_loaded_before = is_textdomain_loaded( 'internationalized-theme' );
$expected_output = i18n_theme_test();
$is_textdomain_loaded_after = is_textdomain_loaded( 'internationalized-theme' );
remove_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
$this->assertFalse( $is_textdomain_loaded_before );
$this->assertSame( 'Das ist ein Dummy Theme', $expected_output );
$this->assertTrue( $is_textdomain_loaded_after );
}
/**
* @ticket 34114
*/
public function test_get_translations_for_domain_does_not_return_null_if_override_load_textdomain_is_used() {
add_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
add_filter( 'override_load_textdomain', '__return_true' );
$translations = get_translations_for_domain( 'internationalized-plugin' );
remove_filter( 'override_load_textdomain', '__return_true' );
remove_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
$this->assertTrue( $translations instanceof NOOP_Translations );
}
/**
* @ticket 37113
*/
public function test_should_allow_unloading_of_text_domain() {
add_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
require_once DIR_TESTDATA . '/plugins/internationalized-plugin.php';
$expected_output_before = i18n_plugin_test();
$is_textdomain_loaded_before = is_textdomain_loaded( 'internationalized-plugin' );
unload_textdomain( 'internationalized-plugin' );
remove_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
$expected_output_after = i18n_plugin_test();
$is_textdomain_loaded_after = is_textdomain_loaded( 'internationalized-plugin' );
add_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
load_textdomain( 'internationalized-plugin', WP_LANG_DIR . '/plugins/internationalized-plugin-de_DE.mo' );
$expected_output_final = i18n_plugin_test();
$is_textdomain_loaded_final = is_textdomain_loaded( 'internationalized-plugin' );
unload_textdomain( 'internationalized-plugin' );
remove_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
// Text domain loaded just in time.
$this->assertSame( 'Das ist ein Dummy Plugin', $expected_output_before );
$this->assertTrue( $is_textdomain_loaded_before );
// Text domain unloaded.
$this->assertSame( 'This is a dummy plugin', $expected_output_after );
$this->assertFalse( $is_textdomain_loaded_after );
// Text domain loaded manually again.
$this->assertSame( 'Das ist ein Dummy Plugin', $expected_output_final );
$this->assertTrue( $is_textdomain_loaded_final );
}
/**
* @ticket 26511
*/
public function test_plugin_translation_after_switching_locale() {
require_once DIR_TESTDATA . '/plugins/internationalized-plugin.php';
switch_to_locale( 'de_DE' );
$expected = i18n_plugin_test();
restore_previous_locale();
$this->assertSame( 'Das ist ein Dummy Plugin', $expected );
}
/**
* @ticket 37997
* @ticket 39210
*/
public function test_plugin_translation_after_switching_locale_twice() {
require_once DIR_TESTDATA . '/plugins/internationalized-plugin.php';
switch_to_locale( 'de_DE' );
$expected_de_de = i18n_plugin_test();
switch_to_locale( 'es_ES' );
$expected_es_es = i18n_plugin_test();
restore_current_locale();
$this->assertSame( 'Das ist ein Dummy Plugin', $expected_de_de );
$this->assertSame( 'Este es un plugin dummy', $expected_es_es );
}
/**
* @ticket 26511
*/
public function test_theme_translation_after_switching_locale() {
switch_theme( 'internationalized-theme' );
require_once get_stylesheet_directory() . '/functions.php';
switch_to_locale( 'de_DE' );
$expected = i18n_theme_test();
restore_previous_locale();
switch_theme( WP_DEFAULT_THEME );
$this->assertSame( 'Das ist ein Dummy Theme', $expected );
}
/**
* @ticket 38485
*/
public function test_plugin_translation_with_user_locale() {
require_once DIR_TESTDATA . '/plugins/internationalized-plugin.php';
set_current_screen( 'dashboard' );
wp_set_current_user( self::$user_id );
$expected = i18n_plugin_test();
set_current_screen( 'front' );
$this->assertSame( 'Das ist ein Dummy Plugin', $expected );
}
/**
* @ticket 38485
*/
public function test_theme_translation_with_user_locale() {
switch_theme( 'internationalized-theme' );
set_current_screen( 'dashboard' );
wp_set_current_user( self::$user_id );
require_once get_stylesheet_directory() . '/functions.php';
$expected = i18n_theme_test();
set_current_screen( 'front' );
switch_theme( WP_DEFAULT_THEME );
$this->assertSame( 'Das ist ein Dummy Theme', $expected );
}
/**
* @ticket 37997
*/
public function test_get_locale_is_called_only_once_per_textdomain() {
$textdomain = 'foo-bar-baz';
add_filter( 'locale', array( $this, '_filter_locale_count' ) );
__( 'Foo', $textdomain );
__( 'Bar', $textdomain );
__( 'Baz', $textdomain );
__( 'Foo Bar', $textdomain );
__( 'Foo Bar Baz', $textdomain );
remove_filter( 'locale', array( $this, '_filter_locale_count' ) );
$this->assertFalse( is_textdomain_loaded( $textdomain ) );
$this->assertSame( 1, $this->locale_count );
}
public function _filter_locale_count( $locale ) {
++$this->locale_count;
return $locale;
}
}