Translate extension for MediaWiki
 
Loading...
Searching...
No Matches
Utilities.php
1<?php
2declare( strict_types = 1 );
3
5
6use ConfigException;
7use Content;
8use LanguageCode;
13use MediaWiki\Languages\LanguageNameUtils;
14use MediaWiki\MediaWikiServices;
15use MediaWiki\Revision\RevisionRecord;
16use MediaWiki\Revision\SlotRecord;
17use MediaWiki\Title\Title;
18use MessageGroup;
19use RequestContext;
20use TextContent;
21use UnexpectedValueException;
22use Wikimedia\Rdbms\IDatabase;
23use Xml;
24use XmlSelect;
25
31class Utilities {
40 public static function title( string $message, string $code, int $ns = NS_MEDIAWIKI ): string {
41 // Cache some amount of titles for speed.
42 static $cache = [];
43 $key = $ns . ':' . $message;
44
45 if ( !isset( $cache[$key] ) ) {
46 $cache[$key] = Title::capitalize( $message, $ns );
47 }
48
49 if ( $code ) {
50 return $cache[$key] . '/' . $code;
51 } else {
52 return $cache[$key];
53 }
54 }
55
62 public static function figureMessage( string $text ): array {
63 $pos = strrpos( $text, '/' );
64 $code = substr( $text, $pos + 1 );
65 $key = substr( $text, 0, $pos );
66
67 return [ $key, $code ];
68 }
69
77 public static function getMessageContent( string $key, string $language, int $namespace = NS_MEDIAWIKI ): ?string {
78 $title = self::title( $key, $language, $namespace );
79 $data = self::getContents( [ $title ], $namespace );
80
81 return $data[$title][0] ?? null;
82 }
83
92 public static function getContents( $titles, int $namespace ): array {
93 $mwServices = MediaWikiServices::getInstance();
94 $dbr = $mwServices->getDBLoadBalancer()->getConnection( DB_REPLICA );
95 $revStore = $mwServices->getRevisionStore();
96 $titleContents = [];
97
98 $rows = $revStore->newSelectQueryBuilder( $dbr )
99 ->joinPage()
100 ->joinComment()
101 ->where( [ 'page_namespace' => $namespace, 'page_title' => $titles, 'page_latest=rev_id' ] )
102 ->caller( __METHOD__ )
103 ->fetchResultSet();
104
105 $revisions = $revStore->newRevisionsFromBatch( $rows, [
106 'slots' => true,
107 'content' => true
108 ] )->getValue();
109
110 foreach ( $rows as $row ) {
112 $rev = $revisions[$row->rev_id];
113 if ( $rev ) {
115 $content = $rev->getContent( SlotRecord::MAIN );
116 if ( $content ) {
117 $titleContents[$row->page_title] = [
118 $content->getText(),
119 $row->rev_user_text
120 ];
121 }
122 }
123 }
124
125 $rows->free();
126
127 return $titleContents;
128 }
129
136 public static function getContentForTitle( Title $title, bool $addFuzzy = false ): ?string {
137 $store = MediaWikiServices::getInstance()->getRevisionStore();
138 $revision = $store->getRevisionByTitle( $title );
139
140 if ( $revision === null ) {
141 return null;
142 }
143
144 $content = $revision->getContent( SlotRecord::MAIN );
145 $wiki = ( $content instanceof TextContent ) ? $content->getText() : null;
146
147 // Either unexpected content type, or the revision content is hidden
148 if ( $wiki === null ) {
149 return null;
150 }
151
152 if ( $addFuzzy ) {
153 $handle = new MessageHandle( $title );
154 if ( $handle->isFuzzy() ) {
155 $wiki = TRANSLATE_FUZZY . str_replace( TRANSLATE_FUZZY, '', $wiki );
156 }
157 }
158
159 return $wiki;
160 }
161
162 /* Some other helpers for output */
163
170 public static function getLanguageName( string $code, ?string $language = 'en' ): string {
171 $languages = self::getLanguageNames( $language );
172 return $languages[$code] ?? $code;
173 }
174
181 public static function getLanguageSelector( $language, ?string $labelOption = null ) {
182 $languages = self::getLanguageNames( $language );
183 ksort( $languages );
184
185 $selector = new XmlSelect();
186 if ( $labelOption !== null ) {
187 $selector->addOption( $labelOption, '-' );
188 }
189
190 foreach ( $languages as $code => $name ) {
191 $selector->addOption( "$code - $name", $code );
192 }
193
194 return $selector;
195 }
196
204 public static function getLanguageNames( ?string $code ): array {
205 $mwServices = MediaWikiServices::getInstance();
206 $languageNames = $mwServices->getLanguageNameUtils()->getLanguageNames( $code );
207
208 $deprecatedCodes = LanguageCode::getDeprecatedCodeMapping();
209 foreach ( array_keys( $deprecatedCodes ) as $deprecatedCode ) {
210 unset( $languageNames[ $deprecatedCode ] );
211 }
212 Services::getInstance()->getHookRunner()->onTranslateSupportedLanguages( $languageNames, $code );
213
214 return $languageNames;
215 }
216
224 public static function fieldset( string $legend, string $contents, array $attributes = [] ): string {
225 return Xml::openElement( 'fieldset', $attributes ) .
226 Xml::tags( 'legend', null, $legend ) . $contents .
227 Xml::closeElement( 'fieldset' );
228 }
229
241 public static function convertWhiteSpaceToHTML( string $message ): string {
242 $msg = htmlspecialchars( $message );
243 $msg = preg_replace( '/^ /m', '&#160;', $msg );
244 $msg = preg_replace( '/ $/m', '&#160;', $msg );
245 $msg = preg_replace( '/ /', '&#160; ', $msg );
246 $msg = str_replace( "\n", '<br />', $msg );
247
248 return $msg;
249 }
250
256 public static function cacheFile( string $filename ): string {
257 global $wgTranslateCacheDirectory, $wgCacheDirectory;
258
259 if ( $wgTranslateCacheDirectory !== false ) {
260 $dir = $wgTranslateCacheDirectory;
261 } elseif ( $wgCacheDirectory !== false ) {
262 $dir = $wgCacheDirectory;
263 } else {
264 throw new ConfigException( "\$wgCacheDirectory must be configured" );
265 }
266
267 return "$dir/$filename";
268 }
269
271 public static function getPlaceholder(): string {
272 static $i = 0;
273
274 return "\x7fUNIQ" . dechex( mt_rand( 0, 0x7fffffff ) ) .
275 dechex( mt_rand( 0, 0x7fffffff ) ) . '-' . $i++;
276 }
277
284 public static function getIcon( MessageGroup $g, int $size ): ?array {
285 $icon = $g->getIcon();
286 if ( !$icon || substr( $icon, 0, 7 ) !== 'wiki://' ) {
287 return null;
288 }
289
290 $formats = [];
291
292 $filename = substr( $icon, 7 );
293 $file = MediaWikiServices::getInstance()->getRepoGroup()->findFile( $filename );
294 if ( !$file ) {
295 wfWarn( "Unknown message group icon file $icon" );
296
297 return null;
298 }
299
300 if ( $file->isVectorized() ) {
301 $formats['vector'] = $file->getFullUrl();
302 }
303
304 $formats['raster'] = $file->createThumb( $size, $size );
305
306 return $formats;
307 }
308
315 public static function getSafeReadDB(): IDatabase {
316 $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
317 $index = self::shouldReadFromPrimary() ? DB_PRIMARY : DB_REPLICA;
318
319 return $lb->getConnection( $index );
320 }
321
323 public static function shouldReadFromPrimary(): bool {
324 $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
325 // Parsing APIs need POST for payloads but are read-only, so avoid spamming
326 // the primary then. No good way to check this at the moment...
327 if ( PageTranslationHooks::$renderingContext ) {
328 return false;
329 }
330
331 return PHP_SAPI === 'cli' ||
332 RequestContext::getMain()->getRequest()->wasPosted() ||
333 $lb->hasOrMadeRecentPrimaryChanges();
334 }
335
341 public static function getEditorUrl( MessageHandle $handle ): string {
342 if ( !$handle->isValid() ) {
343 return $handle->getTitle()->getLocalURL( [ 'action' => 'edit' ] );
344 }
345
346 $title = MediaWikiServices::getInstance()
347 ->getSpecialPageFactory()->getPage( 'Translate' )->getPageTitle();
348 return $title->getFullURL( [
349 'showMessage' => $handle->getInternalKey(),
350 'group' => $handle->getGroup()->getId(),
351 'language' => $handle->getCode(),
352 ] );
353 }
354
359 public static function serialize( $value ): string {
360 return serialize( $value );
361 }
362
367 public static function deserialize( string $str, array $opts = [ 'allowed_classes' => false ] ) {
368 return unserialize( $str, $opts );
369 }
370
371 public static function getVersion(): string {
372 // Avoid parsing JSON multiple time per request
373 static $version = null;
374 if ( $version === null ) {
375 $version = json_decode( file_get_contents( __DIR__ . '../../../extension.json' ) )->version;
376 }
377 return $version;
378 }
379
387 public static function allowsSubpages( Title $title ): bool {
388 $mwInstance = MediaWikiServices::getInstance();
389 $namespaceInfo = $mwInstance->getNamespaceInfo();
390 return $namespaceInfo->hasSubpages( $title->getNamespace() );
391 }
392
399 public static function isSupportedLanguageCode( string $code ): bool {
400 $all = self::getLanguageNames( LanguageNameUtils::AUTONYMS );
401 return isset( $all[ $code ] );
402 }
403
404 public static function getTextFromTextContent( ?Content $content ): string {
405 if ( !$content ) {
406 throw new UnexpectedValueException( 'Expected $content to be TextContent, got null instead.' );
407 }
408
409 if ( $content instanceof TextContent ) {
410 return $content->getText();
411 }
412
413 throw new UnexpectedValueException( 'Expected $content to be TextContent, but got ' . get_class( $content ) );
414 }
415
422 public static function getTranslations( MessageHandle $handle ): array {
423 $namespace = $handle->getTitle()->getNamespace();
424 $base = $handle->getKey();
425
426 $dbr = MediaWikiServices::getInstance()
427 ->getDBLoadBalancer()
428 ->getConnection( DB_REPLICA );
429
430 $titles = $dbr->newSelectQueryBuilder()
431 ->select( 'page_title' )
432 ->from( 'page' )
433 ->where( [
434 'page_namespace' => $namespace,
435 'page_title ' . $dbr->buildLike( "$base/", $dbr->anyString() ),
436 ] )
437 ->caller( __METHOD__ )
438 ->orderBy( 'page_title' )
439 ->fetchFieldValues();
440
441 if ( $titles === [] ) {
442 return [];
443 }
444
445 return self::getContents( $titles, $namespace );
446 }
447
448 public static function isTranslationPage( MessageHandle $handle ): bool {
449 // FIXME: A lot of this code is similar to TranslatablePage::isTranslationPage.
450 // See if they can be merged
451 // The major difference is that this method does not run a database query to check if
452 // the page is marked.
453 $key = $handle->getKey();
454 $languageCode = $handle->getCode();
455 if ( $key === '' || $languageCode === '' ) {
456 return false;
457 }
458
459 $baseTitle = Title::makeTitle( $handle->getTitle()->getNamespace(), $key );
460 if ( !TranslatablePage::isSourcePage( $baseTitle ) ) {
461 return false;
462 }
463
464 static $codes = null;
465 if ( $codes === null ) {
466 $codes = self::getLanguageNames( LanguageNameUtils::AUTONYMS );
467 }
468
469 return !$handle->isDoc() && isset( $codes[ $languageCode ] );
470 }
471}
472
473class_alias( Utilities::class, 'TranslateUtils' );
return[ 'Translate:AggregateGroupManager'=> static function(MediaWikiServices $services):AggregateGroupManager { return new AggregateGroupManager( $services->getTitleFactory());}, '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( 'Translate.GroupSynchronization'), $services->get( 'Translate:MessageIndex'), $services->getTitleFactory(), new ServiceOptions(ExternalMessageSourceStateImporter::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, 'Translate:FileBasedMessageGroupFactory'=> static function(MediaWikiServices $services):FileBasedMessageGroupFactory { return new FileBasedMessageGroupFactory(new MessageGroupConfigurationParser(), 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: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->getDBLoadBalancer());}, 'Translate:MessageGroupReviewStore'=> static function(MediaWikiServices $services):MessageGroupReviewStore { return new MessageGroupReviewStore($services->getDBLoadBalancer(), $services->get( 'Translate:HookRunner'));}, 'Translate:MessageGroupStatsTableFactory'=> static function(MediaWikiServices $services):MessageGroupStatsTableFactory { return new MessageGroupStatsTableFactory($services->get( 'Translate:ProgressStatsTableFactory'), $services->getDBLoadBalancer(), $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( 'Translate.MessageGroupSubscription'), new ServiceOptions(MessageGroupSubscription::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, 'Translate:MessageGroupSubscriptionHookHandler'=> static function(MediaWikiServices $services):MessageGroupSubscriptionHookHandler { return new MessageGroupSubscriptionHookHandler($services->get( 'Translate:MessageGroupSubscription'), $services->getUserFactory());}, 'Translate:MessageGroupSubscriptionStore'=> static function(MediaWikiServices $services):MessageGroupSubscriptionStore { return new MessageGroupSubscriptionStore( $services->getDBLoadBalancerFactory());}, '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( 'Translate'), $services->getMainObjectStash(), $services->getDBLoadBalancerFactory(), $services->get( 'Translate:MessageGroupSubscription'), 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->getDBLoadBalancer(), $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->getDBLoadBalancer());}, '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->getDBLoadBalancer());}, '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());}, '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->getDBLoadBalancerFactory(), $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:TranslatablePageMarker'=> static function(MediaWikiServices $services):TranslatablePageMarker { return new TranslatablePageMarker($services->getDBLoadBalancer(), $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'));}, '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->getDBLoadBalancer(), $services->get( 'Translate:TranslatableBundleStatusStore'), $services->get( 'Translate:TranslatablePageParser'), $services->get( 'Translate:MessageGroupMetadata'));}, 'Translate:TranslatablePageView'=> static function(MediaWikiServices $services):TranslatablePageView { return new TranslatablePageView($services->getDBLoadBalancerFactory(), $services->get( 'Translate:TranslatablePageStateStore'), new ServiceOptions(TranslatablePageView::SERVICE_OPTIONS, $services->getMainConfig()));}, 'Translate:TranslateSandbox'=> static function(MediaWikiServices $services):TranslateSandbox { return new TranslateSandbox($services->getUserFactory(), $services->getDBLoadBalancer(), $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 { $db=$services->getDBLoadBalancer() ->getConnection(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(), $services->getDBLoadBalancer());}, '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
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:58
Essentially random collection of helper functions, similar to GlobalFunctions.php.
Definition Utilities.php:31
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:77
static getLanguageName(string $code, ?string $language='en')
Returns a localised language name.
static getEditorUrl(MessageHandle $handle)
Get a URL that points to an editor for this message handle.
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:92
static shouldReadFromPrimary()
Check whether primary should be used for reads to avoid reading stale data.
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:40
static getLanguageSelector( $language, ?string $labelOption=null)
Standard language selector in Translate extension.
static figureMessage(string $text)
Splits page name into message key and language code.
Definition Utilities.php:62
static getLanguageNames(?string $code)
Get translated language names for the languages generally supported for translation in the current wi...
Interface for message groups.