24 public function __construct(
30 parent::__construct( $mainModule, $moduleName );
31 $this->translatablePageMarker = $translatablePageMarker;
32 $this->messageGroupMetadata = $messageGroupMetadata;
35 public function execute() {
36 $this->checkUserRightsAny(
'pagetranslation' );
38 $params = $this->extractRequestParams();
39 $title = $this->getTitleFromTitleOrPageId( $params );
40 $revision = $params[
'revid'] ??
null;
42 $translateTitle = $this->getTriState( $params,
'translatetitle' );
45 $operation = $this->translatablePageMarker->getMarkOperation(
46 $title->toPageRecord( IDBAccessObject::READ_LATEST ),
48 $translateTitle ??
true
51 $this->addError( $e->getMessageObject() );
55 $unitNameValidationResult = $operation->getUnitValidationStatus();
56 if ( !$unitNameValidationResult->isOK() ) {
57 $this->addMessagesFromStatus( $unitNameValidationResult );
61 if ( $translateTitle ===
null ) {
66 $operation->isFirstMark() &&
67 !$title->inNamespace( NS_TEMPLATE )
68 ) || $operation->getPage()->hasPageDisplayTitle();
73 foreach ( $operation->getUnits() as $s ) {
74 if ( $s->type ===
'changed' && $s->onlyTvarsChanged() ) {
75 $noFuzzyUnits[] = $s->id;
80 $noFuzzyUnits = array_unique( array_merge( $noFuzzyUnits, $params[
'nofuzzyunits'] ?? [] ) );
81 $noFuzzyUnits = array_diff( $noFuzzyUnits, $params[
'fuzzyunits'] ?? [] );
83 $groupId = $operation->getPage()->getMessageGroupId();
84 if ( isset( $params[
'prioritylanguages'] ) ) {
86 $priorityLanguages = $params[
'prioritylanguages'];
87 $priorityLanguageStatus = $this->validatePriorityLanguages( $priorityLanguages );
88 if ( !$priorityLanguageStatus->isOK() ) {
89 $this->addMessagesFromStatus( $priorityLanguageStatus );
92 $forcePriority = $params[
'forcepriority'] ??
false;
93 $priorityReason = $params[
'priorityreason'] ??
'';
98 $blob = (string)$this->messageGroupMetadata->get( $groupId,
'prioritylangs' );
99 $priorityLanguages = $blob !==
'' ? explode(
',', $blob ) : [];
100 $forcePriority = $this->messageGroupMetadata->get( $groupId,
'priorityforce' ) ===
'on';
102 $priorityReason = $this->messageGroupMetadata->get( $groupId,
'priorityreason' );
103 $priorityReason = $priorityReason !==
false ? $priorityReason :
'';
106 $transclusion = $this->getTriState( $params,
'transclusion' );
107 if ( $transclusion ===
null ) {
108 $transclusion = $operation->getPage()->supportsTransclusion() ?? $operation->isFirstMark();
117 $params[
'forcelatestsyntaxversion'] ??
false,
122 $unitCount = $this->translatablePageMarker->markForTranslation(
124 $translatablePageSettings,
128 $this->addError( $e->getMessageObject() );
132 'result' =>
'Success',
133 'firstmark' => $operation->isFirstMark(),
134 'unitcount' => $unitCount,
136 $this->getResult()->addValue(
null, $this->getModuleName(), $res );
140 private function getTriState( array $params,
string $name ): ?
bool {
141 return isset( $params[$name] ) ? $params[$name] ===
'yes' :
null;
144 private function validatePriorityLanguages( array $priorityLanguageCodes ): Status {
145 $knownLanguageCodes = array_keys( Utilities::getLanguageNames(
'en' ) );
146 $invalidLanguageCodes = array_diff( $priorityLanguageCodes, $knownLanguageCodes );
147 $context = $this->getContext();
149 if ( $invalidLanguageCodes ) {
150 return Status::newFatal(
151 $context->msg(
'apierror-markfortranslation-invalid-prioritylangs' )
153 count( $invalidLanguageCodes ),
154 $context->getLanguage()->commaList( $invalidLanguageCodes )
159 return Status::newGood();
162 public function isWriteMode() {
166 public function needsToken() {
170 protected function getAllowedParams() {
173 ParamValidator::PARAM_TYPE =>
'string',
176 ParamValidator::PARAM_TYPE =>
'integer',
179 ParamValidator::PARAM_TYPE =>
'integer',
181 'translatetitle' => [
182 ParamValidator::PARAM_TYPE => [
'yes',
'no' ],
184 'prioritylanguages' => [
185 ParamValidator::PARAM_TYPE =>
'string',
186 ParamValidator::PARAM_ISMULTI =>
true,
187 ParamValidator::PARAM_ISMULTI_LIMIT1 => 1000,
188 ParamValidator::PARAM_ISMULTI_LIMIT2 => 1000,
191 ParamValidator::PARAM_TYPE =>
'boolean',
193 'priorityreason' => [
194 ParamValidator::PARAM_TYPE =>
'string',
197 ParamValidator::PARAM_TYPE =>
'string',
198 ParamValidator::PARAM_ISMULTI =>
true,
199 ParamValidator::PARAM_ISMULTI_LIMIT1 => 1000,
200 ParamValidator::PARAM_ISMULTI_LIMIT2 => 1000,
203 ParamValidator::PARAM_TYPE =>
'string',
204 ParamValidator::PARAM_ISMULTI =>
true,
205 ParamValidator::PARAM_ISMULTI_LIMIT1 => 1000,
206 ParamValidator::PARAM_ISMULTI_LIMIT2 => 1000,
208 'forcelatestsyntaxversion' => [
209 ParamValidator::PARAM_TYPE =>
'boolean',
212 ParamValidator::PARAM_TYPE => [
'yes',
'no' ],