* $wgExtensionAliasesFiles option to simplify adding aliases for special pages provid...
authorNiklas Laxström <nikerabbit@users.mediawiki.org>
Wed, 25 Jun 2008 10:59:22 +0000 (10:59 +0000)
committerNiklas Laxström <nikerabbit@users.mediawiki.org>
Wed, 25 Jun 2008 10:59:22 +0000 (10:59 +0000)
RELEASE-NOTES
includes/DefaultSettings.php
languages/Language.php

index 54c13c4..4160ae5 100644 (file)
@@ -62,6 +62,8 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
   is no longer possible. 
 * $wgMessageCacheType defines now the type of cache used by the MessageCache class,
   previously it was choosen based on $wgParserCacheType
+* $wgExtensionAliasesFiles option to simplify adding aliases to special pages
+* provided by extensions, in a similar way to $wgExtensionMessagesFiles
 
 === New features in 1.13 ===
 
index 7a75a21..33a6d09 100644 (file)
@@ -2188,6 +2188,18 @@ $wgSkinExtensionFunctions = array();
  */
 $wgExtensionMessagesFiles = array();
 
+/**
+ * Aliases for special pages provided by extensions.
+ * Associative array mapping special page to array of aliases. First alternative
+ * for each special page will be used as the normalised name for it. English
+ * aliases will be added to the end of the list so that they always work. The
+ * file must define a variable $aliases.
+ *
+ * Example:
+ *    $wgExtensionAliasesFiles['Translate'] = dirname(__FILE__).'/Translate.alias.php';
+ */
+$wgExtensionAliasesFiles = array();
+
 /**
  * Parser output hooks.
  * This is an associative array where the key is an extension-defined tag
index 6b2e378..9282252 100644 (file)
@@ -1719,14 +1719,69 @@ class Language {
         */
        function getSpecialPageAliases() {
                $this->load();
+
+               // Cache aliases because it may be slow to load them
                if ( !isset( $this->mExtendedSpecialPageAliases ) ) {
+
+                       // Initialise array
                        $this->mExtendedSpecialPageAliases = $this->specialPageAliases;
-                       wfRunHooks( 'LanguageGetSpecialPageAliases', 
-                               array( &$this->mExtendedSpecialPageAliases, $this->getCode() ) );
+
+                       global $wgExtensionAliasesFiles;
+                       foreach ( $wgExtensionAliasesFiles as $file ) {
+
+                               // Fail fast
+                               if ( !file_exists($file) )
+                                       throw new MWException( 'Aliases file does not exist' );
+
+                               $aliases = array();
+                               require($file);
+
+                               // Check the availability of aliases
+                               if ( !isset($aliases['en']) )
+                                       throw new MWException( 'Malformed aliases file' );
+
+                               $code = $this->getCode();
+
+                               if ( isset($aliases[$code]) ) {
+                                       $aliases[$code] = $this->fixSpecialPageAliases( $aliases[$code] );
+                                       /* Merge the aliases, THIS will break if there is special page name
+                                       * which looks like a numerical key, thanks to PHP...
+                                       * See the comments for wfArrayMerge in GlobalSettings.php. */
+                                       $this->mExtendedSpecialPageAliases = array_merge_recursive(
+                                               $this->mExtendedSpecialPageAliases, $aliases[$code] );
+                               }
+
+                               /* Add the English aliases to the end of list as aliases... unless we
+                                * already added them! */
+                               if ( $code !== 'en' ) {
+                                       $aliases['en'] = $this->fixSpecialPageAliases( $aliases['en'] );
+                                       $this->mExtendedSpecialPageAliases = array_merge_recursive(
+                                               $this->mExtendedSpecialPageAliases, $aliases['en'] );
+                               }
+                                       
+                       }
+
+                       wfRunHooks( 'LanguageGetSpecialPageAliases',
+                               array( &$this->mExtendedSpecialPageAliases, $code ) );
                }
+
                return $this->mExtendedSpecialPageAliases;
        }
 
+       /**
+        * Function to fix special page aliases. Will convert the first letter to
+        * upper case and spaces to underscores. Can be given a full aliases array,
+        * in which case it will recursively fix all aliases.
+        */
+       public function fixSpecialPageAliases( $mixed ) {
+               // Work recursively until in string level
+               if ( is_array($mixed) ) {
+                       $callback = array( $this, 'fixSpecialPageAliases' );
+                       return array_map( $callback, $mixed );
+               }
+               return str_replace( ' ', '_', $this->ucfirst( $mixed ) );
+       }
+
        /**
         * Italic is unsuitable for some languages
         *
@@ -2250,12 +2305,9 @@ class Language {
                # Replace spaces with underscores in namespace names
                $cache['namespaceNames'] = str_replace( ' ', '_', $cache['namespaceNames'] );
 
-               # And do the same for specialpage aliases. $page is an array.
-               foreach ( $cache['specialPageAliases'] as &$page ) {
-                       $page = str_replace( ' ', '_', $page );
-               }
-               # Decouple the reference to prevent accidental damage
-               unset($page);
+               # And do the same for specialpage aliases.
+               $cache['specialPageAliases'] =
+                       $this->fixSpecialPageAliases( $cache['specialPageAliases'] );
                
                # Save to both caches
                self::$mLocalisationCache[$code] = $cache;