Since 1.17 a whole lot of extensions have sprouted *.i18n.magic.php files. Most of...
authorTim Starling <tstarling@users.mediawiki.org>
Fri, 11 Feb 2011 11:53:00 +0000 (11:53 +0000)
committerTim Starling <tstarling@users.mediawiki.org>
Fri, 11 Feb 2011 11:53:00 +0000 (11:53 +0000)
This patch automatically includes synonyms from the fallback localisation, and prevents the case flag from being overridden, thus making extensions resistant to translator error.

includes/LocalisationCache.php

index f81b9bf..d8551a0 100644 (file)
@@ -95,7 +95,7 @@ class LocalisationCache {
         * by a fallback sequence.
         */
        static public $mergeableMapKeys = array( 'messages', 'namespaceNames', 'mathNames',
-               'dateFormats', 'defaultUserOptionOverrides', 'magicWords', 'imageFiles',
+               'dateFormats', 'defaultUserOptionOverrides', 'imageFiles',
                'preloadedMessages',
        );
 
@@ -117,6 +117,11 @@ class LocalisationCache {
         */
        static public $optionalMergeKeys = array( 'bookstoreList' );
 
+       /**
+        * Keys for items that are formatted like $magicWords
+        */
+       static public $magicWordKeys = array( 'magicWords' );
+
        /**
         * Keys for items where the subitems are stored in the backend separately.
         */
@@ -181,7 +186,8 @@ class LocalisationCache {
                                self::$mergeableMapKeys,
                                self::$mergeableListKeys,
                                self::$mergeableAliasListKeys,
-                               self::$optionalMergeKeys
+                               self::$optionalMergeKeys,
+                               self::$magicWordKeys
                        ) );
                }
                return isset( $this->mergeableKeys[$key] );
@@ -426,6 +432,8 @@ class LocalisationCache {
                                        if ( isset( $value['inherit'] ) ) {
                                                unset( $value['inherit'] );
                                        }
+                               } elseif ( in_array( $key, self::$magicWordKeys ) ) {
+                                       $this->mergeMagicWords( $value, $fallbackValue );
                                }
                        }
                } else {
@@ -433,6 +441,19 @@ class LocalisationCache {
                }
        }
 
+       protected function mergeMagicWords( &$value, $fallbackValue ) {
+               foreach ( $fallbackValue as $magicName => $fallbackInfo ) {
+                       if ( !isset( $value[$magicName] ) ) {
+                               $value[$magicName] = $fallbackInfo;
+                       } else {
+                               $oldSynonyms = array_slice( $fallbackInfo, 1 );
+                               $newSynonyms = array_slice( $value[$magicName], 1 );
+                               $synonyms = array_unique( array_merge( $oldSynonyms, $newSynonyms ) );
+                               $value[$magicName] = array_merge( array( $fallbackInfo[0] ), $synonyms );
+                       }
+               }
+       }
+
        /**
         * Given an array mapping language code to localisation value, such as is
         * found in extension *.i18n.php files, iterate through a fallback sequence