X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fspecials%2FSpecialMyLanguage.php;h=537db9ee1db2791dde8f1127e621cf9a5274a8ad;hb=432cc11fae9e8b30e1d9e180fd61bfc28016ab82;hp=d11fbe638a4e74423001da8b1890b8fb50bb61a2;hpb=134ccbc4f42cd1b3646734b8f646f7d6ce89687f;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/specials/SpecialMyLanguage.php b/includes/specials/SpecialMyLanguage.php index d11fbe638a..537db9ee1d 100644 --- a/includes/specials/SpecialMyLanguage.php +++ b/includes/specials/SpecialMyLanguage.php @@ -23,6 +23,8 @@ * @copyright Copyright © 2010-2013 Niklas Laxström, Siebrand Mazeland */ +use MediaWiki\MediaWikiServices; + /** * Unlisted special page just to redirect the user to the translated version of * a page, if it exists. @@ -81,6 +83,7 @@ class SpecialMyLanguage extends RedirectSpecialArticle { } if ( !$base ) { + // No subpage provided or base page does not exist return null; } @@ -89,15 +92,39 @@ class SpecialMyLanguage extends RedirectSpecialArticle { $base = $page->getRedirectTarget(); } - $uiCode = $this->getLanguage()->getCode(); - $proposed = $base->getSubpage( $uiCode ); - if ( $uiCode !== $this->getConfig()->get( 'LanguageCode' ) && $proposed && $proposed->exists() ) { + $uiLang = $this->getLanguage(); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + + if ( $uiLang->equals( $contLang ) ) { + // Short circuit when the current UI language is the + // wiki's default language to avoid unnecessary page lookups. + return $base; + } + + // Check for a subpage in current UI language + $proposed = $base->getSubpage( $uiLang->getCode() ); + if ( $proposed && $proposed->exists() ) { return $proposed; - } elseif ( $provided && $provided->exists() ) { + } + + if ( $provided !== $base && $provided->exists() ) { + // Explicit language code given and the page exists return $provided; - } else { - return $base; } + + // Check for fallback languages specified by the UI language + $possibilities = $uiLang->getFallbackLanguages(); + foreach ( $possibilities as $lang ) { + if ( $lang !== $contLang->getCode() ) { + $proposed = $base->getSubpage( $lang ); + if ( $proposed && $proposed->exists() ) { + return $proposed; + } + } + } + + // When all else has failed, return the base page + return $base; } /**