Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
39 / 39
100.00% covered (success)
100.00%
8 / 8
CRAP
100.00% covered (success)
100.00%
1 / 1
StringForLanguageBuilder
100.00% covered (success)
100.00%
39 / 39
100.00% covered (success)
100.00%
8 / 8
15
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 fallbackWithEnglish
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 placeholderWith
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 placeholderNoFallback
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 placeholderForTitle
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getLanguageProvided
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
4
 getStringAndLanguageCode
100.00% covered (success)
100.00%
19 / 19
100.00% covered (success)
100.00%
1 / 1
5
 getString
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3/**
4 * WikiLambda StringForLanguageBuilder
5 *
6 * @file
7 * @ingroup Extensions
8 * @copyright 2020– Abstract Wikipedia team; see AUTHORS.txt
9 * @license MIT
10 */
11
12namespace MediaWiki\Extension\WikiLambda\ZObjects;
13
14use Language;
15use MediaWiki\Languages\LanguageFallback;
16use MediaWiki\MediaWikiServices;
17
18/**
19 * Builder of a string for a certain language.
20 *
21 * Don't instantiate it directly, rather call
22 * MediaWiki\Extension\WikiLambda\ZObjects\ZMultilingualString->buildStringForLanguage( $lang )
23 */
24class StringForLanguageBuilder {
25
26    private int $languageFallback = LanguageFallback::STRICT;
27    private Language $language;
28    private ?string $placeholderText = null;
29    private ZMultiLingualString $provider;
30
31    /**
32     * @param Language $lang The language with build the string for
33     * @param ZMultilingualString $provider Object that provides the localized strings.
34     */
35    public function __construct( Language $lang, ZMultiLingualString $provider ) {
36        $this->language = $lang;
37        $this->provider = $provider;
38    }
39
40    /**
41     * If the string for the language passed to the constructor is not available, fallback to Engligh.
42     * @return StringForLanguageBuilder
43     */
44    public function fallbackWithEnglish(): StringForLanguageBuilder {
45        $this->languageFallback = LanguageFallback::MESSAGES;
46        return $this;
47    }
48
49    /**
50     * If we cannot find any string, return the passed placeholder.
51     * @param string $placeholderText Key of the placeholder
52     * @return StringForLanguageBuilder
53     */
54    public function placeholderWith( string $placeholderText ): StringForLanguageBuilder {
55        $this->placeholderText = $placeholderText;
56        return $this;
57    }
58
59    /**
60     * If we cannot find any string, return the default placeholder.
61     * @return StringForLanguageBuilder
62     */
63    public function placeholderNoFallback() {
64        return $this->placeholderWith( 'wikilambda-multilingualstring-nofallback' );
65    }
66
67    /**
68     * If we cannot find any string, return the placeholder for a title.
69     * @return StringForLanguageBuilder
70     */
71    public function placeholderForTitle() {
72        return $this->placeholderWith( 'wikilambda-editor-default-name' );
73    }
74
75    /**
76     * @return ?string The language code for which a string value is provided.
77     */
78    public function getLanguageProvided() {
79        $languageCode = $this->language->getCode();
80        if ( $this->provider->isLanguageProvidedValue( $languageCode ) ) {
81            return $languageCode;
82        }
83
84        // TODO (T362246): Dependency-inject
85        $fallbacks = MediaWikiServices::getInstance()->getLanguageFallback()->getAll(
86            $languageCode,
87            $this->languageFallback
88        );
89
90        foreach ( $fallbacks as $index => $fallbackLanguageCode ) {
91            if ( $this->provider->isLanguageProvidedValue( $fallbackLanguageCode ) ) {
92                return $fallbackLanguageCode;
93            }
94        }
95        return null;
96    }
97
98    /**
99     * Return the string and the language code.
100     *
101     * @return array
102     */
103    public function getStringAndLanguageCode(): array {
104        $languageCodeProvided = $this->getLanguageProvided();
105
106        if ( $languageCodeProvided !== null ) {
107            $title = $this->provider->getStringForLanguageCode( $languageCodeProvided );
108
109            // use 'untitled' placeholder instead of an empty string
110            if ( $title == '' && $this->placeholderText !== null ) {
111                $title = wfMessage( $this->placeholderText )->inLanguage( $this->language )->text();
112            }
113
114            return [
115                'title' => $title,
116                'languageCode' => $languageCodeProvided
117            ];
118        }
119
120        $languageCode = $this->language->getCode();
121
122        if ( isset( $this->placeholderText ) ) {
123            return [
124                'title' => wfMessage( $this->placeholderText )->inLanguage( $this->language )->text(),
125                'languageCode' => $languageCode
126            ];
127        }
128        return [
129            'title' => null,
130            'languageCode' => $languageCode
131        ];
132    }
133
134    /**
135     * Return the string.
136     *
137     * @return ?string
138     */
139    public function getString(): ?string {
140        return $this->getStringAndLanguageCode()[ 'title' ];
141    }
142}