26 private $messageIndex;
32 private $loadBalancer;
34 public function __construct(
36 JobQueueGroup $jobQueue,
38 ILoadBalancer $loadBalancer
40 $this->messageIndex = $messageIndex;
41 $this->jobQueue = $jobQueue;
42 $this->revTagStore = $revTagStore;
43 $this->loadBalancer = $loadBalancer;
46 public function move( Title $oldName, Title $newName ):
void {
47 $oldTranslatablePage = TranslatablePage::newFromTitle( $oldName );
48 $newTranslatablePage = TranslatablePage::newFromTitle( $newName );
49 $oldGroupId = $oldTranslatablePage->getMessageGroupId();
50 $newGroupId = $newTranslatablePage->getMessageGroupId();
52 TranslateMetadata::moveMetadata( $oldGroupId, $newGroupId, TranslatablePage::METADATA_KEYS );
54 $this->moveMetadata( $oldGroupId, $newGroupId );
56 TranslatablePage::clearSourcePageCache();
59 MessageGroups::singleton()->recache();
62 $this->messageIndex->rebuild();
64 $job = UpdateTranslatablePageJob::newFromPage( TranslatablePage::newFromTitle( $newName ) );
65 $this->jobQueue->push( $job );
68 public function handleNullRevisionInsert(
TranslatableBundle $bundle, RevisionRecord $revision ):
void {
70 throw new InvalidArgumentException(
71 'Expected $bundle to be of type TranslatablePage, got ' . get_class( $bundle )
76 TranslatablePage::clearSourcePageCache();
79 public function delete( Title $title ):
void {
80 $dbw = $this->loadBalancer->getConnectionRef( DB_PRIMARY );
83 $dbw->delete(
'translate_sections', [
'trs_page' => $title->getArticleID() ], __METHOD__ );
85 $translatablePage = TranslatablePage::newFromTitle( $title );
86 $translatablePage->getTranslationPercentages();
87 foreach ( $translatablePage->getTranslationPages() as $page ) {
88 $page->invalidateCache();
91 $groupId = $translatablePage->getMessageGroupId();
92 TranslateMetadata::clearMetadata( $groupId, TranslatablePage::METADATA_KEYS );
93 $this->removeFromAggregateGroups( $groupId );
94 TranslatablePage::clearSourcePageCache();
96 MessageGroups::singleton()->recache();
97 $this->messageIndex->rebuild();
100 private function moveMetadata(
string $oldGroupId,
string $newGroupId ):
void {
102 $aggregateGroups = MessageGroups::getGroupsByType( AggregateMessageGroup::class );
103 TranslateMetadata::preloadGroups( array_keys( $aggregateGroups ), __METHOD__ );
105 foreach ( $aggregateGroups as $id => $group ) {
106 $subgroups = TranslateMetadata::get( $id,
'subgroups' );
107 if ( $subgroups ===
false ) {
111 $subgroups = explode(
',', $subgroups );
112 $subgroups = array_flip( $subgroups );
113 if ( isset( $subgroups[$oldGroupId] ) ) {
114 $subgroups[$newGroupId] = $subgroups[$oldGroupId];
115 unset( $subgroups[$oldGroupId] );
116 $subgroups = array_flip( $subgroups );
117 TranslateMetadata::set(
120 implode(
',', $subgroups )
126 $priority = MessageGroups::getPriority( $oldGroupId );
127 if ( $priority !==
'' ) {
128 MessageGroups::setPriority( $newGroupId, $priority );
129 MessageGroups::setPriority( $oldGroupId,
'' );
133 private function removeFromAggregateGroups(
string $groupId ):
void {
135 $aggregateGroups = MessageGroups::getGroupsByType( AggregateMessageGroup::class );
136 TranslateMetadata::preloadGroups( array_keys( $aggregateGroups ), __METHOD__ );
137 foreach ( $aggregateGroups as $group ) {
138 $subgroups = TranslateMetadata::get( $group->getId(),
'subgroups' );
139 if ( $subgroups !==
false ) {
140 $subgroups = explode(
',', $subgroups );
141 $subgroups = array_flip( $subgroups );
142 if ( isset( $subgroups[$groupId] ) ) {
143 unset( $subgroups[$groupId] );
144 $subgroups = array_flip( $subgroups );
145 TranslateMetadata::set(
148 implode(
',', $subgroups )