Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 52
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
WebInstallerLanguage
0.00% covered (danger)
0.00%
0 / 52
0.00% covered (danger)
0.00%
0 / 2
182
0.00% covered (danger)
0.00%
0 / 1
 execute
0.00% covered (danger)
0.00%
0 / 41
0.00% covered (danger)
0.00%
0 / 1
132
 getLanguageSelector
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3/**
4 * @license GPL-2.0-or-later
5 * @file
6 * @ingroup Installer
7 */
8
9namespace MediaWiki\Installer;
10
11use MediaWiki\Context\RequestContext;
12use MediaWiki\Html\Html;
13use MediaWiki\Language\LanguageNameUtils;
14use MediaWiki\MediaWikiServices;
15use MediaWiki\Xml\XmlSelect;
16
17class WebInstallerLanguage extends WebInstallerPage {
18
19    /**
20     * @return string|null
21     */
22    public function execute() {
23        $lang = RequestContext::getMain()->getLanguage();
24        $r = $this->parent->request;
25        $userLang = $r->getVal( 'uselang', '' );
26        $contLang = $r->getVal( 'ContLang', '' );
27
28        $languages = MediaWikiServices::getInstance()
29            ->getLanguageNameUtils()
30            ->getLanguageNames( LanguageNameUtils::AUTONYMS, LanguageNameUtils::SUPPORTED );
31        $lifetime = intval( ini_get( 'session.gc_maxlifetime' ) );
32        if ( !$lifetime ) {
33            $lifetime = 1440; // PHP default
34        }
35
36        if ( $r->wasPosted() ) {
37            # Do session test
38            if ( $this->parent->getSession( 'test' ) === null ) {
39                $requestTime = $r->getIntOrNull( 'LanguageRequestTime' );
40                if ( !$requestTime ) {
41                    // The most likely explanation is that the user was knocked back
42                    // from another page on POST due to session expiry
43                    $msg = 'config-session-expired';
44                } elseif ( time() - $requestTime > $lifetime ) {
45                    $msg = 'config-session-expired';
46                } else {
47                    $msg = 'config-no-session';
48                }
49                $this->parent->showError( $msg, $lang->formatTimePeriod( $lifetime ) );
50            } else {
51                if ( isset( $languages[$userLang] ) ) {
52                    $this->setVar( '_UserLang', $userLang );
53                }
54                if ( isset( $languages[$contLang] ) ) {
55                    $this->setVar( 'wgLanguageCode', $contLang );
56                }
57
58                return 'continue';
59            }
60        } elseif ( $this->parent->showSessionWarning ) {
61            # The user was knocked back from another page to the start
62            # This probably indicates a session expiry
63            $this->parent->showError( 'config-session-expired',
64                $lang->formatTimePeriod( $lifetime ) );
65        }
66
67        $this->parent->setSession( 'test', true );
68
69        if ( !isset( $languages[$userLang] ) ) {
70            $userLang = $this->getVar( '_UserLang', 'en' );
71        }
72        if ( !isset( $languages[$contLang] ) ) {
73            $contLang = $this->getVar( 'wgLanguageCode', 'en' );
74        }
75        $this->startForm();
76        $s = Html::hidden( 'LanguageRequestTime', time() ) .
77            $this->getLanguageSelector( 'uselang', 'config-your-language', $userLang,
78                $this->parent->getHelpBox( 'config-your-language-help' ) ) .
79            $this->getLanguageSelector( 'ContLang', 'config-wiki-language', $contLang,
80                $this->parent->getHelpBox( 'config-wiki-language-help' ) );
81        $this->addHTML( $s );
82        $this->endForm( 'continue', false );
83
84        return null;
85    }
86
87    /**
88     * Get a "<select>" for selecting languages.
89     *
90     * @param string $name
91     * @param string $label
92     * @param string $selectedCode
93     * @param string $helpHtml
94     *
95     * @return string
96     */
97    public function getLanguageSelector( $name, $label, $selectedCode, $helpHtml = '' ) {
98        $output = $helpHtml;
99
100        $select = new XmlSelect( $name, $name, $selectedCode );
101        $select->setAttribute( 'tabindex', $this->parent->nextTabIndex() );
102        $select->setAttribute( 'class', 'cdx-select' );
103
104        $languages = MediaWikiServices::getInstance()
105            ->getLanguageNameUtils()
106            ->getLanguageNames( LanguageNameUtils::AUTONYMS, LanguageNameUtils::SUPPORTED );
107        foreach ( $languages as $code => $lang ) {
108            $select->addOption( "$code - $lang", $code );
109        }
110
111        $output .= $select->getHTML();
112        return $this->parent->label( $label, $name, $output );
113    }
114
115}