Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
100.00% |
39 / 39 |
|
100.00% |
8 / 8 |
CRAP | |
100.00% |
1 / 1 |
StringForLanguageBuilder | |
100.00% |
39 / 39 |
|
100.00% |
8 / 8 |
15 | |
100.00% |
1 / 1 |
__construct | |
100.00% |
2 / 2 |
|
100.00% |
1 / 1 |
1 | |||
fallbackWithEnglish | |
100.00% |
2 / 2 |
|
100.00% |
1 / 1 |
1 | |||
placeholderWith | |
100.00% |
2 / 2 |
|
100.00% |
1 / 1 |
1 | |||
placeholderNoFallback | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
placeholderForTitle | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getLanguageProvided | |
100.00% |
11 / 11 |
|
100.00% |
1 / 1 |
4 | |||
getStringAndLanguageCode | |
100.00% |
19 / 19 |
|
100.00% |
1 / 1 |
5 | |||
getString | |
100.00% |
1 / 1 |
|
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 | |
12 | namespace MediaWiki\Extension\WikiLambda\ZObjects; |
13 | |
14 | use Language; |
15 | use MediaWiki\Languages\LanguageFallback; |
16 | use 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 | */ |
24 | class 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 | } |