31 private JobQueueGroup $jobQueue;
33 private ILoadBalancer $loadBalancer;
37 public function __construct(
39 JobQueueGroup $jobQueue,
41 ILoadBalancer $loadBalancer,
45 $this->messageIndex = $messageIndex;
46 $this->jobQueue = $jobQueue;
47 $this->revTagStore = $revTagStore;
48 $this->loadBalancer = $loadBalancer;
49 $this->translatableBundleStatusStore = $translatableBundleStatusStore;
50 $this->translatablePageParser = $translatablePageParser;
53 public function move( Title $oldName, Title $newName ):
void {
54 $oldTranslatablePage = TranslatablePage::newFromTitle( $oldName );
55 $newTranslatablePage = TranslatablePage::newFromTitle( $newName );
56 $oldGroupId = $oldTranslatablePage->getMessageGroupId();
57 $newGroupId = $newTranslatablePage->getMessageGroupId();
59 TranslateMetadata::moveMetadata( $oldGroupId, $newGroupId, TranslatablePage::METADATA_KEYS );
61 $this->moveMetadata( $oldGroupId, $newGroupId );
63 TranslatablePage::clearSourcePageCache();
66 MessageGroups::singleton()->recache();
69 $this->messageIndex->rebuild();
71 $job = UpdateTranslatablePageJob::newFromPage( TranslatablePage::newFromTitle( $newName ) );
72 $this->jobQueue->push( $job );
75 public function handleNullRevisionInsert(
TranslatableBundle $bundle, RevisionRecord $revision ):
void {
77 throw new InvalidArgumentException(
78 'Expected $bundle to be of type TranslatablePage, got ' . get_class( $bundle )
82 $pageContent = $revision->getContent( SlotRecord::MAIN );
83 if ( !$pageContent instanceof TextContent ) {
84 throw new RuntimeException(
"Translatable page {$bundle->getTitle()} has non-textual content." );
88 $pageText = $pageContent->getText();
89 if ( $this->translatablePageParser->containsMarkup( $pageText ) ) {
91 TranslatablePage::clearSourcePageCache();
96 public function delete( Title $title ): void {
97 $dbw = $this->loadBalancer->getConnection( DB_PRIMARY );
98 $dbw->delete(
'translate_sections', [
'trs_page' => $title->getArticleID() ], __METHOD__ );
104 public function unmark( PageIdentity $title ): void {
106 $translatablePage->getTranslationPercentages();
107 foreach ( $translatablePage->getTranslationPages() as $page ) {
108 $page->invalidateCache();
111 $groupId = $translatablePage->getMessageGroupId();
112 TranslateMetadata::clearMetadata( $groupId, TranslatablePage::METADATA_KEYS );
113 $this->removeFromAggregateGroups( $groupId );
118 $this->translatableBundleStatusStore->removeStatus( $title->getId() );
120 MessageGroups::singleton()->recache();
121 $this->messageIndex->rebuild();
123 TranslatablePage::clearSourcePageCache();
128 DeferredUpdates::addCallableUpdate(
129 function () use ( $title ) {
130 $this->updateStatus( $title );
136 public function updateStatus( Title $title ): ?TranslatableBundleStatus {
137 $revTags = $this->revTagStore->getLatestRevisionsForTags(
143 $status = TranslatablePage::determineStatus(
144 $revTags[RevTagStore::TP_READY_TAG] ??
null,
145 $revTags[RevTagStore::TP_MARK_TAG] ??
null,
146 $title->getLatestRevID( Title::READ_LATEST )
150 $this->translatableBundleStatusStore->setStatus(
151 $title, $status, TranslatablePage::class
158 private function moveMetadata(
string $oldGroupId,
string $newGroupId ): void {
161 TranslateMetadata::preloadGroups( array_keys( $aggregateGroups ), __METHOD__ );
163 foreach ( $aggregateGroups as $id => $group ) {
164 $subgroups = TranslateMetadata::get( $id,
'subgroups' );
165 if ( $subgroups ===
false ) {
169 $subgroups = explode(
',', $subgroups );
170 $subgroups = array_flip( $subgroups );
171 if ( isset( $subgroups[$oldGroupId] ) ) {
172 $subgroups[$newGroupId] = $subgroups[$oldGroupId];
173 unset( $subgroups[$oldGroupId] );
174 $subgroups = array_flip( $subgroups );
175 TranslateMetadata::set(
178 implode(
',', $subgroups )
184 $priority = MessageGroups::getPriority( $oldGroupId );
185 if ( $priority !==
'' ) {
186 MessageGroups::setPriority( $newGroupId, $priority );
187 MessageGroups::setPriority( $oldGroupId,
'' );
191 private function removeFromAggregateGroups(
string $groupId ): void {
195 foreach ( $aggregateGroups as $group ) {
197 if ( $subgroups !==
false ) {
198 $subgroups = explode(
',', $subgroups );
199 $subgroups = array_flip( $subgroups );
200 if ( isset( $subgroups[$groupId] ) ) {
201 unset( $subgroups[$groupId] );
202 $subgroups = array_flip( $subgroups );
206 implode(
',', $subgroups )