Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 35
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 / 35
0.00% covered (danger)
0.00%
0 / 2
56
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 onBeforePageDisplay
0.00% covered (danger)
0.00%
0 / 34
0.00% covered (danger)
0.00%
0 / 1
42
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    public function __construct(
18        private readonly LanguageFactory $languageFactory,
19        private readonly LanguageNameUtils $languageNameUtils
20    ) {
21    }
22
23    /** @inheritDoc */
24    public function onBeforePageDisplay( $out, $skin ): void {
25        $isMobileView = false;
26        if ( ExtensionRegistry::getInstance()->isLoaded( 'MobileFrontend' ) ) {
27            /** @var MobileContext $mobileContext */
28            $mobileContext = MediaWikiServices::getInstance()->getService( 'MobileFrontend.Context' );
29            $isMobileView = $mobileContext->shouldDisplayMobileView();
30        }
31
32        // This entrypoint should only be enabled for mobile web version
33        if ( !$isMobileView ) {
34            return;
35        }
36
37        if ( !$out->getTitle()->isContentPage() || !$out->getTitle()->exists() ) {
38            return;
39        }
40
41        $availableDomainCodes = array_map( static function ( $languageLink ) {
42            $language = explode( ":", $languageLink )[0];
43            return SiteMapper::getDomainCode( $language );
44        }, $out->getLanguageLinks() );
45
46        // Add current domain code to the available ones.
47        $currentLangCode = SiteMapper::getCurrentLanguageCode();
48        $currentDomainCode = SiteMapper::getDomainCode( $currentLangCode );
49        $availableDomainCodes[] = $currentDomainCode;
50
51        $enabledDomainCodes = array_map(
52            static fn ( $language ) => SiteMapper::getDomainCode( $language ),
53            $out->getConfig()->get( 'SectionTranslationTargetLanguages' ) ?? []
54        );
55
56        $missingDomainCodes = array_diff( $enabledDomainCodes, $availableDomainCodes );
57
58        $missingLanguages = array_map( function ( $domainCode ) {
59            $languageCode = SiteMapper::getLanguageCodeFromDomain( $domainCode );
60            $language = $this->languageFactory->getLanguage( $languageCode );
61            return [
62                'lang' => $languageCode,
63                'domain' => $domainCode,
64                'autonym' => $this->languageNameUtils->getLanguageName( $languageCode ),
65                'dir' => $language->getDir()
66            ];
67        }, $missingDomainCodes );
68
69        if ( !$missingLanguages ) {
70            return;
71        }
72
73        $out->addModules( 'ext.cx.entrypoints.mffrequentlanguages' );
74        $out->addJsConfigVars( 'wgSectionTranslationMissingLanguages', array_values( $missingLanguages ) );
75    }
76}