Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
MfFrequentLanguagesEntrypointRegistrationHandler
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 2
42
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 onBeforePageDisplay
0.00% covered (danger)
0.00%
0 / 27
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2
3declare( strict_types = 1 );
4
5namespace ContentTranslation\HookHandler;
6
7use ContentTranslation\SiteMapper;
8use MediaWiki\Languages\LanguageFactory;
9use MediaWiki\Languages\LanguageNameUtils;
10use MediaWiki\MediaWikiServices;
11use MediaWiki\Output\Hook\BeforePageDisplayHook;
12use MediaWiki\Registration\ExtensionRegistry;
13use MobileContext;
14
15class MfFrequentLanguagesEntrypointRegistrationHandler implements BeforePageDisplayHook {
16
17    private LanguageFactory $languageFactory;
18
19    private LanguageNameUtils $languageNameUtils;
20
21    public function __construct(
22        LanguageFactory $languageFactory,
23        LanguageNameUtils $languageNameUtils
24    ) {
25        $this->languageFactory = $languageFactory;
26        $this->languageNameUtils = $languageNameUtils;
27    }
28
29    /** @inheritDoc */
30    public function onBeforePageDisplay( $out, $skin ): void {
31        $isMobileView = false;
32        if ( ExtensionRegistry::getInstance()->isLoaded( 'MobileFrontend' ) ) {
33            /** @var MobileContext $mobileContext */
34            $mobileContext = MediaWikiServices::getInstance()->getService( 'MobileFrontend.Context' );
35            $isMobileView = $mobileContext->shouldDisplayMobileView();
36        }
37
38        // This entrypoint should only be enabled for mobile web version
39        if ( !$isMobileView ) {
40            return;
41        }
42
43        $isContentPage = $out->getTitle()->isContentPage();
44
45        if ( !$isContentPage ) {
46            return;
47        }
48
49        $availableLanguages = array_map( static function ( $languageLink ) {
50            return explode( ":", $languageLink )[0];
51        }, $out->getLanguageLinks() );
52
53        // The languageLinks in the current page will not include the current language.
54        // Add that also to the availableLanguages array.
55        $availableLanguages[] = SiteMapper::getCurrentLanguageCode();
56        $enabledLanguages = $out->getConfig()->get( 'SectionTranslationTargetLanguages' ) ?? [];
57        $missingLanguageCodes = array_diff( $enabledLanguages, $availableLanguages );
58
59        $missingLanguages = array_map( function ( $code ) {
60            $language = $this->languageFactory->getLanguage( $code );
61            return [
62                'lang' => $code,
63                'autonym' => $this->languageNameUtils->getLanguageName( $code ),
64                'dir' => $language->getDir()
65            ];
66        }, $missingLanguageCodes );
67
68        if ( !$missingLanguages ) {
69            return;
70        }
71
72        $out->addModules( 'ext.cx.entrypoints.mffrequentlanguages' );
73        $out->addJsConfigVars( 'wgSectionTranslationMissingLanguages', array_values( $missingLanguages ) );
74    }
75}