X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fspecials%2FSpecialMyLanguage.php;h=37d96f47cc16ad9178dae81ac02df636b50994c5;hb=0c09bb5daca43e0a313af68cf745a6acd0daa6c8;hp=d11fbe638a4e74423001da8b1890b8fb50bb61a2;hpb=92a481e8a2650b0f68ef920f99c20398b9c649de;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/specials/SpecialMyLanguage.php b/includes/specials/SpecialMyLanguage.php index d11fbe638a..37d96f47cc 100644 --- a/includes/specials/SpecialMyLanguage.php +++ b/includes/specials/SpecialMyLanguage.php @@ -81,6 +81,7 @@ class SpecialMyLanguage extends RedirectSpecialArticle { } if ( !$base ) { + // No subpage provided or base page does not exist return null; } @@ -90,14 +91,38 @@ class SpecialMyLanguage extends RedirectSpecialArticle { } $uiCode = $this->getLanguage()->getCode(); + $wikiLangCode = $this->getConfig()->get( 'LanguageCode' ); + + if ( $uiCode === $wikiLangCode ) { + // 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( $uiCode ); - if ( $uiCode !== $this->getConfig()->get( 'LanguageCode' ) && $proposed && $proposed->exists() ) { + 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 = Language::getFallbacksFor( $uiCode ); + foreach ( $possibilities as $lang ) { + if ( $lang !== $wikiLangCode ) { + $proposed = $base->getSubpage( $lang ); + if ( $proposed && $proposed->exists() ) { + return $proposed; + } + } + } + + // When all else has failed, return the base page + return $base; } /**