Merge "Warn if stateful ParserOutput transforms are used"
[lhc/web/wiklou.git] / includes / specials / SpecialMyLanguage.php
index 9cb6d4b..37d96f4 100644 (file)
@@ -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 ( $proposed && $proposed->exists() && $uiCode !== $base->getPageLanguage()->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 = 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;
        }
 
        /**