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