Translate extension for MediaWiki
 
Loading...
Searching...
No Matches
RecentMessageGroup.php
Go to the documentation of this file.
1<?php
13
19 /*
20 * Yes this is very ugly hack and should not be removed.
21 * @see \MediaWiki\Extension\Translate\MessageLoading\MessageCollection::getPages()
22 */
23 protected $namespace = false;
24 protected $language;
25
30 public function __construct() {
31 }
32
33 public function setLanguage( $code ) {
34 $this->language = $code;
35 }
36
37 public function getId() {
38 return '!recent';
39 }
40
41 public function getLabel( IContextSource $context = null ) {
42 $msg = wfMessage( 'translate-dynagroup-recent-label' );
43 $msg = self::addContext( $msg, $context );
44
45 return $msg->plain();
46 }
47
48 public function getDescription( IContextSource $context = null ) {
49 $msg = wfMessage( 'translate-dynagroup-recent-desc' );
50 $msg = self::addContext( $msg, $context );
51
52 return $msg->plain();
53 }
54
55 protected function getRCCutoff() {
56 $db = wfGetDB( DB_REPLICA );
57 $tables = 'recentchanges';
58 $max = $db->selectField( $tables, 'MAX(rc_id)', [], __METHOD__ );
59
60 return max( 0, $max - 50000 );
61 }
62
67 protected function getQueryConditions() {
68 global $wgTranslateMessageNamespaces;
69 $db = wfGetDB( DB_REPLICA );
70 $conds = [
71 'rc_title ' . $db->buildLike( $db->anyString(), '/' . $this->language ),
72 'rc_namespace' => $wgTranslateMessageNamespaces,
73 'rc_type != ' . RC_LOG,
74 'rc_id > ' . $this->getRCCutoff(),
75 ];
76
77 return $conds;
78 }
79
87 protected function matchingMessage( MessageHandle $handle ): bool {
88 return MessageGroups::isTranslatableMessage( $handle, $this->language );
89 }
90
91 public function getDefinitions() {
92 if ( !$this->language ) {
93 throw new BadMethodCallException( 'Language not set' );
94 }
95
96 $db = wfGetDB( DB_REPLICA );
97
98 $rcQuery = RecentChange::getQueryInfo();
99 $tables = $rcQuery['tables'];
100 $joins = $rcQuery['joins'];
101
102 $fields = [ 'rc_namespace', 'rc_title' ];
103 $conds = $this->getQueryConditions();
104 $options = [
105 'ORDER BY' => 'rc_id DESC',
106 'LIMIT' => 5000
107 ];
108 $res = $db->select( $tables, $fields, $conds, __METHOD__, $options, $joins );
109
110 $defs = [];
111 foreach ( $res as $row ) {
112 $title = Title::makeTitle( $row->rc_namespace, $row->rc_title );
113 $handle = new MessageHandle( $title );
114
115 if ( !$this->matchingMessage( $handle ) ) {
116 continue;
117 }
118
119 $messageKey = $handle->getKey();
120 $fullKey = $row->rc_namespace . ':' . $messageKey;
121
122 /* Note: due to bugs, getMessage might return null even for
123 * known messages. These negatives are not cached, but that
124 * should be rare enough case to not affect performance. */
125 if ( !isset( $defs[$fullKey] ) ) {
126 $group = $handle->getGroup();
127 $msg = $group->getMessage( $messageKey, $group->getSourceLanguage() );
128
129 if ( $msg !== null ) {
130 $defs[$fullKey] = $msg;
131 }
132 }
133 }
134
135 return $defs;
136 }
137
138 public function getValidator() {
139 return null;
140 }
141
147 public function getMessageContent( MessageHandle $handle ) {
148 $groupId = MessageIndex::getPrimaryGroupId( $handle );
149 if ( $groupId ) {
150 $group = MessageGroups::getGroup( $groupId );
151 if ( $group ) {
152 return $group->getMessage( $handle->getKey(), $group->getSourceLanguage() );
153 }
154 }
155
156 throw new InvalidArgumentException( 'Could not find group for ' . $handle->getKey() );
157 }
158}
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: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:HookRunner'=> static function(MediaWikiServices $services):HookRunner { return new HookRunner( $services->getHookContainer());}, 'Translate:MessageBundleStore'=> static function(MediaWikiServices $services):MessageBundleStore { return new MessageBundleStore($services->get( 'Translate:RevTagStore'), $services->getJobQueueGroup(), $services->getLanguageNameUtils(), $services->get( 'Translate:MessageIndex'));}, '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->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:RevTagStore'=> static function(MediaWikiServices $services):RevTagStore { return new RevTagStore($services->getDBLoadBalancerFactory());}, 'Translate:SubpageListBuilder'=> static function(MediaWikiServices $services):SubpageListBuilder { return new SubpageListBuilder($services->get( 'Translate:TranslatableBundleFactory'), $services->getLinkBatchFactory());}, '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());}, '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(), $services->get( 'Translate:RevTagStore'), $services->getDBLoadBalancer(), $services->get( 'Translate:TranslatableBundleStatusStore'), $services->get( 'Translate:TranslatablePageParser'),);}, '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
Factory class for accessing message groups individually by id or all of them as a list.
Class for pointing to messages, like Title class is for titles.
getKey()
Returns the identified or guessed message key.
getQueryConditions()
Allows subclasses to partially customize the query.
getDefinitions()
Fetch definitions from database.
getMessageContent(MessageHandle $handle)
Subpage language code, if any in the title, is ignored.
getDescription(IContextSource $context=null)
Returns a longer description about the group.
__construct()
These groups are always generated for one language.
matchingMessage(MessageHandle $handle)
Filters out messages that should not be displayed here as they are not displayed in other places.
getValidator()
Returns a message validator object or null.
getLabel(IContextSource $context=null)
Group for messages that can be controlled via a page in MediaWiki namespace.