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
21 namespace MediaWiki\Languages
;
27 use ILanguageConverter
;
32 use MediaWiki\StubObject\StubUserLang
;
38 use TrivialLanguageConverter
;
40 use Wikimedia\ObjectFactory\ObjectFactory
;
45 * An interface for creating language converters.
50 class LanguageConverterFactory
{
56 private $converterList = [
58 'class' => BanConverter
::class,
61 'class' => CrhConverter
::class,
64 'class' => GanConverter
::class,
67 'class' => IuConverter
::class,
70 'class' => KkConverter
::class,
73 'class' => KuConverter
::class,
76 'class' => ShiConverter
::class,
79 'class' => ShConverter
::class,
82 'class' => SrConverter
::class,
85 'class' => TgConverter
::class,
88 'class' => TlyConverter
::class,
91 'class' => UzConverter
::class,
94 'class' => WuuConverter
::class,
97 'class' => ZhConverter
::class,
101 private const DEFAULT_CONVERTER
= [
102 'class' => TrivialLanguageConverter
::class,
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(
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;
195 * Whether to disable language variant conversion.
199 public function isConversionDisabled() {
200 return $this->isConversionDisabled
;
204 * Whether to disable language variant conversion for titles.
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.
219 public function isLinkConversionDisabled() {
220 return $this->isConversionDisabled ||
$this->isTitleConversionDisabled
;