27 private $hookContainer;
29 public function __construct(
32 HookContainer $hookContainer
34 parent::__construct( $query, $moduleName,
'mg' );
35 $this->hookContainer = $hookContainer;
38 public function execute():
void {
39 $params = $this->extractRequestParams();
40 $filter = $params[
'filter'];
43 $props = array_flip( $params[
'prop'] );
45 $needsMetadata = isset( $props[
'prioritylangs'] ) || isset( $props[
'priorityforce'] );
48 if ( $params[
'root'] ===
'all' ) {
50 foreach ( $allGroups as $id => $group ) {
52 $groups[$id] = $group;
55 } elseif ( $params[
'format'] ===
'flat' ) {
56 if ( $params[
'root'] !==
'' ) {
59 $groups[$params[
'root']] = $group;
63 usort( $groups, [ MessageGroups::class,
'groupLabelSort' ] );
65 TranslateMetadata::preloadGroups( array_keys( $groups ), __METHOD__ );
66 } elseif ( $params[
'root'] !==
'' ) {
73 array_shift( $groups );
79 if ( $needsMetadata && $groups ) {
80 TranslateMetadata::preloadGroups( array_keys( $groups ), __METHOD__ );
83 if ( $params[
'root'] ===
'' ) {
89 $groups = $dynamicGroups + $groups;
91 '@phan-var (MessageGroup|array)[] $groups';
95 if ( isset( $groups[
'!sandbox'] ) ) {
96 unset( $groups[
'!sandbox'] );
99 $result = $this->getResult();
102 foreach ( $groups as $mixed ) {
104 $group = is_array( $mixed ) ? reset( $mixed ) : $mixed;
105 if ( $filter !== [] && !$matcher->matches( $group->getId() ) ) {
110 $params[
'languageFilter'] !==
'' &&
111 TranslateMetadata::isExcluded( $group->getId(), $params[
'languageFilter'] )
118 $result->setIndexedTagName( $a,
'group' );
121 $fit = $result->addValue( [
'query', $this->getModuleName() ],
null, $a );
129 $result->addIndexedTagName( [
'query', $this->getModuleName() ],
'group' );
136 protected function formatGroup( $mixed, array $props,
int $depth = 0 ): array {
137 $params = $this->extractRequestParams();
138 $context = $this->getContext();
145 if ( is_array( $mixed ) ) {
146 $g = array_shift( $mixed );
152 $groupId = $g->getId();
154 if ( isset( $props[
'id'] ) ) {
158 if ( isset( $props[
'label'] ) ) {
159 $a[
'label'] = $g->getLabel( $context );
162 if ( isset( $props[
'description'] ) ) {
163 $a[
'description'] = $g->getDescription( $context );
166 if ( isset( $props[
'class'] ) ) {
167 $a[
'class'] = get_class( $g );
170 if ( isset( $props[
'namespace'] ) ) {
171 $a[
'namespace'] = $g->getNamespace();
174 if ( isset( $props[
'exists'] ) ) {
175 $a[
'exists'] = $g->exists();
178 if ( isset( $props[
'icon'] ) ) {
179 $formats = Utilities::getIcon( $g, $params[
'iconsize'] );
181 $a[
'icon'] = $formats;
185 if ( isset( $props[
'priority'] ) ) {
187 $a[
'priority'] = $priority ?:
'default';
190 if ( isset( $props[
'prioritylangs'] ) ) {
192 $a[
'prioritylangs'] = $prioritylangs ? explode(
',', $prioritylangs ) : false;
195 if ( isset( $props[
'priorityforce'] ) ) {
199 if ( isset( $props[
'workflowstates'] ) ) {
200 $a[
'workflowstates'] = $this->getWorkflowStates( $g );
203 if ( isset( $props[
'sourcelanguage'] ) ) {
204 $a[
'sourcelanguage'] = $g->getSourceLanguage();
207 $this->hookContainer->run(
208 'TranslateProcessAPIMessageGroupsProperties',
209 [ &$a, $props, $params, $g ]
213 if ( $depth >= $params[
'depth'] && $params[
'format'] ===
'tree' ) {
214 $a[
'groupcount'] = count( $subgroups );
221 if ( $subgroups !== [] ) {
222 foreach ( $subgroups as $sg ) {
223 $a[
'groups'][] = $this->
formatGroup( $sg, $props );
225 $result = $this->getResult();
226 $result->setIndexedTagName( $a[
'groups'],
'group' );
237 private function getWorkflowStates(
MessageGroup $group ) {
238 if ( MessageGroups::isDynamic( $group ) ) {
244 if ( !is_array( $stateConfig ) || $stateConfig === [] ) {
248 $user = $this->getUser();
250 foreach ( $stateConfig as $state => $config ) {
251 if ( is_array( $config ) ) {
253 $allowed = $user->isAllowed(
'translate-groupreview' );
255 if ( $allowed && isset( $config[
'right'] ) ) {
256 $allowed = $user->isAllowed( $config[
'right'] );
260 $stateConfig[$state][
'canchange'] = 1;
263 $stateConfig[$state][
'name'] =
264 $this->msg(
"translate-workflow-state-$state" )->text();
271 protected function getAllowedParams(): array {
274 ParamValidator::PARAM_TYPE =>
'integer',
275 ParamValidator::PARAM_DEFAULT => 100,
278 ParamValidator::PARAM_TYPE =>
'string',
279 ParamValidator::PARAM_DEFAULT =>
'',
280 ParamValidator::PARAM_ISMULTI => true,
283 ParamValidator::PARAM_TYPE => [
'flat',
'tree' ],
284 ParamValidator::PARAM_DEFAULT =>
'flat',
287 ParamValidator::PARAM_TYPE =>
'integer',
288 ParamValidator::PARAM_DEFAULT => 64,
291 ParamValidator::PARAM_TYPE => array_keys( $this->getPropertyList() ),
292 ParamValidator::PARAM_DEFAULT =>
'id|label|description|class|exists',
293 ParamValidator::PARAM_ISMULTI => true,
296 ParamValidator::PARAM_TYPE =>
'string',
297 ParamValidator::PARAM_DEFAULT =>
'',
299 'languageFilter' => [
300 ParamValidator::PARAM_TYPE =>
'string',
301 ParamValidator::PARAM_DEFAULT =>
'',
304 $this->hookContainer->run(
'TranslateGetAPIMessageGroupsParameterList', [ &$allowedParams ] );
306 return $allowedParams;
314 private function getPropertyList(): array {
315 $properties = array_flip( [
330 $this->hookContainer->run(
'TranslateGetAPIMessageGroupsPropertyDescs', [ &$properties ] );
335 protected function getExamplesMessages(): array {
337 'action=query&meta=messagegroups' =>
'apihelp-query+messagegroups-example-1',
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
Wraps the translatable page sections into a message group.