Introduce ContentLanguage service to replace $wgContLang
authorAryeh Gregor <ayg@aryeh.name>
Wed, 25 Jul 2018 14:37:16 +0000 (17:37 +0300)
committerKunal Mehta <legoktm@member.fsf.org>
Wed, 1 Aug 2018 04:42:53 +0000 (21:42 -0700)
Bug: T200246
Depends-On: I31c2e20fc70ba3cbc124b9f462f4924a139dd9bd
Depends-On: I4aaf1c641ec6abef214eb96c0e4b42a67488ac00
Depends-On: I461cf2f441a4040bb15d6c4bb93ce6114c143845
Depends-On: I4b1cc4257348d1773fd2ccf045966261f801e7d0
Depends-On: I9790b7efdd484366dc36eb8880778aea1a559e5e
Change-Id: I193f5b9a95430b0a05573c361715e053e5411e32

includes/MediaWikiServices.php
includes/ServiceWiring.php
includes/Setup.php
tests/parser/ParserTestRunner.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/MediaWikiServicesTest.php

index f891042..9726e6c 100644 (file)
@@ -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
index 66b4c0c..90d3965 100644 (file)
@@ -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
index 4d9c495..9923ae2 100644 (file)
@@ -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();
index 26e4e9f..51fb86d 100644 (file)
@@ -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
index db75bc0..ebca9df 100644 (file)
@@ -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 );
        }
 
        /**
index 4189e93..92f9752 100644 (file)
@@ -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 ],
                ];
        }