From 530ec5d524d63fb3409c1341466442f0ee61c156 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Niklas=20Laxstr=C3=B6m?= Date: Wed, 25 Jun 2008 10:59:22 +0000 Subject: [PATCH] * $wgExtensionAliasesFiles option to simplify adding aliases for special pages provided by extensions --- RELEASE-NOTES | 2 ++ includes/DefaultSettings.php | 12 +++++++ languages/Language.php | 68 +++++++++++++++++++++++++++++++----- 3 files changed, 74 insertions(+), 8 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 54c13c436e..4160ae56d0 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -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 === diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 7a75a212bb..33a6d090ab 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -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 diff --git a/languages/Language.php b/languages/Language.php index 6b2e3782f8..92822525d7 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -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; -- 2.20.1