summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Translate/tag/TranslationsUpdateJob.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Translate/tag/TranslationsUpdateJob.php')
-rw-r--r--www/wiki/extensions/Translate/tag/TranslationsUpdateJob.php127
1 files changed, 127 insertions, 0 deletions
diff --git a/www/wiki/extensions/Translate/tag/TranslationsUpdateJob.php b/www/wiki/extensions/Translate/tag/TranslationsUpdateJob.php
new file mode 100644
index 00000000..f3020f41
--- /dev/null
+++ b/www/wiki/extensions/Translate/tag/TranslationsUpdateJob.php
@@ -0,0 +1,127 @@
+<?php
+/**
+ * Job for updating translation units and translation pages when
+ * a translatable page is marked for translation.
+ *
+ * @note MessageUpdateJobs from getTranslationUnitJobs() should be run
+ * before the TranslateRenderJobs are run so that the latest changes can
+ * take effect on the translation pages.
+ *
+ * @since 2016.03
+ */
+class TranslationsUpdateJob extends Job {
+ /**
+ * @inheritDoc
+ */
+ public function __construct( Title $title, $params = [] ) {
+ parent::__construct( __CLASS__, $title, $params );
+ }
+
+ /**
+ * Create a job that updates a translation page.
+ *
+ * If a list of sections is provided, then the job will also update translation
+ * unit pages.
+ *
+ * @param TranslatablePage $page
+ * @param TPSection[] $sections
+ * @return TranslationsUpdateJob
+ * @since 2018.07
+ */
+ public static function newFromPage( TranslatablePage $page, array $sections = [] ) {
+ $params = [];
+ $params[ 'sections' ] = [];
+ foreach ( $sections as $section ) {
+ $params[ 'sections' ][] = $section->serializeToArray();
+ }
+
+ return new self( $page->getTitle(), $params );
+ }
+
+ public function run() {
+ $page = TranslatablePage::newFromTitle( $this->title );
+ $sections = $this->params[ 'sections' ];
+ foreach ( $sections as $index => $section ) {
+ // Old jobs stored sections as objects because they were serialized and
+ // unserialized transparently. That is no longer supported, so we
+ // convert manually to primitive types first (to an PHP array).
+ if ( is_array( $section ) ) {
+ $sections[ $index ] = TPSection::unserializeFromArray( $section );
+ }
+ }
+
+ // Units should be updated before the render jobs are run
+ $unitJobs = self::getTranslationUnitJobs( $page, $sections );
+ foreach ( $unitJobs as $job ) {
+ $job->run();
+ }
+
+ // Ensure we are using the latest group definitions. This is needed so
+ // that in long running scripts we do see the page which was just
+ // marked for translation. Otherwise getMessageGroup in the next line
+ // returns null. There is no need to regenerate the global cache.
+ MessageGroups::singleton()->clearProcessCache();
+ // Ensure fresh definitions for MessageIndex and stats
+ $page->getMessageGroup()->clearCaches();
+
+ MessageIndex::singleton()->rebuild();
+
+ // Refresh translations statistics
+ $id = $page->getMessageGroupId();
+ MessageGroupStats::forGroup( $id, MessageGroupStats::FLAG_NO_CACHE );
+
+ $wikiPage = WikiPage::factory( $page->getTitle() );
+ $wikiPage->doPurge();
+
+ $renderJobs = self::getRenderJobs( $page );
+ JobQueueGroup::singleton()->push( $renderJobs );
+ return true;
+ }
+
+ /**
+ * Creates jobs needed to create or update all translation page definitions.
+ * @param TranslatablePage $page
+ * @param TPSection[] $sections
+ * @return Job[]
+ * @since 2013-01-28
+ */
+ public static function getTranslationUnitJobs( TranslatablePage $page, array $sections ) {
+ $jobs = [];
+
+ $code = $page->getSourceLanguageCode();
+ $prefix = $page->getTitle()->getPrefixedText();
+
+ foreach ( $sections as $s ) {
+ $unit = $s->name;
+ $title = Title::makeTitle( NS_TRANSLATIONS, "$prefix/$unit/$code" );
+
+ $fuzzy = $s->type === 'changed';
+ $jobs[] = MessageUpdateJob::newJob( $title, $s->getTextWithVariables(), $fuzzy );
+ }
+
+ return $jobs;
+ }
+
+ /**
+ * Creates jobs needed to create or update all translation pages.
+ * @param TranslatablePage $page
+ * @return Job[]
+ * @since 2013-01-28
+ */
+ public static function getRenderJobs( TranslatablePage $page ) {
+ $jobs = [];
+
+ $jobTitles = $page->getTranslationPages();
+ // $jobTitles may have the source language title already but duplicate TranslateRenderJobs
+ // are not executed so it's not run twice for the source language page present. This is
+ // added to ensure that we create the source language page from the very beginning.
+ $sourceLangTitle = $page->getTitle()->getSubpage( $page->getSourceLanguageCode() );
+ $jobTitles[] = $sourceLangTitle;
+ foreach ( $jobTitles as $t ) {
+ $jobs[] = TranslateRenderJob::newJob( $t );
+ }
+
+ return $jobs;
+ }
+
+}