Update git submodules
[mediawiki.git] / includes / language / LanguageConverterFactory.php
blob29064f1fcdd9ca3361b4c5e530baabaa7d60f69d
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.
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.
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
18 * @file
21 namespace MediaWiki\Languages;
23 use BanConverter;
24 use CrhConverter;
25 use EnConverter;
26 use GanConverter;
27 use ILanguageConverter;
28 use IuConverter;
29 use KkConverter;
30 use KuConverter;
31 use Language;
32 use MediaWiki\StubObject\StubUserLang;
33 use ShConverter;
34 use ShiConverter;
35 use SrConverter;
36 use TgConverter;
37 use TlyConverter;
38 use TrivialLanguageConverter;
39 use UzConverter;
40 use Wikimedia\ObjectFactory\ObjectFactory;
41 use WuuConverter;
42 use ZhConverter;
44 /**
45 * An interface for creating language converters.
47 * @since 1.35
48 * @ingroup Language
50 class LanguageConverterFactory {
52 private $cache = [];
53 /**
54 * @var array
56 private $converterList = [
57 'ban' => [
58 'class' => BanConverter::class,
60 'crh' => [
61 'class' => CrhConverter::class,
63 'gan' => [
64 'class' => GanConverter::class,
66 'iu' => [
67 'class' => IuConverter::class,
69 'kk' => [
70 'class' => KkConverter::class,
72 'ku' => [
73 'class' => KuConverter::class,
75 'shi' => [
76 'class' => ShiConverter::class,
78 'sh' => [
79 'class' => ShConverter::class,
81 'sr' => [
82 'class' => SrConverter::class,
84 'tg' => [
85 'class' => TgConverter::class,
87 'tly' => [
88 'class' => TlyConverter::class,
90 'uz' => [
91 'class' => UzConverter::class,
93 'wuu' => [
94 'class' => WuuConverter::class,
96 'zh' => [
97 'class' => ZhConverter::class,
101 private const DEFAULT_CONVERTER = [
102 'class' => TrivialLanguageConverter::class,
103 'services' => [
104 'TitleFormatter',
108 private const EN_CONVERTER = [
109 'class' => EnConverter::class,
112 /** @var ObjectFactory */
113 private $objectFactory;
116 * @var bool Whether to disable language variant conversion.
118 private $isConversionDisabled;
121 * @var bool Whether to disable language variant conversion for links.
123 private $isTitleConversionDisabled;
126 * @var callable callback of "() : Language"
128 private $defaultLanguage;
131 * @param ObjectFactory $objectFactory
132 * @param bool $usePigLatinVariant should pig variant of English be used
133 * @param bool $isConversionDisabled Whether to disable language variant conversion
134 * @param bool $isTitleConversionDisabled Whether to disable language variant conversion for links
135 * @param callable $defaultLanguage callback of "() : Language", should return
136 * default language. Used in getLanguageConverter when $language is null.
138 * @internal Should be called from MediaWikiServices only.
140 public function __construct(
141 ObjectFactory $objectFactory,
142 $usePigLatinVariant, $isConversionDisabled, $isTitleConversionDisabled,
143 callable $defaultLanguage
145 $this->objectFactory = $objectFactory;
146 if ( $usePigLatinVariant ) {
147 $this->converterList['en'] = self::EN_CONVERTER;
149 $this->isConversionDisabled = $isConversionDisabled;
150 $this->isTitleConversionDisabled = $isTitleConversionDisabled;
151 $this->defaultLanguage = $defaultLanguage;
155 * Returns Converter instance for a given language object
157 * @param Language|StubUserLang $lang
158 * @return ILanguageConverter
160 private function instantiateConverter( $lang ): ILanguageConverter {
161 $code = mb_strtolower( $lang->getCode() );
162 $spec = $this->converterList[$code] ?? self::DEFAULT_CONVERTER;
163 // ObjectFactory::createObject accepts an array, not just a callable (phan bug)
164 // @phan-suppress-next-line PhanTypeInvalidCallableArrayKey, PhanTypeInvalidCallableArraySize
165 return $this->objectFactory->createObject(
166 $spec,
168 'assertClass' => ILanguageConverter::class,
169 'extraArgs' => [ $lang ],
175 * Provide a LanguageConverter for given language
177 * @param Language|StubUserLang|null $language for which a LanguageConverter should be provided.
178 * If it is null, then the LanguageConverter provided for current content language as returned
179 * by the callback provided to the constructor.
181 * @return ILanguageConverter
183 public function getLanguageConverter( $language = null ): ILanguageConverter {
184 $lang = $language ?? ( $this->defaultLanguage )();
185 if ( isset( $this->cache[$lang->getCode()] ) ) {
186 return $this->cache[$lang->getCode()];
188 // @phan-suppress-next-line PhanTypeMismatchArgumentNullable False positive
189 $converter = $this->instantiateConverter( $lang );
190 $this->cache[$lang->getCode()] = $converter;
191 return $converter;
195 * Whether to disable language variant conversion.
197 * @return bool
199 public function isConversionDisabled() {
200 return $this->isConversionDisabled;
204 * Whether to disable language variant conversion for titles.
206 * @return bool
207 * @deprecated since 1.36 Should use ::isLinkConversionDisabled() instead
209 public function isTitleConversionDisabled() {
210 wfDeprecated( __METHOD__, '1.36' );
211 return $this->isTitleConversionDisabled;
215 * Whether to disable language variant conversion for links.
217 * @return bool
219 public function isLinkConversionDisabled() {
220 return $this->isConversionDisabled || $this->isTitleConversionDisabled;