Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
83.33% |
20 / 24 |
|
40.00% |
2 / 5 |
CRAP | |
0.00% |
0 / 1 |
LanguageConverterFactory | |
83.33% |
20 / 24 |
|
40.00% |
2 / 5 |
8.30 | |
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 | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
isLinkConversionDisabled | |
0.00% |
0 / 2 |
|
0.00% |
0 / 1 |
6 |
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 ILanguageConverter; |
28 | use IuConverter; |
29 | use KuConverter; |
30 | use Language; |
31 | use MediaWiki\Config\ServiceOptions; |
32 | use MediaWiki\MainConfigNames; |
33 | use MediaWiki\StubObject\StubUserLang; |
34 | use ShConverter; |
35 | use ShiConverter; |
36 | use SrConverter; |
37 | use TgConverter; |
38 | use TlyConverter; |
39 | use TrivialLanguageConverter; |
40 | use UzConverter; |
41 | use Wikimedia\ObjectFactory\ObjectFactory; |
42 | use WuuConverter; |
43 | use ZghConverter; |
44 | use ZhConverter; |
45 | |
46 | /** |
47 | * An interface for creating language converters. |
48 | * |
49 | * @since 1.35 |
50 | * @ingroup Language |
51 | */ |
52 | class LanguageConverterFactory { |
53 | |
54 | private $cache = []; |
55 | /** |
56 | * @var array |
57 | */ |
58 | private $converterList = [ |
59 | 'ban' => [ |
60 | 'class' => BanConverter::class, |
61 | ], |
62 | 'crh' => [ |
63 | 'class' => CrhConverter::class, |
64 | ], |
65 | 'gan' => [ |
66 | 'class' => GanConverter::class, |
67 | ], |
68 | 'iu' => [ |
69 | 'class' => IuConverter::class, |
70 | ], |
71 | 'ku' => [ |
72 | 'class' => KuConverter::class, |
73 | ], |
74 | 'shi' => [ |
75 | 'class' => ShiConverter::class, |
76 | ], |
77 | 'sh' => [ |
78 | 'class' => ShConverter::class, |
79 | ], |
80 | 'sr' => [ |
81 | 'class' => SrConverter::class, |
82 | ], |
83 | 'tg' => [ |
84 | 'class' => TgConverter::class, |
85 | ], |
86 | 'tly' => [ |
87 | 'class' => TlyConverter::class, |
88 | ], |
89 | 'uz' => [ |
90 | 'class' => UzConverter::class, |
91 | ], |
92 | 'wuu' => [ |
93 | 'class' => WuuConverter::class, |
94 | ], |
95 | 'zgh' => [ |
96 | 'class' => ZghConverter::class, |
97 | ], |
98 | 'zh' => [ |
99 | 'class' => ZhConverter::class, |
100 | ], |
101 | ]; |
102 | |
103 | private const DEFAULT_CONVERTER = [ |
104 | 'class' => TrivialLanguageConverter::class, |
105 | 'services' => [ |
106 | 'TitleFormatter', |
107 | ] |
108 | ]; |
109 | |
110 | private const EN_CONVERTER = [ |
111 | 'class' => EnConverter::class, |
112 | ]; |
113 | |
114 | /** |
115 | * @internal For use by ServiceWiring |
116 | */ |
117 | public const CONSTRUCTOR_OPTIONS = [ |
118 | MainConfigNames::UsePigLatinVariant, |
119 | MainConfigNames::DisableLangConversion, |
120 | MainConfigNames::DisableTitleConversion, |
121 | ]; |
122 | |
123 | private ServiceOptions $options; |
124 | private ObjectFactory $objectFactory; |
125 | |
126 | /** |
127 | * @var callable callback of "() : Language" |
128 | */ |
129 | private $defaultLanguage; |
130 | |
131 | /** |
132 | * @param ServiceOptions $options |
133 | * @param ObjectFactory $objectFactory |
134 | * @param callable $defaultLanguage callback of "() : Language", should return |
135 | * default language. Used in getLanguageConverter when $language is null. |
136 | * |
137 | * @internal Should be called from MediaWikiServices only. |
138 | */ |
139 | public function __construct( |
140 | ServiceOptions $options, |
141 | ObjectFactory $objectFactory, |
142 | callable $defaultLanguage |
143 | ) { |
144 | $options->assertRequiredOptions( self::CONSTRUCTOR_OPTIONS ); |
145 | $this->options = $options; |
146 | $this->objectFactory = $objectFactory; |
147 | if ( $options->get( MainConfigNames::UsePigLatinVariant ) ) { |
148 | $this->converterList['en'] = self::EN_CONVERTER; |
149 | } |
150 | $this->defaultLanguage = $defaultLanguage; |
151 | } |
152 | |
153 | /** |
154 | * Returns Converter instance for a given language object |
155 | * |
156 | * @param Language|StubUserLang $lang |
157 | * @return ILanguageConverter |
158 | */ |
159 | private function instantiateConverter( $lang ): ILanguageConverter { |
160 | $code = mb_strtolower( $lang->getCode() ); |
161 | $spec = $this->converterList[$code] ?? self::DEFAULT_CONVERTER; |
162 | // ObjectFactory::createObject accepts an array, not just a callable (phan bug) |
163 | // @phan-suppress-next-line PhanTypeInvalidCallableArrayKey, PhanTypeInvalidCallableArraySize |
164 | return $this->objectFactory->createObject( |
165 | $spec, |
166 | [ |
167 | 'assertClass' => ILanguageConverter::class, |
168 | 'extraArgs' => [ $lang ], |
169 | ] |
170 | ); |
171 | } |
172 | |
173 | /** |
174 | * Provide a LanguageConverter for given language |
175 | * |
176 | * @param Language|StubUserLang|null $language for which a LanguageConverter should be provided. |
177 | * If it is null, then the LanguageConverter provided for current content language as returned |
178 | * by the callback provided to the constructor. |
179 | * |
180 | * @return ILanguageConverter |
181 | */ |
182 | public function getLanguageConverter( $language = null ): ILanguageConverter { |
183 | $lang = $language ?? ( $this->defaultLanguage )(); |
184 | if ( isset( $this->cache[$lang->getCode()] ) ) { |
185 | return $this->cache[$lang->getCode()]; |
186 | } |
187 | // @phan-suppress-next-line PhanTypeMismatchArgumentNullable False positive |
188 | $converter = $this->instantiateConverter( $lang ); |
189 | $this->cache[$lang->getCode()] = $converter; |
190 | return $converter; |
191 | } |
192 | |
193 | /** |
194 | * Whether to disable language variant conversion. |
195 | * |
196 | * @return bool |
197 | */ |
198 | public function isConversionDisabled() { |
199 | return $this->options->get( MainConfigNames::DisableLangConversion ); |
200 | } |
201 | |
202 | /** |
203 | * Whether to disable language variant conversion for links. |
204 | * |
205 | * @return bool |
206 | */ |
207 | public function isLinkConversionDisabled() { |
208 | return $this->options->get( MainConfigNames::DisableLangConversion ) || |
209 | // Note that this configuration option is misnamed. |
210 | $this->options->get( MainConfigNames::DisableTitleConversion ); |
211 | } |
212 | } |