Translate extension for MediaWiki
 
Loading...
Searching...
No Matches
Utilities.php
1<?php
2declare( strict_types = 1 );
3
5
6use MediaWiki\Config\ConfigException;
7use MediaWiki\Content\Content;
8use MediaWiki\Content\TextContent;
9use MediaWiki\Context\RequestContext;
14use MediaWiki\Language\LanguageCode;
15use MediaWiki\Languages\LanguageNameUtils;
16use MediaWiki\MediaWikiServices;
17use MediaWiki\Revision\SlotRecord;
18use MediaWiki\Title\Title;
19use MediaWiki\Xml\Xml;
20use MessageGroup;
21use UnexpectedValueException;
22use Wikimedia\Rdbms\IDatabase;
23
29class Utilities {
38 public static function title( string $message, string $code, int $ns = NS_MEDIAWIKI ): string {
39 // Cache some amount of titles for speed.
40 static $cache = [];
41 $key = $ns . ':' . $message;
42
43 if ( !isset( $cache[$key] ) ) {
44 $cache[$key] = Title::capitalize( $message, $ns );
45 }
46
47 if ( $code ) {
48 return $cache[$key] . '/' . $code;
49 } else {
50 return $cache[$key];
51 }
52 }
53
60 public static function figureMessage( string $text ): array {
61 $pos = strrpos( $text, '/' );
62 $code = substr( $text, $pos + 1 );
63 $key = substr( $text, 0, $pos );
64
65 return [ $key, $code ];
66 }
67
75 public static function getMessageContent( string $key, string $language, int $namespace = NS_MEDIAWIKI ): ?string {
76 $title = self::title( $key, $language, $namespace );
77 $data = self::getContents( [ $title ], $namespace );
78
79 return $data[$title][0] ?? null;
80 }
81
90 public static function getContents( $titles, int $namespace ): array {
91 $mwServices = MediaWikiServices::getInstance();
92 $dbr = $mwServices->getConnectionProvider()->getReplicaDatabase();
93 $revStore = $mwServices->getRevisionStore();
94 $titleContents = [];
95
96 $rows = $revStore->newSelectQueryBuilder( $dbr )
97 ->joinPage()
98 ->joinComment()
99 ->where( [ 'page_namespace' => $namespace, 'page_title' => $titles, 'page_latest=rev_id' ] )
100 ->caller( __METHOD__ )
101 ->fetchResultSet();
102
103 $revisions = $revStore->newRevisionsFromBatch( $rows, [
104 'slots' => true,
105 'content' => true
106 ] )->getValue();
107
108 foreach ( $rows as $row ) {
109 $content = $revisions[$row->rev_id]?->getContent( SlotRecord::MAIN );
110 if ( $content instanceof TextContent ) {
111 $titleContents[$row->page_title] = [
112 $content->getText(),
113 $row->rev_user_text
114 ];
115 }
116 }
117
118 $rows->free();
119
120 return $titleContents;
121 }
122
129 public static function getContentForTitle( Title $title, bool $addFuzzy = false ): ?string {
130 $store = MediaWikiServices::getInstance()->getRevisionStore();
131 $revision = $store->getRevisionByTitle( $title );
132
133 if ( $revision === null ) {
134 return null;
135 }
136
137 $content = $revision->getContent( SlotRecord::MAIN );
138 $wiki = ( $content instanceof TextContent ) ? $content->getText() : null;
139
140 // Either unexpected content type, or the revision content is hidden
141 if ( $wiki === null ) {
142 return null;
143 }
144
145 if ( $addFuzzy ) {
146 $handle = new MessageHandle( $title );
147 if ( $handle->isFuzzy() ) {
148 $wiki = TRANSLATE_FUZZY . str_replace( TRANSLATE_FUZZY, '', $wiki );
149 }
150 }
151
152 return $wiki;
153 }
154
155 /* Some other helpers for output */
156
163 public static function getLanguageName( string $code, ?string $language = 'en' ): string {
164 $languages = self::getLanguageNames( $language );
165 return $languages[$code] ?? $code;
166 }
167
175 public static function getLanguageNames( ?string $code ): array {
176 $mwServices = MediaWikiServices::getInstance();
177 $languageNames = $mwServices->getLanguageNameUtils()->getLanguageNames( $code );
178
179 $deprecatedCodes = LanguageCode::getDeprecatedCodeMapping();
180 foreach ( array_keys( $deprecatedCodes ) as $deprecatedCode ) {
181 unset( $languageNames[ $deprecatedCode ] );
182 }
183 Services::getInstance()->getHookRunner()->onTranslateSupportedLanguages( $languageNames, $code );
184
185 return $languageNames;
186 }
187
195 public static function fieldset( string $legend, string $contents, array $attributes = [] ): string {
196 return Xml::openElement( 'fieldset', $attributes ) .
197 Xml::tags( 'legend', null, $legend ) . $contents .
198 Xml::closeElement( 'fieldset' );
199 }
200
212 public static function convertWhiteSpaceToHTML( string $message ): string {
213 $msg = htmlspecialchars( $message );
214 $msg = preg_replace( '/^ /m', '&#160;', $msg );
215 $msg = preg_replace( '/ $/m', '&#160;', $msg );
216 $msg = preg_replace( '/ /', '&#160; ', $msg );
217 $msg = str_replace( "\n", '<br />', $msg );
218
219 return $msg;
220 }
221
227 public static function cacheFile( string $filename ): string {
228 global $wgTranslateCacheDirectory, $wgCacheDirectory;
229
230 if ( $wgTranslateCacheDirectory !== false ) {
231 $dir = $wgTranslateCacheDirectory;
232 } elseif ( $wgCacheDirectory !== false ) {
233 $dir = $wgCacheDirectory;
234 } else {
235 throw new ConfigException( "\$wgCacheDirectory must be configured" );
236 }
237
238 return "$dir/$filename";
239 }
240
242 public static function getPlaceholder(): string {
243 static $i = 0;
244
245 return "\x7fUNIQ" . dechex( mt_rand( 0, 0x7fffffff ) ) .
246 dechex( mt_rand( 0, 0x7fffffff ) ) . '-' . $i++;
247 }
248
255 public static function getIcon( MessageGroup $g, int $size ): ?array {
256 $icon = $g->getIcon();
257 if ( !$icon || substr( $icon, 0, 7 ) !== 'wiki://' ) {
258 return null;
259 }
260
261 $formats = [];
262
263 $filename = substr( $icon, 7 );
264 $file = MediaWikiServices::getInstance()->getRepoGroup()->findFile( $filename );
265 if ( !$file ) {
266 wfWarn( "Unknown message group icon file $icon" );
267
268 return null;
269 }
270
271 if ( $file->isVectorized() ) {
272 $formats['vector'] = $file->getFullUrl();
273 }
274
275 $formats['raster'] = $file->createThumb( $size, $size );
276
277 return $formats;
278 }
279
286 public static function getSafeReadDB(): IDatabase {
287 $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
288 $index = self::shouldReadFromPrimary() ? DB_PRIMARY : DB_REPLICA;
289
290 return $lb->getConnection( $index );
291 }
292
294 public static function shouldReadFromPrimary(): bool {
295 $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
296 // Parsing APIs need POST for payloads but are read-only, so avoid spamming
297 // the primary then. No good way to check this at the moment...
298 if ( PageTranslationHooks::$renderingContext ) {
299 return false;
300 }
301
302 return PHP_SAPI === 'cli' ||
303 RequestContext::getMain()->getRequest()->wasPosted() ||
304 $lb->hasOrMadeRecentPrimaryChanges();
305 }
306
314 public static function getEditorUrl( MessageHandle $handle, string $action_source = '' ): string {
315 if ( !$handle->isValid() ) {
316 return $handle->getTitle()->getLocalURL( [ 'action' => 'edit' ] );
317 }
318
319 $title = MediaWikiServices::getInstance()
320 ->getSpecialPageFactory()->getPage( 'Translate' )->getPageTitle();
321 $urlParameters = [
322 'showMessage' => $handle->getInternalKey(),
323 'group' => $handle->getGroup()->getId(),
324 'language' => $handle->getCode(),
325 ];
326
327 if ( $action_source !== '' ) {
328 $urlParameters[ 'action_source' ] = $action_source;
329 }
330
331 return $title->getFullURL( $urlParameters );
332 }
333
338 public static function serialize( $value ): string {
339 return serialize( $value );
340 }
341
346 public static function deserialize( string $str, array $opts = [ 'allowed_classes' => false ] ) {
347 return unserialize( $str, $opts );
348 }
349
350 public static function getVersion(): string {
351 // Avoid parsing JSON multiple time per request
352 static $version = null;
353 $version ??= json_decode( file_get_contents( __DIR__ . '../../../extension.json' ) )->version;
354 return $version;
355 }
356
364 public static function allowsSubpages( Title $title ): bool {
365 $mwInstance = MediaWikiServices::getInstance();
366 $namespaceInfo = $mwInstance->getNamespaceInfo();
367 return $namespaceInfo->hasSubpages( $title->getNamespace() );
368 }
369
376 public static function isSupportedLanguageCode( string $code ): bool {
377 $all = self::getLanguageNames( LanguageNameUtils::AUTONYMS );
378 return isset( $all[ $code ] );
379 }
380
381 public static function getTextFromTextContent( ?Content $content ): string {
382 if ( !$content ) {
383 throw new UnexpectedValueException( 'Expected $content to be TextContent, got null instead.' );
384 }
385
386 if ( $content instanceof TextContent ) {
387 return $content->getText();
388 }
389
390 throw new UnexpectedValueException( 'Expected $content to be TextContent, but got ' . get_class( $content ) );
391 }
392
399 public static function getTranslations( MessageHandle $handle ): array {
400 $namespace = $handle->getTitle()->getNamespace();
401 $base = $handle->getKey();
402
403 $dbr = MediaWikiServices::getInstance()->getConnectionProvider()->getReplicaDatabase();
404
405 $titles = $dbr->newSelectQueryBuilder()
406 ->select( 'page_title' )
407 ->from( 'page' )
408 ->where( [
409 'page_namespace' => $namespace,
410 'page_title ' . $dbr->buildLike( "$base/", $dbr->anyString() ),
411 ] )
412 ->caller( __METHOD__ )
413 ->orderBy( 'page_title' )
414 ->fetchFieldValues();
415
416 if ( $titles === [] ) {
417 return [];
418 }
419
420 return self::getContents( $titles, $namespace );
421 }
422
423 public static function isTranslationPage( MessageHandle $handle ): bool {
424 // FIXME: A lot of this code is similar to TranslatablePage::isTranslationPage.
425 // See if they can be merged
426 // The major difference is that this method does not run a database query to check if
427 // the page is marked.
428 $key = $handle->getKey();
429 $languageCode = $handle->getCode();
430 if ( $key === '' || $languageCode === '' ) {
431 return false;
432 }
433
434 $baseTitle = Title::makeTitle( $handle->getTitle()->getNamespace(), $key );
435 if ( !TranslatablePage::isSourcePage( $baseTitle ) ) {
436 return false;
437 }
438
439 static $codes = null;
440 $codes ??= self::getLanguageNames( LanguageNameUtils::AUTONYMS );
441
442 return !$handle->isDoc() && isset( $codes[ $languageCode ] );
443 }
444}
445
446class_alias( Utilities::class, 'TranslateUtils' );
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
Class for pointing to messages, like Title class is for titles.
getKey()
Returns the identified or guessed message key.
isDoc()
Determine whether the current handle is for message documentation.
Mixed bag of methods related to translatable pages.
Minimal service container.
Definition Services.php:60
Essentially random collection of helper functions, similar to GlobalFunctions.php.
Definition Utilities.php:29
static getPlaceholder()
Returns a random string that can be used as placeholder in strings.
static allowsSubpages(Title $title)
Checks if the namespace that the title belongs to allows subpages.
static getIcon(MessageGroup $g, int $size)
Get URLs for icons if available.
static getMessageContent(string $key, string $language, int $namespace=NS_MEDIAWIKI)
Loads page content without side effects.
Definition Utilities.php:75
static getLanguageName(string $code, ?string $language='en')
Returns a localised language name.
static fieldset(string $legend, string $contents, array $attributes=[])
Constructs a fieldset with contents.
static isSupportedLanguageCode(string $code)
Checks whether a language code is supported for translation at the wiki level.
static getTranslations(MessageHandle $handle)
Returns all translations of a given message.
static getContentForTitle(Title $title, bool $addFuzzy=false)
Returns the content for a given title and adds the fuzzy tag if requested.
static getSafeReadDB()
Get a DB handle suitable for read and read-for-write cases.
static getContents( $titles, int $namespace)
Fetches contents for pagenames in given namespace without side effects.
Definition Utilities.php:90
static shouldReadFromPrimary()
Check whether primary should be used for reads to avoid reading stale data.
static getEditorUrl(MessageHandle $handle, string $action_source='')
Get a URL that points to an editor for this message handle.
static serialize( $value)
Serialize the given value.
static cacheFile(string $filename)
Gets the path for cache files.
static convertWhiteSpaceToHTML(string $message)
Escapes the message, and does some mangling to whitespace, so that it is preserved when outputted as-...
static deserialize(string $str, array $opts=[ 'allowed_classes'=> false])
Deserialize the given string.
static title(string $message, string $code, int $ns=NS_MEDIAWIKI)
Does quick normalisation of message name so that in can be looked from the database.
Definition Utilities.php:38
static figureMessage(string $text)
Splits page name into message key and language code.
Definition Utilities.php:60
static getLanguageNames(?string $code)
Get translated language names for the languages generally supported for translation in the current wi...
Interface for message groups.