26 private $messageIndex;
32 private $loadBalancer;
34 private $translatableBundleStatusStore;
36 public function __construct(
38 JobQueueGroup $jobQueue,
40 ILoadBalancer $loadBalancer,
43 $this->messageIndex = $messageIndex;
44 $this->jobQueue = $jobQueue;
45 $this->revTagStore = $revTagStore;
46 $this->loadBalancer = $loadBalancer;
47 $this->translatableBundleStatusStore = $translatableBundleStatusStore;
50 public function move( Title $oldName, Title $newName ):
void {
51 $oldTranslatablePage = TranslatablePage::newFromTitle( $oldName );
52 $newTranslatablePage = TranslatablePage::newFromTitle( $newName );
53 $oldGroupId = $oldTranslatablePage->getMessageGroupId();
54 $newGroupId = $newTranslatablePage->getMessageGroupId();
56 TranslateMetadata::moveMetadata( $oldGroupId, $newGroupId, TranslatablePage::METADATA_KEYS );
58 $this->moveMetadata( $oldGroupId, $newGroupId );
60 TranslatablePage::clearSourcePageCache();
63 MessageGroups::singleton()->recache();
66 $this->messageIndex->rebuild();
68 $job = UpdateTranslatablePageJob::newFromPage( TranslatablePage::newFromTitle( $newName ) );
69 $this->jobQueue->push( $job );
72 public function handleNullRevisionInsert(
TranslatableBundle $bundle, RevisionRecord $revision ):
void {
74 throw new InvalidArgumentException(
75 'Expected $bundle to be of type TranslatablePage, got ' . get_class( $bundle )
80 TranslatablePage::clearSourcePageCache();
84 public function delete( Title $title ): void {
85 $dbw = $this->loadBalancer->getConnection( DB_PRIMARY );
86 $dbw->delete(
'translate_sections', [
'trs_page' => $title->getArticleID() ], __METHOD__ );
92 public function unmark( Title $title ): void {
94 $translatablePage->getTranslationPercentages();
95 foreach ( $translatablePage->getTranslationPages() as $page ) {
96 $page->invalidateCache();
99 $groupId = $translatablePage->getMessageGroupId();
100 TranslateMetadata::clearMetadata( $groupId, TranslatablePage::METADATA_KEYS );
101 $this->removeFromAggregateGroups( $groupId );
106 $this->translatableBundleStatusStore->removeStatus( $title->getArticleID() );
108 MessageGroups::singleton()->recache();
109 $this->messageIndex->rebuild();
111 TranslatablePage::clearSourcePageCache();
116 DeferredUpdates::addCallableUpdate(
117 function () use ( $title ) {
118 $this->updateStatus( $title );
124 public function updateStatus( Title $title ): ?TranslatableBundleStatus {
125 $revTags = $this->revTagStore->getLatestRevisionsForTags(
127 RevTagStore::TP_MARK_TAG,
128 RevTagStore::TP_READY_TAG
131 $status = TranslatablePage::determineStatus(
132 $revTags[RevTagStore::TP_READY_TAG] ??
null,
133 $revTags[RevTagStore::TP_MARK_TAG] ??
null,
134 $title->getLatestRevID( Title::READ_LATEST )
138 $this->translatableBundleStatusStore->setStatus(
139 $title, $status, TranslatablePage::class
146 private function moveMetadata(
string $oldGroupId,
string $newGroupId ): void {
149 TranslateMetadata::preloadGroups( array_keys( $aggregateGroups ), __METHOD__ );
151 foreach ( $aggregateGroups as $id => $group ) {
152 $subgroups = TranslateMetadata::get( $id,
'subgroups' );
153 if ( $subgroups ===
false ) {
157 $subgroups = explode(
',', $subgroups );
158 $subgroups = array_flip( $subgroups );
159 if ( isset( $subgroups[$oldGroupId] ) ) {
160 $subgroups[$newGroupId] = $subgroups[$oldGroupId];
161 unset( $subgroups[$oldGroupId] );
162 $subgroups = array_flip( $subgroups );
163 TranslateMetadata::set(
166 implode(
',', $subgroups )
172 $priority = MessageGroups::getPriority( $oldGroupId );
173 if ( $priority !==
'' ) {
174 MessageGroups::setPriority( $newGroupId, $priority );
175 MessageGroups::setPriority( $oldGroupId,
'' );
179 private function removeFromAggregateGroups(
string $groupId ): void {
183 foreach ( $aggregateGroups as $group ) {
185 if ( $subgroups !==
false ) {
186 $subgroups = explode(
',', $subgroups );
187 $subgroups = array_flip( $subgroups );
188 if ( isset( $subgroups[$groupId] ) ) {
189 unset( $subgroups[$groupId] );
190 $subgroups = array_flip( $subgroups );
194 implode(
',', $subgroups )