Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
1 / 1
CRAP
100.00% covered (success)
100.00%
1 / 1
ZObjectRepoUtils
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
1 / 1
10
100.00% covered (success)
100.00%
1 / 1
 getLanguageFromString
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
1 / 1
10
1<?php
2/**
3 * WikiLambda ZObject utilities specific to repo-mode class
4 *
5 * @file
6 * @ingroup Extensions
7 * @copyright 2020– Abstract Wikipedia team; see AUTHORS.txt
8 * @license MIT
9 */
10
11namespace MediaWiki\Extension\WikiLambda;
12
13use MediaWiki\Extension\WikiLambda\Registry\ZTypeRegistry;
14use MediaWiki\Language\Language;
15use MediaWiki\MediaWikiServices;
16use MediaWiki\Title\Title;
17
18class ZObjectRepoUtils {
19
20    /**
21     * Get a language code from a string that may be either a code or a Wikifunctions ZLanguage ZID.
22     *
23     * @param string $languageString The string to interpret as a language, which may be a language code or a ZID
24     * @param string $fallback The language code to return if the string cannot be interpreted, defaulting to 'en'
25     * @return Language The Langauge for the interpreted language code, or the fallback if the input is invalid
26     */
27    public static function getLanguageFromString( string $languageString, string $fallback = 'en' ): Language {
28        $targetLanguage = $languageString;
29
30        $services = MediaWikiServices::getInstance();
31
32        // Allow the user-language to be a ZObject
33        if ( ZObjectUtils::isValidZObjectReference( $languageString ) ) {
34            $zobjectStore = $services->get( 'WikiLambdaZObjectStore' );
35            $targetLanguageContent = $zobjectStore->fetchZObjectByTitle(
36                Title::newFromText( $languageString, NS_MAIN )
37            );
38            if (
39                $targetLanguageContent &&
40                $targetLanguageContent->getObject() &&
41                $targetLanguageContent->getObject()->Z2K2 &&
42                $targetLanguageContent->getObject()->Z2K2->Z1K1 &&
43                $targetLanguageContent->getObject()->Z2K2->Z1K1 === ZTypeRegistry::Z_LANGUAGE &&
44                $targetLanguageContent->getObject()->Z2K2->Z60K1
45            ) {
46                $targetLanguage = $targetLanguageContent->getObject()->Z2K2->Z60K1;
47            } else {
48                $targetLanguage = $fallback;
49            }
50        }
51
52        // Given this is user input, validate the language code, and fall back if it's not valid
53        if ( !$services->getLanguageNameUtils()->isSupportedLanguage( $targetLanguage ) ) {
54            if ( !$services->getLanguageNameUtils()->isSupportedLanguage( $fallback ) ) {
55                // Recover from invalid fallback language codes by using the default language
56                $targetLanguage = 'en';
57            } else {
58                $targetLanguage = $fallback;
59            }
60        }
61
62        // Given we've validated above the language (or fallback), we don't need to catch InvalidArgumentException.
63        return $services->getLanguageFactory()->getLanguage( $targetLanguage );
64    }
65
66}