Current File : /home/jvzmxxx/wiki/extensions/Wikibase/repo/includes/Specials/SpecialMyLanguageFallbackChain.php
<?php

namespace Wikibase\Repo\Specials;

use Babel;
use Html;
use IContextSource;
use Language;
use SpecialPage;
use Wikibase\LanguageFallbackChain;
use Wikibase\LanguageFallbackChainFactory;
use Wikibase\Repo\WikibaseRepo;

/**
 * Page for displaying the current language fallback chain for debugging.
 *
 * @since 0.4
 *
 * @license GPL-2.0+
 * @author Liangent < liangent@gmail.com >
 */
class SpecialMyLanguageFallbackChain extends SpecialPage {

	/**
	 * @var LanguageFallbackChain
	 */
	private $chain;

	/**
	 * @var LanguageFallbackChainFactory
	 */
	private $factory;

	/**
	 * @since 0.4
	 */
	public function __construct() {
		parent::__construct( 'MyLanguageFallbackChain' );

		$this->factory = WikibaseRepo::getDefaultInstance()->getLanguageFallbackChainFactory();
	}

	/**
	 * @see SpecialPage::getGroupName
	 *
	 * @return string
	 */
	protected function getGroupName() {
		return 'wikibase';
	}

	/**
	 * @see SpecialPage::getDescription
	 *
	 * @since 0.4
	 *
	 * @return string
	 */
	public function getDescription() {
		return $this->msg( 'special-mylanguagefallbackchain' )->text();
	}

	/**
	 * Set the context.
	 *
	 * @param IContextSource $context
	 */
	public function setContext( $context ) {
		$this->chain = null;
		parent::setContext( $context );
	}

	/**
	 * Get the chain stored for display.
	 *
	 * @return LanguageFallbackChain
	 */
	public function getLanguageFallbackChain() {
		if ( $this->chain === null ) {
			$this->setLanguageFallbackChain( $this->factory->newFromContext( $this->getContext() ) );
		}
		return $this->chain;
	}

	/**
	 * Set a new chain for display and return the original one.
	 *
	 * @param LanguageFallbackChain $chain
	 * @return LanguageFallbackChain
	 */
	public function setLanguageFallbackChain( $chain ) {
		return wfSetVar( $this->chain, $chain );
	}

	/**
	 * @see SpecialPage::execute
	 *
	 * @since 0.4
	 *
	 * @param string|null $subPage
	 */
	public function execute( $subPage ) {
		$this->setHeaders();
		$this->outputHeader();

		$this->getOutput()->addWikiMsg( 'wikibase-mylanguagefallbackchain-text' );
		if ( class_exists( Babel::class ) && !$this->getContext()->getUser()->isAnon() ) {
			$this->getOutput()->addWikiMsg( 'wikibase-mylanguagefallbackchain-babel',
				$this->getContext()->getUser()->getName() );
		}

		$inLanguage = $this->getContext()->getLanguage()->getCode();

		$this->getOutput()->addHTML( Html::openElement( 'ul' ) );

		foreach ( $this->getLanguageFallbackChain()->getFallbackChain() as $lang ) {
			$language = $lang->getLanguage();
			$sourceLanguage = $lang->getSourceLanguage();
			$languageName = Language::fetchLanguageName( $language->getCode(), $inLanguage );

			if ( $sourceLanguage ) {
				$sourceLanguageName = Language::fetchLanguageName( $sourceLanguage->getCode(), $inLanguage );
				$msgHtml = wfMessage(
					'wikibase-mylanguagefallbackchain-converted-item',
					$language->getHtmlCode(),
					$languageName,
					$sourceLanguage->getHtmlCode(),
					$sourceLanguageName
				)->parse();
			} else {
				$msgHtml = wfMessage(
					'wikibase-mylanguagefallbackchain-verbatim-item',
					$language->getHtmlCode(),
					$languageName
				)->parse();
			}

			$this->getOutput()->addHtml( Html::rawElement( 'li', array(), $msgHtml ) );
		}

		$this->getOutput()->addHTML( Html::closeElement( 'ul' ) );
	}

}