Translate extension for MediaWiki
 
Loading...
Searching...
No Matches
AggregateMessageGroupLoader.php
Go to the documentation of this file.
1<?php
12use MediaWiki\MediaWikiServices;
13use Wikimedia\Rdbms\IDatabase;
14
20 implements CachedMessageGroupLoader {
21
22 private const CACHE_KEY = 'aggregate';
23 private const CACHE_VERSION = 2;
24
26 protected $cache;
28 protected $db;
30 protected $groups;
31
32 public function __construct( IDatabase $db, MessageGroupWANCache $cache ) {
33 $this->db = $db;
34 $this->cache = $cache;
35 $this->cache->configure(
36 [
37 'key' => self::CACHE_KEY,
38 'version' => self::CACHE_VERSION,
39 'regenerator' => [ $this, 'getCacheData' ],
40 ]
41 );
42 }
43
50 public function getGroups() {
51 if ( $this->groups === null ) {
52 $this->groups = $this->initGroupsFromConf( $this->cache->getValue() );
53 }
54
55 return $this->groups;
56 }
57
64 public static function registerLoader( array &$groupLoader, array $deps ) {
65 $groupLoader[] = self::getInstance(
66 $deps['database'],
67 $deps['cache']
68 );
69 }
70
79 public static function getInstance( IDatabase $db = null, WANObjectCache $cache = null ) {
80 return new self(
81 $db ?? Utilities::getSafeReadDB(),
83 $cache ?? MediaWikiServices::getInstance()->getMainWANObjectCache()
84 )
85 );
86 }
87
93 public function getCacheData(): array {
94 $groupIds = TranslateMetadata::getGroupsWithSubgroups();
95 TranslateMetadata::preloadGroups( $groupIds, __METHOD__ );
96
97 $groups = [];
98 foreach ( $groupIds as $id ) {
99 $conf = [];
100 $conf['BASIC'] = [
101 'id' => $id,
102 'label' => TranslateMetadata::get( $id, 'name' ),
103 'description' => TranslateMetadata::get( $id, 'description' ),
104 'meta' => 1,
105 'class' => AggregateMessageGroup::class,
106 'namespace' => NS_TRANSLATIONS,
107 ];
108 $sourcelanguage = TranslateMetadata::get( $id, 'sourcelanguagecode' );
109 if ( $sourcelanguage ) {
110 $conf['BASIC']['sourcelanguage'] = $sourcelanguage;
111 }
112 $conf['GROUPS'] = TranslateMetadata::getSubgroups( $id );
113 $groups[$id] = $conf;
114 }
115
116 return $groups;
117 }
118
124 public function loadAggregateGroups(): array {
125 // get the data from the database everytime
126 // @phan-suppress-next-line PhanTypeMismatchReturn type is guaranteed via getCacheData above
127 return $this->initGroupsFromConf( $this->getCacheData() );
128 }
129
134 protected function initGroupsFromConf( array $groups ): array {
135 return array_map( [ MessageGroupBase::class, 'factory' ], $groups );
136 }
137
141 public function recache() {
142 $this->clearProcessCache();
143 $this->cache->touchKey();
144
145 $cacheData = $this->cache->getValue( 'recache' );
146 $this->groups = $this->initGroupsFromConf( $cacheData );
147 }
148
152 public function clearCache() {
153 $this->clearProcessCache();
154 $this->cache->delete();
155 }
156
160 protected function clearProcessCache() {
161 $this->groups = null;
162 }
163}
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
Loads AggregateMessageGroup, and handles the related cache.
clearProcessCache()
Clears the process cache, mainly the cached groups property.
static registerLoader(array &$groupLoader, array $deps)
Hook: TranslateInitGroupLoaders.
static getInstance(IDatabase $db=null, WANObjectCache $cache=null)
Return an instance of this class using the parameters, if passed, else initialize the necessary depen...
getCacheData()
Get all the aggregate messages groups defined in translate_metadata table and return their configurat...
recache()
Clear and refill the cache with the latest values.
getGroups()
Fetches the AggregateMessageGroups.
clearCache()
Clear values from the cache.
loadAggregateGroups()
Loads AggregateMessageGroup from the database.
Essentially random collection of helper functions, similar to GlobalFunctions.php.
Definition Utilities.php:31
This class implements some basic functions that wrap around the YAML message group configurations.
An abstract class to be implemented by group loaders / stores.
Wrapper around WANObjectCache providing a simpler interface for MessageGroups to use the cache.
configure(array $config)
Configure the message group.
To be implemented by MessageGroupLoaders that use the MessageGroupWANCache.