X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/includes/specials/SpecialMyLanguage.php diff --git a/includes/specials/SpecialMyLanguage.php b/includes/specials/SpecialMyLanguage.php new file mode 100644 index 00000000..9cb6d4b5 --- /dev/null +++ b/includes/specials/SpecialMyLanguage.php @@ -0,0 +1,113 @@ +findTitle( $subpage ); + // Go to the main page if given invalid title. + if ( !$title ) { + $title = Title::newMainPage(); + } + return $title; + } + + /** + * Assuming the user's interface language is fi. Given input Page, it + * returns Page/fi if it exists, otherwise Page. Given input Page/de, + * it returns Page/fi if it exists, otherwise Page/de if it exists, + * otherwise Page. + * + * @param string|null $subpage + * @return Title|null + */ + public function findTitle( $subpage ) { + // base = title without language code suffix + // provided = the title as it was given + $base = $provided = null; + if ( $subpage !== null ) { + $provided = Title::newFromText( $subpage ); + $base = $provided; + } + + if ( $provided && strpos( $subpage, '/' ) !== false ) { + $pos = strrpos( $subpage, '/' ); + $basepage = substr( $subpage, 0, $pos ); + $code = substr( $subpage, $pos + 1 ); + if ( strlen( $code ) && Language::isKnownLanguageTag( $code ) ) { + $base = Title::newFromText( $basepage ); + } + } + + if ( !$base ) { + return null; + } + + if ( $base->isRedirect() ) { + $page = new WikiPage( $base ); + $base = $page->getRedirectTarget(); + } + + $uiCode = $this->getLanguage()->getCode(); + $proposed = $base->getSubpage( $uiCode ); + if ( $proposed && $proposed->exists() && $uiCode !== $base->getPageLanguage()->getCode() ) { + return $proposed; + } elseif ( $provided && $provided->exists() ) { + return $provided; + } else { + return $base; + } + } + + /** + * Target can identify a specific user's language preference. + * + * @see T109724 + * @since 1.27 + * @return bool + */ + public function personallyIdentifiableTarget() { + return true; + } +}