mediawiki-skins-Vector/includes/Components/VectorComponentLanguageDropdown.php
gerritbot b5c38e7158 Replace some moved Title class uses, now MediaWiki\Title\Title
Bug: T321681
Change-Id: I7283b3a22bedf6d05d0959cd6edb40b0b15c57b0
2023-08-19 04:23:07 +00:00

85 lines
2.9 KiB
PHP

<?php
namespace MediaWiki\Skins\Vector\Components;
use MediaWiki\Title\Title;
/**
* VectorComponentLanguageButton component
*/
class VectorComponentLanguageDropdown implements VectorComponent {
/** @var string */
private $label;
/** @var string */
private $ariaLabel;
/** @var string */
private $class;
/** @var int */
private $numLanguages;
/** @var array */
private $menuContentsData;
/** @var Title|null */
private $title;
/**
* @param string $label human readable
* @param string $ariaLabel label for accessibility
* @param string $class of the dropdown component
* @param int $numLanguages
* @param string $itemHTML the HTML of the list e.g. `<li>...</li>`
* @param string $beforePortlet no known usages. Perhaps can be removed in future
* @param string $afterPortlet used by Extension:ULS
* @param Title|null $title
*/
public function __construct(
string $label, string $ariaLabel, string $class, int $numLanguages,
// @todo: replace with >MenuContents class.
string $itemHTML, string $beforePortlet = '', string $afterPortlet = '', $title = null
) {
$this->label = $label;
$this->ariaLabel = $ariaLabel;
$this->class = $class;
$this->numLanguages = $numLanguages;
$this->menuContentsData = [
'html-items' => $itemHTML,
'html-before-portal' => $beforePortlet,
'html-after-portal' => $afterPortlet,
];
$this->title = $title;
}
/**
* @inheritDoc
*/
public function getTemplateData(): array {
$title = $this->title;
$isSubjectPage = $title && $title->exists() && !$title->isTalkPage();
// If page doesn't exist or if it's in a talk namespace, we should
// display a less prominent "language" button, without a label, and
// quiet instead of progressive. For this reason some default values
// should be updated for this case. (T316559)
$buttonClasses = 'cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet';
if ( !$isSubjectPage ) {
$icon = 'language';
$this->class .= ' mw-portlet-lang-icon-only';
$labelClass = $buttonClasses . ' cdx-button--icon-only mw-portlet-lang-heading-empty';
$checkboxClass = 'mw-interlanguage-selector-empty';
} else {
$icon = 'language-progressive';
$labelClass = $buttonClasses . ' cdx-button--action-progressive'
. ' mw-portlet-lang-heading-' . strval( $this->numLanguages );
$checkboxClass = 'mw-interlanguage-selector';
}
$dropdown = new VectorComponentDropdown( 'p-lang-btn', $this->label, $this->class );
$dropdownData = $dropdown->getTemplateData();
// override default heading class.
$dropdownData['label-class'] = $labelClass;
// ext.uls.interface attaches click handler to this selector.
$dropdownData['checkbox-class'] = $checkboxClass;
$dropdownData['icon'] = $icon;
$dropdownData['aria-label'] = $this->ariaLabel;
$dropdownData['is-language-selector-empty'] = !$isSubjectPage;
return $dropdownData + $this->menuContentsData;
}
}