Obtain MessageBlobStore instance in a consistent way
[lhc/web/wiklou.git] / includes / cache / localisation / LocalisationCache.php
index 9cf7acf..db0f380 100644 (file)
@@ -106,7 +106,7 @@ class LocalisationCache {
        /**
         * All item keys
         */
-       static public $allKeys = [
+       public static $allKeys = [
                'fallback', 'namespaceNames', 'bookstoreList',
                'magicWords', 'messages', 'rtl', 'capitalizeAllNouns', 'digitTransformTable',
                'separatorTransformTable', 'minimumGroupingDigits',
@@ -122,42 +122,42 @@ class LocalisationCache {
         * Keys for items which consist of associative arrays, which may be merged
         * by a fallback sequence.
         */
-       static public $mergeableMapKeys = [ 'messages', 'namespaceNames',
+       public static $mergeableMapKeys = [ 'messages', 'namespaceNames',
                'namespaceAliases', 'dateFormats', 'imageFiles', 'preloadedMessages'
        ];
 
        /**
         * Keys for items which are a numbered array.
         */
-       static public $mergeableListKeys = [ 'extraUserToggles' ];
+       public static $mergeableListKeys = [ 'extraUserToggles' ];
 
        /**
         * Keys for items which contain an array of arrays of equivalent aliases
         * for each subitem. The aliases may be merged by a fallback sequence.
         */
-       static public $mergeableAliasListKeys = [ 'specialPageAliases' ];
+       public static $mergeableAliasListKeys = [ 'specialPageAliases' ];
 
        /**
         * Keys for items which contain an associative array, and may be merged if
         * the primary value contains the special array key "inherit". That array
         * key is removed after the first merge.
         */
-       static public $optionalMergeKeys = [ 'bookstoreList' ];
+       public static $optionalMergeKeys = [ 'bookstoreList' ];
 
        /**
         * Keys for items that are formatted like $magicWords
         */
-       static public $magicWordKeys = [ 'magicWords' ];
+       public static $magicWordKeys = [ 'magicWords' ];
 
        /**
         * Keys for items where the subitems are stored in the backend separately.
         */
-       static public $splitKeys = [ 'messages' ];
+       public static $splitKeys = [ 'messages' ];
 
        /**
         * Keys which are loaded automatically by initLanguage()
         */
-       static public $preloadedKeys = [ 'dateFormats', 'namespaceNames' ];
+       public static $preloadedKeys = [ 'dateFormats', 'namespaceNames' ];
 
        /**
         * Associative array of cached plural rules. The key is the language code,
@@ -525,15 +525,19 @@ class LocalisationCache {
                ini_set( 'apc.cache_by_default', $_apcEnabled );
                Wikimedia\restoreWarnings();
 
+               $data = [];
                if ( $_fileType == 'core' || $_fileType == 'extension' ) {
-
-                       // Lnguage files aren't required to contain all the possible variables, so suppress warnings
-                       // when variables don't exist in tests
-                       Wikimedia\suppressWarnings();
-                       $data = compact( self::$allKeys );
-                       Wikimedia\restoreWarnings();
+                       foreach ( self::$allKeys as $key ) {
+                               // Not all keys are set in language files, so
+                               // check they exist first
+                               if ( isset( $$key ) ) {
+                                       $data[$key] = $$key;
+                               }
+                       }
                } elseif ( $_fileType == 'aliases' ) {
-                       $data = compact( 'aliases' );
+                       if ( isset( $aliases ) ) {
+                               $data['aliases'] = $aliases;
+                       }
                } else {
                        throw new MWException( __METHOD__ . ": Invalid file type: $_fileType" );
                }
@@ -799,6 +803,7 @@ class LocalisationCache {
                $messagesDirs = $config->get( 'MessagesDirs' );
                return [
                        'core' => "$IP/languages/i18n",
+                       'exif' => "$IP/languages/i18n/exif",
                        'api' => "$IP/includes/api/i18n",
                        'oojs-ui' => "$IP/resources/lib/ooui/i18n",
                ] + $messagesDirs;
@@ -838,17 +843,23 @@ class LocalisationCache {
                }
 
                # Fill in the fallback if it's not there already
-               if ( is_null( $coreData['fallback'] ) ) {
-                       $coreData['fallback'] = $code === 'en' ? false : 'en';
-               }
-               if ( $coreData['fallback'] === false ) {
-                       $coreData['fallbackSequence'] = [];
+               if ( ( is_null( $coreData['fallback'] ) || $coreData['fallback'] === false ) && $code === 'en' ) {
+                       $coreData['fallback'] = false;
+                       $coreData['originalFallbackSequence'] = $coreData['fallbackSequence'] = [];
                } else {
-                       $coreData['fallbackSequence'] = array_map( 'trim', explode( ',', $coreData['fallback'] ) );
+                       if ( !is_null( $coreData['fallback'] ) ) {
+                               $coreData['fallbackSequence'] = array_map( 'trim', explode( ',', $coreData['fallback'] ) );
+                       } else {
+                               $coreData['fallbackSequence'] = [];
+                       }
                        $len = count( $coreData['fallbackSequence'] );
 
-                       # Ensure that the sequence ends at en
-                       if ( $coreData['fallbackSequence'][$len - 1] !== 'en' ) {
+                       # Before we add the 'en' fallback for messages, keep a copy of
+                       # the original fallback sequence
+                       $coreData['originalFallbackSequence'] = $coreData['fallbackSequence'];
+
+                       # Ensure that the sequence ends at 'en' for messages
+                       if ( !$len || $coreData['fallbackSequence'][$len - 1] !== 'en' ) {
                                $coreData['fallbackSequence'][] = 'en';
                        }
                }
@@ -1022,7 +1033,7 @@ class LocalisationCache {
                # HACK: If using a null (i.e. disabled) storage backend, we
                # can't write to the MessageBlobStore either
                if ( $purgeBlobs && !$this->store instanceof LCStoreNull ) {
-                       $blobStore = new MessageBlobStore();
+                       $blobStore = MediaWikiServices::getInstance()->getResourceLoader()->getMessageBlobStore();
                        $blobStore->clear();
                }
        }