Translate extension for MediaWiki
 
Loading...
Searching...
No Matches
DeleteTranslatableBundleSpecialPage.php
1<?php
2declare( strict_types = 1 );
3
4namespace MediaWiki\Extension\Translate\PageTranslation;
5
6use ErrorPageError;
10use MediaWiki\Html\Html;
11use MediaWiki\HTMLForm\HTMLForm;
12use MediaWiki\Output\OutputPage;
13use MediaWiki\Permissions\PermissionManager;
14use MediaWiki\Request\WebRequest;
15use MediaWiki\SpecialPage\UnlistedSpecialPage;
16use MediaWiki\Title\Title;
17use PermissionsError;
18use ReadOnlyError;
19
26class DeleteTranslatableBundleSpecialPage extends UnlistedSpecialPage {
27 // Basic form parameters both as text and as titles
28 private string $text;
29 private ?Title $title;
30 // Other form parameters
32 private string $reason;
34 private bool $doSubpages = false;
36 private ?string $code;
37 private PermissionManager $permissionManager;
38 private TranslatableBundleDeleter $bundleDeleter;
39 private TranslatableBundleFactory $bundleFactory;
40 private string $entityType;
41 private const PAGE_TITLE_MSG = [
42 'messagebundle' => 'pt-deletepage-mb-title',
43 'translatablepage' => 'pt-deletepage-tp-title',
44 'translationpage' => 'pt-deletepage-lang-title'
45 ];
46 private const WRAPPER_LEGEND_MSG = [
47 'messagebundle' => 'pt-deletepage-mb-legend',
48 'translatablepage' => 'pt-deletepage-tp-title',
49 'translationpage' => 'pt-deletepage-tp-legend'
50 ];
51 private const LOG_PAGE = [
52 'messagebundle' => 'Special:Log/messagebundle',
53 'translatablepage' => 'Special:Log/pagetranslation',
54 'translationpage' => 'Special:Log/pagetranslation'
55 ];
56
57 public function __construct(
58 PermissionManager $permissionManager,
59 TranslatableBundleDeleter $bundleDeleter,
60 TranslatableBundleFactory $bundleFactory
61 ) {
62 parent::__construct( 'PageTranslationDeletePage', 'pagetranslation' );
63 $this->permissionManager = $permissionManager;
64 $this->bundleFactory = $bundleFactory;
65 $this->bundleDeleter = $bundleDeleter;
66 }
67
69 public function doesWrites() {
70 return true;
71 }
72
74 public function execute( $par ) {
75 $this->addHelpLink( 'Help:Deletion_and_undeletion' );
76
77 $request = $this->getRequest();
78
79 $par = (string)$par;
80
81 // Yes, the use of getVal() and getText() is wanted, see bug T22365
82 $this->text = $request->getVal( 'wpTitle', $par );
83 $this->title = Title::newFromText( $this->text );
84 $this->reason = $this->getDeleteReason( $request );
85 $this->doSubpages = $request->getBool( 'subpages' );
86
87 if ( !$this->doBasicChecks() ) {
88 return;
89 }
90
91 $out = $this->getOutput();
92
93 // Real stuff starts here
94 $entityType = $this->identifyEntityType();
95 if ( !$entityType ) {
96 throw new ErrorPageError( 'pt-deletepage-invalid-title', 'pt-deletepage-invalid-text' );
97 }
98 $this->entityType = $entityType;
99
100 if ( $this->isTranslation() ) {
101 [ , $this->code ] = Utilities::figureMessage( $this->title->getText() );
102 } else {
103 $this->code = null;
104 }
105
106 $out->setPageTitleMsg(
107 $this->msg( self::PAGE_TITLE_MSG[ $this->entityType ], $this->title->getPrefixedText() )
108 );
109
110 if ( !$this->getUser()->isAllowed( 'pagetranslation' ) ) {
111 throw new PermissionsError( 'pagetranslation' );
112 }
113
114 // Is there really no better way to do this?
115 $subactionText = $request->getText( 'subaction' );
116 switch ( $subactionText ) {
117 case $this->msg( 'pt-deletepage-action-check' )->text():
118 $subaction = 'check';
119 break;
120 case $this->msg( 'pt-deletepage-action-perform' )->text():
121 $subaction = 'perform';
122 break;
123 case $this->msg( 'pt-deletepage-action-other' )->text():
124 $subaction = '';
125 break;
126 default:
127 $subaction = '';
128 }
129
130 if ( $subaction === 'check' && $this->checkToken() && $request->wasPosted() ) {
131 $this->showConfirmation();
132 } elseif ( $subaction === 'perform' && $this->checkToken() && $request->wasPosted() ) {
133 $this->performAction();
134 } else {
135 $this->showForm();
136 }
137 }
138
144 private function doBasicChecks(): bool {
145 // Check rights
146 if ( !$this->userCanExecute( $this->getUser() ) ) {
147 $this->displayRestrictionError();
148 }
149
150 if ( $this->title === null ) {
151 throw new ErrorPageError( 'notargettitle', 'notargettext' );
152 }
153
154 if ( !$this->title->exists() ) {
155 throw new ErrorPageError( 'nopagetitle', 'nopagetext' );
156 }
157
158 $permissionStatus = $this->permissionManager->getPermissionStatus(
159 'delete', $this->getUser(), $this->title
160 );
161 if ( !$permissionStatus->isOK() ) {
162 throw new PermissionsError( 'delete', $permissionStatus );
163 }
164
165 # Check for database lock
166 $this->checkReadOnly();
167
168 // Let the caller know it's safe to continue
169 return true;
170 }
171
176 private function checkToken(): bool {
177 return $this->getContext()->getCsrfTokenSet()->matchTokenField( 'wpEditToken' );
178 }
179
181 private function showForm(): void {
182 $out = $this->getOutput();
183 $out->addBacklinkSubtitle( $this->title );
184 $out->addWikiMsg( 'pt-deletepage-intro', self::LOG_PAGE[ $this->entityType ] );
185
186 $formDescriptor = $this->getCommonFormFields();
187
188 HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
189 ->setAction( $this->getPageTitle( $this->text )->getLocalURL() )
190 ->setSubmitName( 'subaction' )
191 ->setSubmitTextMsg( 'pt-deletepage-action-check' )
192 ->setWrapperLegendMsg( 'pt-deletepage-any-legend' )
193 ->prepareForm()
194 ->displayForm( false );
195 }
196
201 private function showConfirmation(): void {
202 $out = $this->getOutput();
203 $count = 0;
204 $subpageCount = 0;
205
206 $out->addBacklinkSubtitle( $this->title );
207 $out->addWikiMsg( 'pt-deletepage-intro', self::LOG_PAGE[ $this->entityType ] );
208
209 $subpages = $this->bundleDeleter->getPagesForDeletion( $this->title, $this->code, $this->isTranslation() );
210
211 $out->wrapWikiMsg( '== $1 ==', 'pt-deletepage-list-pages' );
212
213 if ( !$this->isTranslation() ) {
214 $count++;
215 $out->addWikiTextAsInterface(
216 $this->getChangeLine( $this->title )
217 );
218 }
219
220 $out->wrapWikiMsg( '=== $1 ===', 'pt-deletepage-list-translation' );
221 $lines = [];
222 foreach ( $subpages[ 'translationPages' ] as $old ) {
223 $count++;
224 $lines[] = $this->getChangeLine( $old );
225 }
226 $this->listPages( $out, $lines );
227
228 $out->wrapWikiMsg( '=== $1 ===', 'pt-deletepage-list-section' );
229
230 $lines = [];
231 foreach ( $subpages[ 'translationUnitPages' ] as $old ) {
232 $count++;
233 $lines[] = $this->getChangeLine( $old );
234 }
235 $this->listPages( $out, $lines );
236
237 if ( Utilities::allowsSubpages( $this->title ) ) {
238 $out->wrapWikiMsg( '=== $1 ===', 'pt-deletepage-list-other' );
239 $subpages = $subpages[ 'normalSubpages' ];
240 $lines = [];
241 foreach ( $subpages as $old ) {
242 $subpageCount++;
243 $lines[] = $this->getChangeLine( $old );
244 }
245 $this->listPages( $out, $lines );
246 }
247
248 $totalPageCount = $count + $subpageCount;
249
250 $out->addWikiTextAsInterface( "----\n" );
251 $out->addWikiMsg(
252 'pt-deletepage-list-count',
253 $this->getLanguage()->formatNum( $totalPageCount ),
254 $this->getLanguage()->formatNum( $subpageCount )
255 );
256
257 $formDescriptor = $this->getCommonFormFields();
258 $formDescriptor['subpages'] = [
259 'type' => 'check',
260 'name' => 'subpages',
261 'id' => 'mw-subpages',
262 'label' => $this->msg( 'pt-deletepage-subpages' )->text(),
263 'default' => $this->doSubpages,
264 ];
265
266 $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() );
267 $htmlForm
268 ->setWrapperLegendMsg(
269 $this->msg( self::WRAPPER_LEGEND_MSG[ $this->entityType ], $this->title->getPrefixedText() )
270 )
271 ->setAction( $this->getPageTitle( $this->text )->getLocalURL() )
272 ->setSubmitTextMsg( 'pt-deletepage-action-perform' )
273 ->setSubmitName( 'subaction' )
274 ->setSubmitDestructive()
275 ->addButton( [
276 'name' => 'subaction',
277 'value' => $this->msg( 'pt-deletepage-action-other' )->text(),
278 ] )
279 ->prepareForm()
280 ->displayForm( false );
281 }
282
284 private function getChangeLine( Title $title ): string {
285 return '* ' . $title->getPrefixedText();
286 }
287
288 private function performAction(): void {
289 $this->bundleDeleter->deleteAsynchronously(
290 $this->title,
291 $this->isTranslation(),
292 $this->getUser(),
293 $this->bundleDeleter->getPagesForDeletion( $this->title, $this->code, $this->isTranslation() ),
294 $this->doSubpages,
295 $this->reason,
296 $this->getContext()->exportSession()
297 );
298
299 $this->getOutput()->addWikiMsg( 'pt-deletepage-started', self::LOG_PAGE[ $this->entityType ] );
300 }
301
302 private function getCommonFormFields(): array {
303 $dropdownOptions = $this->msg( 'deletereason-dropdown' )->inContentLanguage()->text();
304
305 $options = Html::listDropdownOptions(
306 $dropdownOptions,
307 [
308 'other' => $this->msg( 'pt-deletepage-reason-other' )->inContentLanguage()->text()
309 ]
310 );
311
312 return [
313 'wpTitle' => [
314 'type' => 'text',
315 'name' => 'wpTitle',
316 'label-message' => 'pt-deletepage-current',
317 'size' => 30,
318 'default' => $this->title->getPrefixedText(),
319 'readonly' => true,
320 ],
321 'wpDeleteReasonList' => [
322 'type' => 'select',
323 'name' => 'wpDeleteReasonList',
324 'label-message' => 'pt-deletepage-reason',
325 'options' => $options,
326 ],
327 'wpReason' => [
328 'type' => 'text',
329 'name' => 'wpReason',
330 'label-message' => 'pt-deletepage-reason-details',
331 'default' => $this->reason,
332 ]
333 ];
334 }
335
336 private function listPages( OutputPage $out, array $lines ): void {
337 if ( $lines ) {
338 $out->addWikiTextAsInterface( implode( "\n", $lines ) );
339 } else {
340 $out->addWikiMsg( 'pt-deletepage-list-no-pages' );
341 }
342 }
343
344 private function getDeleteReason( WebRequest $request ): string {
345 $dropdownSelection = $request->getText( 'wpDeleteReasonList', 'other' );
346 $reasonInput = $request->getText( 'wpReason' );
347
348 if ( $dropdownSelection === 'other' ) {
349 return $reasonInput;
350 } elseif ( $reasonInput !== '' ) {
351 // Entry from drop down menu + additional comment
352 $separator = $this->msg( 'colon-separator' )->inContentLanguage()->text();
353 return "$dropdownSelection$separator$reasonInput";
354 } else {
355 return $dropdownSelection;
356 }
357 }
358
360 private function identifyEntityType(): ?string {
361 $bundle = $this->bundleFactory->getBundle( $this->title );
362 if ( $bundle ) {
363 if ( $bundle instanceof MessageBundle ) {
364 return 'messagebundle';
365 } else {
366 return 'translatablepage';
367 }
368 } elseif ( TranslatablePage::isTranslationPage( $this->title ) ) {
369 return 'translationpage';
370 }
371
372 return null;
373 }
374
375 private function isTranslation(): bool {
376 return $this->entityType === 'translationpage';
377 }
378}
return[ 'Translate:AggregateGroupManager'=> static function(MediaWikiServices $services):AggregateGroupManager { return new AggregateGroupManager($services->getTitleFactory(), $services->get( 'Translate:MessageGroupMetadata'));}, 'Translate:AggregateGroupMessageGroupFactory'=> static function(MediaWikiServices $services):AggregateGroupMessageGroupFactory { return new AggregateGroupMessageGroupFactory($services->get( 'Translate:MessageGroupMetadata'));}, '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:ExternalMessageSourceStateComparator'=> static function(MediaWikiServices $services):ExternalMessageSourceStateComparator { return new ExternalMessageSourceStateComparator(new SimpleStringComparator(), $services->getRevisionLookup(), $services->getPageStore());}, 'Translate:ExternalMessageSourceStateImporter'=> static function(MediaWikiServices $services):ExternalMessageSourceStateImporter { return new ExternalMessageSourceStateImporter($services->get( 'Translate:GroupSynchronizationCache'), $services->getJobQueueGroup(), LoggerFactory::getInstance(LogNames::GROUP_SYNCHRONIZATION), $services->get( 'Translate:MessageIndex'), $services->getTitleFactory(), $services->get( 'Translate:MessageGroupSubscription'), new ServiceOptions(ExternalMessageSourceStateImporter::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, 'Translate:FileBasedMessageGroupFactory'=> static function(MediaWikiServices $services):FileBasedMessageGroupFactory { return new FileBasedMessageGroupFactory(new MessageGroupConfigurationParser(), $services->getContentLanguageCode() ->toString(), new ServiceOptions(FileBasedMessageGroupFactory::SERVICE_OPTIONS, $services->getMainConfig()),);}, 'Translate:FileFormatFactory'=> static function(MediaWikiServices $services):FileFormatFactory { return new FileFormatFactory( $services->getObjectFactory());}, 'Translate:GroupSynchronizationCache'=> static function(MediaWikiServices $services):GroupSynchronizationCache { return new GroupSynchronizationCache( $services->get( 'Translate:PersistentCache'));}, 'Translate:HookDefinedMessageGroupFactory'=> static function(MediaWikiServices $services):HookDefinedMessageGroupFactory { return new HookDefinedMessageGroupFactory( $services->get( 'Translate:HookRunner'));}, 'Translate:HookRunner'=> static function(MediaWikiServices $services):HookRunner { return new HookRunner( $services->getHookContainer());}, 'Translate:MessageBundleDependencyPurger'=> static function(MediaWikiServices $services):MessageBundleDependencyPurger { return new MessageBundleDependencyPurger( $services->get( 'Translate:TranslatableBundleFactory'));}, 'Translate:MessageBundleMessageGroupFactory'=> static function(MediaWikiServices $services):MessageBundleMessageGroupFactory { return new MessageBundleMessageGroupFactory($services->get( 'Translate:MessageGroupMetadata'), new ServiceOptions(MessageBundleMessageGroupFactory::SERVICE_OPTIONS, $services->getMainConfig()),);}, 'Translate:MessageBundleStore'=> static function(MediaWikiServices $services):MessageBundleStore { return new MessageBundleStore($services->get( 'Translate:RevTagStore'), $services->getJobQueueGroup(), $services->getLanguageNameUtils(), $services->get( 'Translate:MessageIndex'), $services->get( 'Translate:MessageGroupMetadata'));}, 'Translate:MessageBundleTranslationLoader'=> static function(MediaWikiServices $services):MessageBundleTranslationLoader { return new MessageBundleTranslationLoader( $services->getLanguageFallback());}, 'Translate:MessageGroupMetadata'=> static function(MediaWikiServices $services):MessageGroupMetadata { return new MessageGroupMetadata( $services->getConnectionProvider());}, 'Translate:MessageGroupReviewStore'=> static function(MediaWikiServices $services):MessageGroupReviewStore { return new MessageGroupReviewStore($services->getConnectionProvider(), $services->get( 'Translate:HookRunner'));}, 'Translate:MessageGroupStatsTableFactory'=> static function(MediaWikiServices $services):MessageGroupStatsTableFactory { return new MessageGroupStatsTableFactory($services->get( 'Translate:ProgressStatsTableFactory'), $services->getLinkRenderer(), $services->get( 'Translate:MessageGroupReviewStore'), $services->get( 'Translate:MessageGroupMetadata'), $services->getMainConfig() ->get( 'TranslateWorkflowStates') !==false);}, 'Translate:MessageGroupSubscription'=> static function(MediaWikiServices $services):MessageGroupSubscription { return new MessageGroupSubscription($services->get( 'Translate:MessageGroupSubscriptionStore'), $services->getJobQueueGroup(), $services->getUserIdentityLookup(), LoggerFactory::getInstance(LogNames::GROUP_SUBSCRIPTION), new ServiceOptions(MessageGroupSubscription::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, 'Translate:MessageGroupSubscriptionHookHandler'=> static function(MediaWikiServices $services):?MessageGroupSubscriptionHookHandler { if(! $services->getExtensionRegistry() ->isLoaded( 'Echo')) { return null;} return new MessageGroupSubscriptionHookHandler($services->get( 'Translate:MessageGroupSubscription'), $services->getUserFactory());}, 'Translate:MessageGroupSubscriptionStore'=> static function(MediaWikiServices $services):MessageGroupSubscriptionStore { return new MessageGroupSubscriptionStore( $services->getConnectionProvider());}, 'Translate:MessageIndex'=> static function(MediaWikiServices $services):MessageIndex { $params=(array) $services->getMainConfig() ->get( 'TranslateMessageIndex');$class=array_shift( $params);$implementationMap=['HashMessageIndex'=> HashMessageIndex::class, 'CDBMessageIndex'=> CDBMessageIndex::class, 'DatabaseMessageIndex'=> DatabaseMessageIndex::class, 'hash'=> HashMessageIndex::class, 'cdb'=> CDBMessageIndex::class, 'database'=> DatabaseMessageIndex::class,];$messageIndexStoreClass=$implementationMap[$class] ?? $implementationMap['database'];return new MessageIndex(new $messageIndexStoreClass, $services->getMainWANObjectCache(), $services->getJobQueueGroup(), $services->get( 'Translate:HookRunner'), LoggerFactory::getInstance(LogNames::MAIN), $services->getMainObjectStash(), $services->getConnectionProvider(), new ServiceOptions(MessageIndex::SERVICE_OPTIONS, $services->getMainConfig()),);}, '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->getConnectionProvider(), $services->getJsonCodec());}, 'Translate:ProgressStatsTableFactory'=> static function(MediaWikiServices $services):ProgressStatsTableFactory { return new ProgressStatsTableFactory($services->getLinkRenderer(), $services->get( 'Translate:ConfigHelper'), $services->get( 'Translate:MessageGroupMetadata'));}, 'Translate:RevTagStore'=> static function(MediaWikiServices $services):RevTagStore { return new RevTagStore( $services->getConnectionProvider());}, 'Translate:SubpageListBuilder'=> static function(MediaWikiServices $services):SubpageListBuilder { return new SubpageListBuilder($services->get( 'Translate:TranslatableBundleFactory'), $services->getLinkBatchFactory());}, 'Translate:TranslatableBundleDeleter'=> static function(MediaWikiServices $services):TranslatableBundleDeleter { return new TranslatableBundleDeleter($services->getMainObjectStash(), $services->getJobQueueGroup(), $services->get( 'Translate:SubpageListBuilder'), $services->get( 'Translate:TranslatableBundleFactory'));}, 'Translate:TranslatableBundleExporter'=> static function(MediaWikiServices $services):TranslatableBundleExporter { return new TranslatableBundleExporter($services->get( 'Translate:SubpageListBuilder'), $services->getWikiExporterFactory(), $services->getConnectionProvider());}, 'Translate:TranslatableBundleFactory'=> static function(MediaWikiServices $services):TranslatableBundleFactory { return new TranslatableBundleFactory($services->get( 'Translate:TranslatablePageStore'), $services->get( 'Translate:MessageBundleStore'));}, 'Translate:TranslatableBundleImporter'=> static function(MediaWikiServices $services):TranslatableBundleImporter { return new TranslatableBundleImporter($services->getWikiImporterFactory(), $services->get( 'Translate:TranslatablePageParser'), $services->getRevisionLookup(), $services->getNamespaceInfo(), $services->getTitleFactory(), $services->getFormatterFactory());}, '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->getConnectionProvider(), $services->getObjectCacheFactory(), $services->getMainConfig() ->get( 'TranslatePageMoveLimit'));}, 'Translate:TranslatableBundleStatusStore'=> static function(MediaWikiServices $services):TranslatableBundleStatusStore { return new TranslatableBundleStatusStore($services->getConnectionProvider() ->getPrimaryDatabase(), $services->getCollationFactory() ->makeCollation( 'uca-default-u-kn'), $services->getDBLoadBalancer() ->getMaintenanceConnectionRef(DB_PRIMARY));}, 'Translate:TranslatablePageMarker'=> static function(MediaWikiServices $services):TranslatablePageMarker { return new TranslatablePageMarker($services->getConnectionProvider(), $services->getJobQueueGroup(), $services->getLinkRenderer(), MessageGroups::singleton(), $services->get( 'Translate:MessageIndex'), $services->getTitleFormatter(), $services->getTitleParser(), $services->get( 'Translate:TranslatablePageParser'), $services->get( 'Translate:TranslatablePageStore'), $services->get( 'Translate:TranslatablePageStateStore'), $services->get( 'Translate:TranslationUnitStoreFactory'), $services->get( 'Translate:MessageGroupMetadata'), $services->getWikiPageFactory(), $services->get( 'Translate:TranslatablePageView'), $services->get( 'Translate:MessageGroupSubscription'), $services->getFormatterFactory(), $services->get( 'Translate:HookRunner'),);}, 'Translate:TranslatablePageMessageGroupFactory'=> static function(MediaWikiServices $services):TranslatablePageMessageGroupFactory { return new TranslatablePageMessageGroupFactory(new ServiceOptions(TranslatablePageMessageGroupFactory::SERVICE_OPTIONS, $services->getMainConfig()),);}, 'Translate:TranslatablePageParser'=> static function(MediaWikiServices $services):TranslatablePageParser { return new TranslatablePageParser($services->get( 'Translate:ParsingPlaceholderFactory'));}, 'Translate:TranslatablePageStateStore'=> static function(MediaWikiServices $services):TranslatablePageStateStore { return new TranslatablePageStateStore($services->get( 'Translate:PersistentCache'), $services->getPageStore());}, 'Translate:TranslatablePageStore'=> static function(MediaWikiServices $services):TranslatablePageStore { return new TranslatablePageStore($services->get( 'Translate:MessageIndex'), $services->getJobQueueGroup(), $services->get( 'Translate:RevTagStore'), $services->getConnectionProvider(), $services->get( 'Translate:TranslatableBundleStatusStore'), $services->get( 'Translate:TranslatablePageParser'), $services->get( 'Translate:MessageGroupMetadata'));}, 'Translate:TranslatablePageView'=> static function(MediaWikiServices $services):TranslatablePageView { return new TranslatablePageView($services->getConnectionProvider(), $services->get( 'Translate:TranslatablePageStateStore'), new ServiceOptions(TranslatablePageView::SERVICE_OPTIONS, $services->getMainConfig()));}, 'Translate:TranslateSandbox'=> static function(MediaWikiServices $services):TranslateSandbox { return new TranslateSandbox($services->getUserFactory(), $services->getConnectionProvider(), $services->getPermissionManager(), $services->getAuthManager(), $services->getUserGroupManager(), $services->getActorStore(), $services->getUserOptionsManager(), $services->getJobQueueGroup(), $services->get( 'Translate:HookRunner'), new ServiceOptions(TranslateSandbox::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, 'Translate:TranslationStashReader'=> static function(MediaWikiServices $services):TranslationStashReader { return new TranslationStashStorage( $services->getConnectionProvider() ->getPrimaryDatabase());}, 'Translate:TranslationStatsDataProvider'=> static function(MediaWikiServices $services):TranslationStatsDataProvider { return new TranslationStatsDataProvider(new ServiceOptions(TranslationStatsDataProvider::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getObjectFactory(), $services->getConnectionProvider());}, '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);}, 'Translate:WorkflowStatesMessageGroupLoader'=> static function(MediaWikiServices $services):WorkflowStatesMessageGroupLoader { return new WorkflowStatesMessageGroupLoader(new ServiceOptions(WorkflowStatesMessageGroupLoader::CONSTRUCTOR_OPTIONS, $services->getMainConfig()),);},]
@phpcs-require-sorted-array
Create instances of various classes based on the type of TranslatableBundle.
figureMessage()
Recommended to use getCode and getKey instead.
Special page which enables deleting translations of translatable bundles and translation pages.
Contains the core logic to delete translatable bundles or translation pages.
Essentially random collection of helper functions, similar to GlobalFunctions.php.
Definition Utilities.php:29