}
if ( !$base ) {
+ // No subpage provided or base page does not exist
return null;
}
}
$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;
}
/**