1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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;
}
}
|