30 private JobQueueGroup $jobQueue;
31 private LanguageNameUtils $languageNameUtils;
34 private const METADATA_KEYS_DB = [
39 public function __construct(
41 JobQueueGroup $jobQueue,
42 LanguageNameUtils $languageNameUtils,
46 $this->revTagStore = $revTagStore;
47 $this->jobQueue = $jobQueue;
48 $this->languageNameUtils = $languageNameUtils;
49 $this->messageIndex = $messageIndex;
50 $this->messageGroupMetadata = $messageGroupMetadata;
53 public function move( Title $oldName, Title $newName ):
void {
57 $this->messageGroupMetadata->moveMetadata(
58 $oldBundle->getMessageGroupId(),
59 $newBundle->getMessageGroupId(),
60 self::METADATA_KEYS_DB
63 MessageBundle::clearSourcePageCache();
65 MessageGroups::singleton()->recache();
71 $this->messageIndex->rebuild();
74 public function handleNullRevisionInsert(
TranslatableBundle $bundle, RevisionRecord $revision ):
void {
76 throw new InvalidArgumentException(
77 'Expected $bundle to be of type MessageBundle, got ' . get_class( $bundle )
81 $this->revTagStore->replaceTag( $bundle->
getTitle(), RevTagStore::MB_VALID_TAG, $revision->getId() );
82 MessageBundle::clearSourcePageCache();
85 public function delete( Title $title ):
void {
86 $this->revTagStore->removeTags( $title, RevTagStore::MB_VALID_TAG );
89 $this->messageGroupMetadata->clearMetadata( $bundle->
getMessageGroupId(), self::METADATA_KEYS_DB );
91 MessageBundle::clearSourcePageCache();
93 MessageGroups::singleton()->recache();
94 $this->jobQueue->push( RebuildMessageIndexJob::newJob( __METHOD__ ) );
100 $metadata = $content->getMetadata();
101 $sourceLanguageCode = $metadata->getSourceLanguageCode();
102 if ( $sourceLanguageCode ) {
103 if ( !$this->languageNameUtils->isKnownLanguageTag( $sourceLanguageCode ) ) {
105 'translate-messagebundle-error-invalid-sourcelanguage', [ $sourceLanguageCode ]
109 $revisionId = $this->revTagStore->getLatestRevisionWithTag( $pageTitle, RevTagStore::MB_VALID_TAG );
111 if ( $revisionId !==
null && $sourceLanguageCode !== $pageTitle->getPageLanguage()->getCode() ) {
112 throw new MalformedBundle(
'translate-messagebundle-sourcelanguage-changed' );
117 $priorityLanguageCodes = $metadata->getPriorityLanguages();
118 if ( $priorityLanguageCodes ) {
119 $invalidLanguageCodes = [];
120 foreach ( $priorityLanguageCodes as $languageCode ) {
121 if ( !is_string( $languageCode ) ) {
122 throw new MalformedBundle(
'translate-messagebundle-error-invalid-prioritylanguage-format' );
125 if ( !$this->languageNameUtils->isKnownLanguageTag( $languageCode ) ) {
126 $invalidLanguageCodes[] = $languageCode;
130 if ( $invalidLanguageCodes ) {
132 'translate-messagebundle-error-invalid-prioritylanguage',
133 [ Message::listParam( $invalidLanguageCodes ), count( $invalidLanguageCodes ) ]
139 public function save(
141 RevisionRecord $revisionRecord,
145 $this->validate( $pageTitle, $content );
147 $previousRevisionId = $this->revTagStore->getLatestRevisionWithTag( $pageTitle, RevTagStore::MB_VALID_TAG );
148 if ( $previousRevisionId !==
null ) {
149 $this->revTagStore->removeTags( $pageTitle, RevTagStore::MB_VALID_TAG );
152 if ( $content->isValid() ) {
154 $this->revTagStore->replaceTag( $pageTitle, RevTagStore::MB_VALID_TAG, $revisionRecord->getId() );
155 MessageBundle::clearSourcePageCache();
158 $job = UpdateMessageBundleJob::newJob( $pageTitle, $revisionRecord->getId(), $previousRevisionId );
160 $this->jobQueue->push( $job );
163 $definedLanguageCode = $content->getMetadata()->getSourceLanguageCode();
164 $pageLanguageCode = $pageTitle->getPageLanguage()->getCode();
165 if ( $previousRevisionId ===
null ) {
166 if ( $definedLanguageCode !== $pageLanguageCode ) {
167 $context = RequestContext::getMain();
168 SpecialPageLanguage::changePageLanguage(
171 $definedLanguageCode,
172 wfMessage(
'translate-messagebundle-change-sourcelanguage' )->inContentLanguage()
179 $groupId = $messageBundle->getMessageGroupId();
181 $metadata = $content->getMetadata();
182 $priorityForce = $metadata->areOnlyPriorityLanguagesAllowed() ?
'on' :
false;
183 $priorityLanguages = $metadata->getPriorityLanguages();
184 $priorityLanguages = $priorityLanguages ? implode(
',', $priorityLanguages ) :
false;
186 $this->messageGroupMetadata->set( $groupId,
'prioritylangs', $priorityLanguages );
187 $this->messageGroupMetadata->set( $groupId,
'priorityforce', $priorityForce );
189 $description = $metadata->getDescription();
190 $this->messageGroupMetadata->set( $groupId,
'description', $description ??
false );
192 $label = $metadata->getLabel();
193 $this->messageGroupMetadata->set( $groupId,
'label', $label ??
false );