Current File : /home/jvzmxxx/wiki1/extensions/MobileFrontend/includes/specials/SpecialMobileLanguages.php
<?php
/**
 * SpecialMobileLanguages.php
 */

/**
 * Provides a list of languages available for a page
 */
class SpecialMobileLanguages extends MobileSpecialPage {
	/** @var Title $title Saves the title object to get languages for */
	private $title;

	/**
	 * Construct function
	 */
	public function __construct() {
		parent::__construct( 'MobileLanguages' );
	}

	/**
	 * Returns an array of languages that the page is available in
	 * @return array
	 */
	private function getLanguages() {
		$api = new ApiMain(
			new DerivativeRequest(
				$this->getRequest(),
				[
					'action' => 'query',
					'prop' => 'langlinks',
					'llprop' => 'url',
					'lllimit' => 'max',
					'titles' => $this->title->getPrefixedText()
				]
			)
		);

		$api->execute();
		$data = (array)$api->getResult()->getResultData( [ 'query', 'pages' ],
			[ 'Strip' => 'all' ] );

		return $this->processLanguages( $data );
	}

	/**
	 * Processes languages to add 'langname' property, update 'url' property to mobile domain,
	 * and sort languages in case-insensitive order.
	 *
	 * @param array $data list of languages to process
	 * @return array list of processed languages
	 */
	protected function processLanguages( $data ) {
		// Silly strict php
		$pages = array_values( $data );
		$page = array_shift( $pages );

		if ( isset( $page['langlinks'] ) ) {
			// Set the name of each language based on the system list of language names
			$languageMap = Language::fetchLanguageNames();
			$languages = $page['langlinks'];
			foreach ( $page['langlinks'] as $code => $langObject ) {
				if ( !isset( $languageMap[$langObject['lang']] ) ) {
					// Bug T93500: DB might still have preantiquated rows with bogus languages
					unset( $languages[$code] );
					continue;
				}
				$langObject['langname'] = $languageMap[$langObject['lang']];
				$langObject['url'] = MobileContext::singleton()->getMobileUrl( $langObject['url'] );
				$languages[$code] = $langObject;
			}
			$compareLanguage = function( $a, $b ) {
				return strcasecmp( $a['langname'], $b['langname'] );
			};
			usort( $languages, $compareLanguage );
			return $languages;
		} else {
			// No langlinks available
			return [];
		}
	}

	/**
	 * Returns an array of language variants that the page is available in
	 * @return array
	 */
	private function getLanguageVariants() {
		$pageLang = $this->title->getPageLanguage();
		$variants = $pageLang->getVariants();
		if ( count( $variants ) > 1 ) {
			$pageLangCode = $pageLang->getCode();
			$output = [];
			// Loops over each variant
			foreach ( $variants as $code ) {
				// Gets variant name from language code
				$varname = $pageLang->getVariantname( $code );
				// Don't list the current variant
				if ( $varname !== $pageLangCode ) {
					// Appends variant link
					$output[] = [
						'langname' => $varname,
						'url' => $this->title->getLocalURL( [ 'variant' => $code ] ),
						'lang' => wfBCP47( $code )
					];
				}
			}
			return $output;
		} else {
			// No variants
			return [];
		}
	}

	/**
	 * Generates a <li> element for a particular language/variant
	 *
	 * @param array $langObject Array of data about the language link
	 * @return string
	 */
	private function makeLangListItem( $langObject ) {
		$html = Html::openElement( 'li' ) .
			Html::element( 'a', [
				'href' => $langObject['url'],
				'hreflang' => $langObject['lang'],
				'lang' => $langObject['lang'],
				'title' => isset( $langObject['*'] ) ? $langObject['*'] : $langObject['langname']
			], $langObject['langname'] ) .
			Html::closeElement( 'li' );

		return $html;
	}

	/**
	 * Render the page with a list of languages the page is available in
	 * @param string $pagename The name of the page
	 * @throws ErrorPageError
	 */
	public function executeWhenAvailable( $pagename ) {
		$output = $this->getOutput();
		if ( !is_string( $pagename ) || $pagename === '' ) {
			$output->setStatusCode( 404 );
			throw new ErrorPageError(
				$this->msg( 'mobile-frontend-languages-404-title' ),
				$this->msg( 'mobile-frontend-languages-404-desc' )
			);
		}

		$this->title = Title::newFromText( $pagename );

		$html = '';
		if ( $this->title && $this->title->exists() ) {
			$titlename = $this->title->getPrefixedText();
			$pageTitle = $this->msg( 'mobile-frontend-languages-header-page',
				$titlename )->text();
			$languages = $this->getLanguages();
			$variants = $this->getLanguageVariants();
			$languagesCount = count( $languages );
			$variantsCount = count( $variants );

			$html .= Html::element( 'p', [],
				$this->msg( 'mobile-frontend-languages-text' )
					->params( $titlename )->numParams( $languagesCount )->text()
			);
			$html .= Html::openElement( 'p' );
			$html .= Html::element( 'a',
				[ 'href' => $this->title->getLocalUrl() ],
				$this->msg( 'returnto', $titlename )->text()
			);
			$html .= Html::closeElement( 'p' );

			if ( $languagesCount > 0 || $variantsCount > 1 ) {
				// Language variants first
				if ( $variantsCount > 1 ) {
					$variantHeader = $variantsCount > 1
						? $this->msg( 'mobile-frontend-languages-variant-header' )->text()
						: '';
					$html .= Html::element( 'h2',
							[ 'id' => 'mw-mf-language-variant-header' ],
							$variantHeader
					);
					$html .= Html::openElement( 'ul',
						[ 'id' => 'mw-mf-language-variant-selection' ]
					);

					foreach ( $variants as $val ) {
						$html .= $this->makeLangListItem( $val );
					}
					$html .= Html::closeElement( 'ul' );
				}

				// Then other languages
				if ( $languagesCount > 0 ) {
					$languageHeader = $this->msg( 'mobile-frontend-languages-header' )->text();
					$html .= Html::element( 'h2', [ 'id' => 'mw-mf-language-header' ], $languageHeader )
						. Html::openElement( 'ul', [ 'id' => 'mw-mf-language-selection' ] );
					foreach ( $languages as $val ) {
						$html .= $this->makeLangListItem( $val );
					}
					$html .= Html::closeElement( 'ul' );
				}
			}
		} else {
			$pageTitle = $this->msg( 'mobile-frontend-languages-header' )->text();
			$html .= Html::element( 'p', [],
				$this->msg( 'mobile-frontend-languages-nonexistent-title' )->params( $pagename )->text() );
		}

		$html = MobileUI::contentElement( $html );
		$output->setPageTitle( $pageTitle );
		$output->addHTML( $html );
	}
}