29 private JobQueueGroup $jobQueue;
30 private LanguageNameUtils $languageNameUtils;
32 private const METADATA_KEYS_DB = [
37 public function __construct(
39 JobQueueGroup $jobQueue,
40 LanguageNameUtils $languageNameUtils,
43 $this->revTagStore = $revTagStore;
44 $this->jobQueue = $jobQueue;
45 $this->languageNameUtils = $languageNameUtils;
46 $this->messageIndex = $messageIndex;
49 public function move( Title $oldName, Title $newName ):
void {
53 TranslateMetadata::moveMetadata(
54 $oldBundle->getMessageGroupId(),
55 $newBundle->getMessageGroupId(),
56 self::METADATA_KEYS_DB
59 MessageBundle::clearSourcePageCache();
62 MessageGroups::singleton()->recache();
65 $this->messageIndex->rebuild();
68 public function handleNullRevisionInsert(
TranslatableBundle $bundle, RevisionRecord $revision ):
void {
70 throw new InvalidArgumentException(
71 'Expected $bundle to be of type MessageBundle, got ' . get_class( $bundle )
75 $this->revTagStore->replaceTag( $bundle->
getTitle(), RevTagStore::MB_VALID_TAG, $revision->getId() );
76 MessageBundle::clearSourcePageCache();
79 public function delete( Title $title ):
void {
80 $this->revTagStore->removeTags( $title, RevTagStore::MB_VALID_TAG );
83 TranslateMetadata::clearMetadata( $bundle->
getMessageGroupId(), self::METADATA_KEYS_DB );
85 MessageBundle::clearSourcePageCache();
87 MessageGroups::singleton()->recache();
88 $this->messageIndex->rebuild();
94 $metadata = $content->getMetadata();
95 $sourceLanguageCode = $metadata->getSourceLanguageCode();
96 if ( $sourceLanguageCode ) {
97 if ( !$this->languageNameUtils->isKnownLanguageTag( $sourceLanguageCode ) ) {
99 'translate-messagebundle-error-invalid-sourcelanguage', [ $sourceLanguageCode ]
103 $revisionId = $this->revTagStore->getLatestRevisionWithTag( $pageTitle, RevTagStore::MB_VALID_TAG );
105 if ( $revisionId !==
null && $sourceLanguageCode !== $pageTitle->getPageLanguage()->getCode() ) {
106 throw new MalformedBundle(
'translate-messagebundle-sourcelanguage-changed' );
111 $priorityLanguageCodes = $metadata->getPriorityLanguages();
112 if ( $priorityLanguageCodes ) {
113 $invalidLanguageCodes = [];
114 foreach ( $priorityLanguageCodes as $languageCode ) {
115 if ( !is_string( $languageCode ) ) {
116 throw new MalformedBundle(
'translate-messagebundle-error-invalid-prioritylanguage-format' );
119 if ( !$this->languageNameUtils->isKnownLanguageTag( $languageCode ) ) {
120 $invalidLanguageCodes[] = $languageCode;
124 if ( $invalidLanguageCodes ) {
126 'translate-messagebundle-error-invalid-prioritylanguage',
127 [ Message::listParam( $invalidLanguageCodes ), count( $invalidLanguageCodes ) ]
133 public function save(
135 RevisionRecord $revisionRecord,
139 $this->validate( $pageTitle, $content );
141 $previousRevisionId = $this->revTagStore->getLatestRevisionWithTag( $pageTitle, RevTagStore::MB_VALID_TAG );
142 if ( $previousRevisionId !==
null ) {
143 $this->revTagStore->removeTags( $pageTitle, RevTagStore::MB_VALID_TAG );
146 if ( $content->isValid() ) {
148 $this->revTagStore->replaceTag( $pageTitle, RevTagStore::MB_VALID_TAG, $revisionRecord->getId() );
149 MessageBundle::clearSourcePageCache();
152 $job = UpdateMessageBundleJob::newJob( $pageTitle, $revisionRecord->getId(), $previousRevisionId );
154 $this->jobQueue->push( $job );
157 $definedLanguageCode = $content->getMetadata()->getSourceLanguageCode();
158 $pageLanguageCode = $pageTitle->getPageLanguage()->getCode();
159 if ( $previousRevisionId ===
null ) {
160 if ( $definedLanguageCode !== $pageLanguageCode ) {
161 $context = RequestContext::getMain();
162 SpecialPageLanguage::changePageLanguage(
165 $definedLanguageCode,
166 wfMessage(
'translate-messagebundle-change-sourcelanguage' )->inContentLanguage()
173 $groupId = $messageBundle->getMessageGroupId();
175 $metadata = $content->getMetadata();
176 $priorityForce = $metadata->areOnlyPriorityLanguagesAllowed() ?
'on' :
false;
177 $priorityLanguages = $metadata->getPriorityLanguages();
178 $priorityLanguages = $priorityLanguages ? implode(
',', $priorityLanguages ) :
false;
180 TranslateMetadata::set( $groupId,
'prioritylangs', $priorityLanguages );
181 TranslateMetadata::set( $groupId,
'priorityforce', $priorityForce );
183 $description = $metadata->getDescription();
184 TranslateMetadata::set( $groupId,
'description', $description ??
false );
186 $label = $metadata->getLabel();
187 TranslateMetadata::set( $groupId,
'label', $label ??
false );