36 protected function __construct() {
45 $obj =
new $conf[
'BASIC'][
'class']();
47 $obj->namespace = $obj->parseNamespace();
52 public function getConfiguration() {
57 return $this->getFromConf(
'BASIC',
'id' );
60 public function getLabel( IContextSource $context =
null ) {
61 return $this->getFromConf(
'BASIC',
'label' );
65 return $this->getFromConf(
'BASIC',
'description' );
69 return $this->getFromConf(
'BASIC',
'icon' );
73 return $this->namespace;
77 return $this->getFromConf(
'BASIC',
'meta' );
81 $conf = $this->getFromConf(
'BASIC',
'sourcelanguage' );
92 protected function getFromConf( $section, $key =
null ) {
93 if ( $key ===
null ) {
94 return $this->conf[$section] ??
null;
96 return $this->conf[$section][$key] ??
null;
100 $validatorConfigs = $this->getFromConf(
'VALIDATORS' );
101 if ( $validatorConfigs ===
null ) {
107 foreach ( $validatorConfigs as $config ) {
109 $msgValidator->addValidator( $config );
110 }
catch ( Exception $e ) {
111 $id = $this->
getId();
112 throw new InvalidArgumentException(
113 "Unable to construct validator for message group $id: " . $e->getMessage(),
120 return $msgValidator;
124 if ( !isset( $this->mangler ) ) {
125 $class = $this->getFromConf(
'MANGLER',
'class' ) ?? StringMatcher::class;
127 if ( $class ===
'StringMatcher' || $class === StringMatcher::class ) {
129 $manglerConfig = $this->conf[
'MANGLER'] ??
null;
130 if ( $manglerConfig ) {
131 $this->mangler->setConf( $manglerConfig );
134 return $this->mangler;
137 throw new InvalidArgumentException(
138 'Unable to create StringMangler for group ' . $this->
getId() .
': ' .
139 "Custom StringManglers ($class) are currently not supported."
143 return $this->mangler;
153 $insertableConf = $this->getFromConf(
'INSERTABLES' ) ?? [];
155 foreach ( $insertableConf as $config ) {
156 if ( !isset( $config[
'class'] ) ) {
157 throw new InvalidArgumentException(
158 'Insertable configuration for group: ' . $this->
getId() .
159 ' does not provide a class.'
163 if ( !is_string( $config[
'class'] ) ) {
164 throw new InvalidArgumentException(
165 'Expected Insertable class to be string, got: ' . gettype( $config[
'class'] ) .
166 ' for group: ' . $this->
getId()
170 $suggesters[] = InsertableFactory::make( $config[
'class'], $config[
'params'] ?? [] );
175 if ( $messageValidator ) {
176 $suggesters = array_merge( $suggesters, $messageValidator->getInsertableValidators() );
188 if ( $type ===
null ) {
191 foreach ( $this->getRawTags() as $type => $patterns ) {
192 $taglist[$type] = $this->parseTags( $patterns );
197 return $this->parseTags( $this->getRawTags( $type ) );
201 protected function parseTags( $patterns ) {
202 $messageKeys = $this->getKeys();
209 foreach ( $patterns as $index => $pattern ) {
210 if ( strpos( $pattern,
'*' ) ===
false ) {
211 $matches[] = $pattern;
212 unset( $patterns[$index] );
216 if ( count( $patterns ) ) {
225 foreach ( $messageKeys as $key ) {
226 if ( $mangler->matches( $key ) ) {
235 protected function getRawTags( $type =
null ) {
236 if ( !isset( $this->conf[
'TAGS'] ) ) {
240 $tags = $this->conf[
'TAGS'];
245 return $tags[$type] ?? [];
249 foreach ( $this->
getTags() as $type => $tags ) {
250 $collection->
setTags( $type, $tags );
254 protected function parseNamespace() {
255 $ns = $this->getFromConf(
'BASIC',
'namespace' );
257 if ( is_int( $ns ) ) {
261 if ( defined( $ns ) ) {
262 return constant( $ns );
265 $index = MediaWikiServices::getInstance()->getContentLanguage()
269 throw new MWException(
"No valid namespace defined, got $ns." );
275 protected function isSourceLanguage( $code ) {
284 global $wgTranslateWorkflowStates;
285 $conf = $wgTranslateWorkflowStates ?: [];
287 Hooks::run(
'Translate:modifyMessageGroupStates', [ $this->
getId(), &$conf ] );
294 $groupConfiguration = $this->getConfiguration();
295 if ( !isset( $groupConfiguration[
'LANGUAGES'] ) ) {
300 $codes = array_flip( array_keys( Utilities::getLanguageNames( LanguageNameUtils::AUTONYMS ) ) );
302 $lists = $groupConfiguration[
'LANGUAGES'];
303 $exclusionList = $lists[
'exclude'] ??
null;
304 if ( $exclusionList !==
null ) {
305 if ( $exclusionList ===
'*' ) {
308 } elseif ( is_array( $exclusionList ) ) {
309 foreach ( $exclusionList as $code ) {
310 unset( $codes[$code] );
319 $disabledLanguages = Services::getInstance()->getConfigHelper()->getDisabledTargetLanguages();
322 $checks = [ $this->
getId(), strtok( $this->
getId(),
'-' ),
'*' ];
323 foreach ( $checks as $check ) {
324 if ( isset( $disabledLanguages[ $check ] ) ) {
325 foreach ( array_keys( $disabledLanguages[ $check ] ) as $excludedCode ) {
326 unset( $codes[ $excludedCode ] );
331 $inclusionList = $lists[
'include'] ??
null;
332 if ( $inclusionList !==
null ) {
333 if ( $inclusionList ===
'*' ) {
336 } elseif ( is_array( $inclusionList ) ) {
337 foreach ( $inclusionList as $code ) {
338 $codes[$code] =
true;
347 return $this->getFromConf(
'BASIC',
'support' );
return[ 'Translate:ConfigHelper'=> static function():ConfigHelper { return new ConfigHelper();}, 'Translate:CsvTranslationImporter'=> static function(MediaWikiServices $services):CsvTranslationImporter { return new CsvTranslationImporter( $services->getWikiPageFactory());}, 'Translate:EntitySearch'=> static function(MediaWikiServices $services):EntitySearch { return new EntitySearch($services->getMainWANObjectCache(), $services->getCollationFactory() ->makeCollation( 'uca-default-u-kn'), MessageGroups::singleton(), $services->getNamespaceInfo(), $services->get( 'Translate:MessageIndex'), $services->getTitleParser(), $services->getTitleFormatter());}, 'Translate:ExternalMessageSourceStateImporter'=> static function(MediaWikiServices $services):ExternalMessageSourceStateImporter { return new ExternalMessageSourceStateImporter($services->getMainConfig(), $services->get( 'Translate:GroupSynchronizationCache'), $services->getJobQueueGroup(), LoggerFactory::getInstance( 'Translate.GroupSynchronization'), $services->get( 'Translate:MessageIndex'));}, 'Translate:GroupSynchronizationCache'=> static function(MediaWikiServices $services):GroupSynchronizationCache { return new GroupSynchronizationCache( $services->get( 'Translate:PersistentCache'));}, 'Translate:MessageBundleStore'=> static function(MediaWikiServices $services):MessageBundleStore { return new MessageBundleStore(new RevTagStore(), $services->getJobQueueGroup(), $services->getLanguageNameUtils(), $services->get( 'Translate:MessageIndex'));}, 'Translate:MessageGroupReview'=> static function(MediaWikiServices $services):MessageGroupReview { return new MessageGroupReview($services->getDBLoadBalancer(), $services->getHookContainer());}, 'Translate:MessageGroupStatsTableFactory'=> static function(MediaWikiServices $services):MessageGroupStatsTableFactory { return new MessageGroupStatsTableFactory($services->get( 'Translate:ProgressStatsTableFactory'), $services->getDBLoadBalancer(), $services->getLinkRenderer(), $services->getMainConfig() ->get( 'TranslateWorkflowStates') !==false);}, 'Translate:MessageIndex'=> static function(MediaWikiServices $services):MessageIndex { $params=$services->getMainConfig() ->get( 'TranslateMessageIndex');if(is_string( $params)) { $params=(array) $params;} $class=array_shift( $params);return new $class( $params);}, 'Translate:MessagePrefixStats'=> static function(MediaWikiServices $services):MessagePrefixStats { return new MessagePrefixStats( $services->getTitleParser());}, 'Translate:ParsingPlaceholderFactory'=> static function():ParsingPlaceholderFactory { return new ParsingPlaceholderFactory();}, 'Translate:PersistentCache'=> static function(MediaWikiServices $services):PersistentCache { return new PersistentDatabaseCache($services->getDBLoadBalancer(), $services->getJsonCodec());}, 'Translate:ProgressStatsTableFactory'=> static function(MediaWikiServices $services):ProgressStatsTableFactory { return new ProgressStatsTableFactory($services->getLinkRenderer(), $services->get( 'Translate:ConfigHelper'));}, 'Translate:SubpageListBuilder'=> static function(MediaWikiServices $services):SubpageListBuilder { return new SubpageListBuilder($services->get( 'Translate:TranslatableBundleFactory'), $services->getLinkBatchFactory());}, 'Translate:TranslatableBundleFactory'=> static function(MediaWikiServices $services):TranslatableBundleFactory { return new TranslatableBundleFactory($services->get( 'Translate:TranslatablePageStore'), $services->get( 'Translate:MessageBundleStore'));}, 'Translate:TranslatableBundleMover'=> static function(MediaWikiServices $services):TranslatableBundleMover { return new TranslatableBundleMover($services->getMovePageFactory(), $services->getJobQueueGroup(), $services->getLinkBatchFactory(), $services->get( 'Translate:TranslatableBundleFactory'), $services->get( 'Translate:SubpageListBuilder'), $services->getMainConfig() ->get( 'TranslatePageMoveLimit'));}, 'Translate:TranslatableBundleStatusStore'=> static function(MediaWikiServices $services):TranslatableBundleStatusStore { return new TranslatableBundleStatusStore($services->getDBLoadBalancer() ->getConnection(DB_PRIMARY), $services->getCollationFactory() ->makeCollation( 'uca-default-u-kn'), $services->getDBLoadBalancer() ->getMaintenanceConnectionRef(DB_PRIMARY));}, 'Translate:TranslatablePageParser'=> static function(MediaWikiServices $services):TranslatablePageParser { return new TranslatablePageParser($services->get( 'Translate:ParsingPlaceholderFactory'));}, 'Translate:TranslatablePageStore'=> static function(MediaWikiServices $services):TranslatablePageStore { return new TranslatablePageStore($services->get( 'Translate:MessageIndex'), $services->getJobQueueGroup(), new RevTagStore(), $services->getDBLoadBalancer(), $services->get( 'Translate:TranslatableBundleStatusStore'));}, 'Translate:TranslationStashReader'=> static function(MediaWikiServices $services):TranslationStashReader { $db=$services->getDBLoadBalancer() ->getConnectionRef(DB_REPLICA);return new TranslationStashStorage( $db);}, 'Translate:TranslationStatsDataProvider'=> static function(MediaWikiServices $services):TranslationStatsDataProvider { return new TranslationStatsDataProvider(new ServiceOptions(TranslationStatsDataProvider::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getObjectFactory());}, 'Translate:TranslationUnitStoreFactory'=> static function(MediaWikiServices $services):TranslationUnitStoreFactory { return new TranslationUnitStoreFactory( $services->getDBLoadBalancer());}, 'Translate:TranslatorActivity'=> static function(MediaWikiServices $services):TranslatorActivity { $query=new TranslatorActivityQuery($services->getMainConfig(), $services->getDBLoadBalancer());return new TranslatorActivity($services->getMainObjectStash(), $query, $services->getJobQueueGroup());}, 'Translate:TtmServerFactory'=> static function(MediaWikiServices $services):TtmServerFactory { $config=$services->getMainConfig();$default=$config->get( 'TranslateTranslationDefaultService');if( $default===false) { $default=null;} return new TtmServerFactory( $config->get( 'TranslateTranslationServices'), $default);}]
@phpcs-require-sorted-array