Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
95.83% |
23 / 24 |
|
80.00% |
4 / 5 |
CRAP | |
0.00% |
0 / 1 |
LanguageConverterFactory | |
95.83% |
23 / 24 |
|
80.00% |
4 / 5 |
8 | |
0.00% |
0 / 1 |
__construct | |
100.00% |
6 / 6 |
|
100.00% |
1 / 1 |
2 | |||
instantiateConverter | |
100.00% |
9 / 9 |
|
100.00% |
1 / 1 |
1 | |||
getLanguageConverter | |
83.33% |
5 / 6 |
|
0.00% |
0 / 1 |
2.02 | |||
isConversionDisabled | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
isLinkConversionDisabled | |
100.00% |
2 / 2 |
|
100.00% |
1 / 1 |
2 |
1 | <?php |
2 | /** |
3 | * This program is free software; you can redistribute it and/or modify |
4 | * it under the terms of the GNU General Public License as published by |
5 | * the Free Software Foundation; either version 2 of the License, or |
6 | * (at your option) any later version. |
7 | * |
8 | * This program is distributed in the hope that it will be useful, |
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
11 | * GNU General Public License for more details. |
12 | * |
13 | * You should have received a copy of the GNU General Public License along |
14 | * with this program; if not, write to the Free Software Foundation, Inc., |
15 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
16 | * http://www.gnu.org/copyleft/gpl.html |
17 | * |
18 | * @file |
19 | */ |
20 | |
21 | namespace MediaWiki\Languages; |
22 | |
23 | use BanConverter; |
24 | use CrhConverter; |
25 | use EnConverter; |
26 | use GanConverter; |
27 | use IuConverter; |
28 | use KuConverter; |
29 | use MediaWiki\Config\ServiceOptions; |
30 | use MediaWiki\Language\ILanguageConverter; |
31 | use MediaWiki\Language\Language; |
32 | use MediaWiki\MainConfigNames; |
33 | use MediaWiki\StubObject\StubUserLang; |
34 | use MniConverter; |
35 | use ShConverter; |
36 | use ShiConverter; |
37 | use SrConverter; |
38 | use TgConverter; |
39 | use TlyConverter; |
40 | use TrivialLanguageConverter; |
41 | use UzConverter; |
42 | use Wikimedia\ObjectFactory\ObjectFactory; |
43 | use WuuConverter; |
44 | use ZghConverter; |
45 | use ZhConverter; |
46 | |
47 | /** |
48 | * An interface for creating language converters. |
49 | * |
50 | * @since 1.35 |
51 | * @ingroup Language |
52 | */ |
53 | class LanguageConverterFactory { |
54 | |
55 | /** @var ILanguageConverter[] */ |
56 | private $cache = []; |
57 | /** |
58 | * @var array |
59 | * @phpcs-require-sorted-array |
60 | */ |
61 | private $converterList = [ |
62 | 'ban' => [ |
63 | 'class' => BanConverter::class, |
64 | ], |
65 | 'crh' => [ |
66 | 'class' => CrhConverter::class, |
67 | ], |
68 | 'gan' => [ |
69 | 'class' => GanConverter::class, |
70 | ], |
71 | 'iu' => [ |
72 | 'class' => IuConverter::class, |
73 | ], |
74 | 'ku' => [ |
75 | 'class' => KuConverter::class, |
76 | ], |
77 | 'mni' => [ |
78 | 'class' => MniConverter::class, |
79 | ], |
80 | 'sh' => [ |
81 | 'class' => ShConverter::class, |
82 | ], |
83 | 'shi' => [ |
84 | 'class' => ShiConverter::class, |
85 | ], |
86 | 'sr' => [ |
87 | 'class' => SrConverter::class, |
88 | ], |
89 | 'tg' => [ |
90 | 'class' => TgConverter::class, |
91 | ], |
92 | 'tly' => [ |
93 | 'class' => TlyConverter::class, |
94 | ], |
95 | 'uz' => [ |
96 | 'class' => UzConverter::class, |
97 | ], |
98 | 'wuu' => [ |
99 | 'class' => WuuConverter::class, |
100 | ], |
101 | 'zgh' => [ |
102 | 'class' => ZghConverter::class, |
103 | ], |
104 | 'zh' => [ |
105 | 'class' => ZhConverter::class, |
106 | ], |
107 | ]; |
108 | |
109 | private const DEFAULT_CONVERTER = [ |
110 | 'class' => TrivialLanguageConverter::class, |
111 | 'services' => [ |
112 | 'TitleFormatter', |
113 | ] |
114 | ]; |
115 | |
116 | private const EN_CONVERTER = [ |
117 | 'class' => EnConverter::class, |
118 | ]; |
119 | |
120 | /** |
121 | * @internal For use by ServiceWiring |
122 | */ |
123 | public const CONSTRUCTOR_OPTIONS = [ |
124 | MainConfigNames::UsePigLatinVariant, |
125 | MainConfigNames::DisableLangConversion, |
126 | MainConfigNames::DisableTitleConversion, |
127 | ]; |
128 | |
129 | private ServiceOptions $options; |
130 | private ObjectFactory $objectFactory; |
131 | |
132 | /** |
133 | * @var callable callback of "() : Language" |
134 | */ |
135 | private $defaultLanguage; |
136 | |
137 | /** |
138 | * @param ServiceOptions $options |
139 | * @param ObjectFactory $objectFactory |
140 | * @param callable $defaultLanguage callback of "() : Language", should return |
141 | * default language. Used in getLanguageConverter when $language is null. |
142 | * |
143 | * @internal Should be called from MediaWikiServices only. |
144 | */ |
145 | public function __construct( |
146 | ServiceOptions $options, |
147 | ObjectFactory $objectFactory, |
148 | callable $defaultLanguage |
149 | ) { |
150 | $options->assertRequiredOptions( self::CONSTRUCTOR_OPTIONS ); |
151 | $this->options = $options; |
152 | $this->objectFactory = $objectFactory; |
153 | if ( $options->get( MainConfigNames::UsePigLatinVariant ) ) { |
154 | $this->converterList['en'] = self::EN_CONVERTER; |
155 | } |
156 | $this->defaultLanguage = $defaultLanguage; |
157 | } |
158 | |
159 | /** |
160 | * Returns Converter instance for a given language object |
161 | * |
162 | * @param Language|StubUserLang $lang |
163 | * @return ILanguageConverter |
164 | */ |
165 | private function instantiateConverter( $lang ): ILanguageConverter { |
166 | $code = mb_strtolower( $lang->getCode() ); |
167 | $spec = $this->converterList[$code] ?? self::DEFAULT_CONVERTER; |
168 | // ObjectFactory::createObject accepts an array, not just a callable (phan bug) |
169 | // @phan-suppress-next-line PhanTypeInvalidCallableArrayKey, PhanTypeInvalidCallableArraySize |
170 | return $this->objectFactory->createObject( |
171 | $spec, |
172 | [ |
173 | 'assertClass' => ILanguageConverter::class, |
174 | 'extraArgs' => [ $lang ], |
175 | ] |
176 | ); |
177 | } |
178 | |
179 | /** |
180 | * Provide a LanguageConverter for given language |
181 | * |
182 | * @param Language|StubUserLang|null $language for which a LanguageConverter should be provided. |
183 | * If it is null, then the LanguageConverter provided for current content language as returned |
184 | * by the callback provided to the constructor. |
185 | * |
186 | * @return ILanguageConverter |
187 | */ |
188 | public function getLanguageConverter( $language = null ): ILanguageConverter { |
189 | $lang = $language ?? ( $this->defaultLanguage )(); |
190 | if ( isset( $this->cache[$lang->getCode()] ) ) { |
191 | return $this->cache[$lang->getCode()]; |
192 | } |
193 | // @phan-suppress-next-line PhanTypeMismatchArgumentNullable False positive |
194 | $converter = $this->instantiateConverter( $lang ); |
195 | $this->cache[$lang->getCode()] = $converter; |
196 | return $converter; |
197 | } |
198 | |
199 | /** |
200 | * Whether to disable language variant conversion. |
201 | * |
202 | * @return bool |
203 | */ |
204 | public function isConversionDisabled() { |
205 | return $this->options->get( MainConfigNames::DisableLangConversion ); |
206 | } |
207 | |
208 | /** |
209 | * Whether to disable language variant conversion for links. |
210 | * |
211 | * @return bool |
212 | */ |
213 | public function isLinkConversionDisabled() { |
214 | return $this->options->get( MainConfigNames::DisableLangConversion ) || |
215 | // Note that this configuration option is misnamed. |
216 | $this->options->get( MainConfigNames::DisableTitleConversion ); |
217 | } |
218 | } |