From 1e079652e078715160013e11df3f8d85ecc83d26 Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Wed, 25 Jul 2018 17:37:16 +0300 Subject: [PATCH] Introduce ContentLanguage service to replace $wgContLang Bug: T200246 Depends-On: I31c2e20fc70ba3cbc124b9f462f4924a139dd9bd Depends-On: I4aaf1c641ec6abef214eb96c0e4b42a67488ac00 Depends-On: I461cf2f441a4040bb15d6c4bb93ce6114c143845 Depends-On: I4b1cc4257348d1773fd2ccf045966261f801e7d0 Depends-On: I9790b7efdd484366dc36eb8880778aea1a559e5e Change-Id: I193f5b9a95430b0a05573c361715e053e5411e32 --- includes/MediaWikiServices.php | 8 +++++ includes/ServiceWiring.php | 4 +++ includes/Setup.php | 4 +-- tests/parser/ParserTestRunner.php | 30 ++++++++++++++++--- tests/phpunit/MediaWikiTestCase.php | 24 ++++++++++++--- .../includes/MediaWikiServicesTest.php | 1 + 6 files changed, 61 insertions(+), 10 deletions(-) diff --git a/includes/MediaWikiServices.php b/includes/MediaWikiServices.php index f891042aae..9726e6c171 100644 --- a/includes/MediaWikiServices.php +++ b/includes/MediaWikiServices.php @@ -873,6 +873,14 @@ class MediaWikiServices extends ServiceContainer { return $this->getService( 'MagicWordFactory' ); } + /** + * @since 1.32 + * @return \Language + */ + public function getContentLanguage() { + return $this->getService( 'ContentLanguage' ); + } + /////////////////////////////////////////////////////////////////////////// // NOTE: When adding a service getter here, don't forget to add a test // case for it in MediaWikiServicesTest::provideGetters() and in diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index 66b4c0c810..90d396591f 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -606,6 +606,10 @@ return [ return new MagicWordFactory( $wgContLang ); }, + 'ContentLanguage' => function ( MediaWikiServices $services ) { + return Language::factory( $services->getMainConfig()->get( 'LanguageCode' ) ); + }, + /////////////////////////////////////////////////////////////////////////// // NOTE: When adding a service here, don't forget to add a getter function // in the MediaWikiServices class. The convenience getter should just call diff --git a/includes/Setup.php b/includes/Setup.php index 4d9c495212..9923ae2c53 100644 --- a/includes/Setup.php +++ b/includes/Setup.php @@ -794,9 +794,9 @@ $ps_globals = Profiler::instance()->scopedProfileIn( $fname . '-globals' ); /** * @var Language $wgContLang + * @deprecated since 1.32, use the ContentLanguage service directly */ -$wgContLang = Language::factory( $wgLanguageCode ); -$wgContLang->initContLang(); +$wgContLang = MediaWikiServices::getInstance()->getContentLanguage(); // Now that variant lists may be available... $wgRequest->interpolateTitle(); diff --git a/tests/parser/ParserTestRunner.php b/tests/parser/ParserTestRunner.php index 26e4e9f5a4..51fb86de7b 100644 --- a/tests/parser/ParserTestRunner.php +++ b/tests/parser/ParserTestRunner.php @@ -410,7 +410,7 @@ class ParserTestRunner { // any live Language object, both on setup and teardown $reset = function () { MWNamespace::clearCaches(); - $GLOBALS['wgContLang']->resetNamespaces(); + MediaWikiServices::getInstance()->getContentLanguage()->resetNamespaces(); }; $setup[] = $reset; $teardown[] = $reset; @@ -1151,6 +1151,18 @@ class ParserTestRunner { $lang = Language::factory( $langCode ); $lang->resetNamespaces(); $setup['wgContLang'] = $lang; + $setup[] = function () use ( $lang ) { + MediaWikiServices::getInstance()->disableService( 'ContentLanguage' ); + MediaWikiServices::getInstance()->redefineService( + 'ContentLanguage', + function () use ( $lang ) { + return $lang; + } + ); + }; + $teardown[] = function () { + MediaWikiServices::getInstance()->resetServiceForTesting( 'ContentLanguage' ); + }; $reset = function () { MediaWikiServices::getInstance()->resetServiceForTesting( 'MagicWordFactory' ); $this->resetTitleServices(); @@ -1610,15 +1622,25 @@ class ParserTestRunner { * @param array $articles Article info array from TestFileReader */ public function addArticles( $articles ) { - global $wgContLang; $setup = []; $teardown = []; // Be sure ParserTestRunner::addArticle has correct language set, // so that system messages get into the right language cache - if ( $wgContLang->getCode() !== 'en' ) { + if ( MediaWikiServices::getInstance()->getContentLanguage()->getCode() !== 'en' ) { $setup['wgLanguageCode'] = 'en'; - $setup['wgContLang'] = Language::factory( 'en' ); + $lang = Language::factory( 'en' ); + $setup['wgContLang'] = $lang; + $setup[] = function () use ( $lang ) { + $services = MediaWikiServices::getInstance(); + $services->disableService( 'ContentLanguage' ); + $services->redefineService( 'ContentLanguage', function () use ( $lang ) { + return $lang; + } ); + }; + $teardown[] = function () { + MediaWikiServices::getInstance()->resetServiceForTesting( 'ContentLanguage' ); + }; } // Add special namespaces, in case that hasn't been done by staticSetup() yet diff --git a/tests/phpunit/MediaWikiTestCase.php b/tests/phpunit/MediaWikiTestCase.php index db75bc0b58..ebca9df0ae 100644 --- a/tests/phpunit/MediaWikiTestCase.php +++ b/tests/phpunit/MediaWikiTestCase.php @@ -686,6 +686,10 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase { return $object; } ); + + if ( $name === 'ContentLanguage' ) { + $this->doSetMwGlobals( [ 'wgContLang' => $object ] ); + } } /** @@ -728,6 +732,20 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase { $pairs = [ $pairs => $value ]; } + if ( isset( $pairs['wgContLang'] ) ) { + throw new MWException( + 'No setting $wgContLang, use setContentLang() or setService( \'ContentLanguage\' )' + ); + } + + $this->doSetMwGlobals( $pairs, $value ); + } + + /** + * An internal method that allows setService() to set globals that tests are not supposed to + * touch. + */ + private function doSetMwGlobals( $pairs, $value = null ) { $this->stashMwGlobals( array_keys( $pairs ) ); foreach ( $pairs as $key => $value ) { @@ -946,10 +964,8 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase { $langCode = $lang; $langObj = Language::factory( $langCode ); } - $this->setMwGlobals( [ - 'wgLanguageCode' => $langCode, - 'wgContLang' => $langObj, - ] ); + $this->setMwGlobals( 'wgLanguageCode', $langCode ); + $this->setService( 'ContentLanguage', $langObj ); } /** diff --git a/tests/phpunit/includes/MediaWikiServicesTest.php b/tests/phpunit/includes/MediaWikiServicesTest.php index 4189e93d6b..92f9752f74 100644 --- a/tests/phpunit/includes/MediaWikiServicesTest.php +++ b/tests/phpunit/includes/MediaWikiServicesTest.php @@ -366,6 +366,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase { 'ActorMigration' => [ 'ActorMigration', ActorMigration::class ], 'ConfigRepository' => [ 'ConfigRepository', \MediaWiki\Config\ConfigRepository::class ], 'MagicWordFactory' => [ 'MagicWordFactory', MagicWordFactory::class ], + 'ContentLanguage' => [ 'ContentLanguage', Language::class ], ]; } -- 2.20.1