summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Translate/api/ApiQueryMessageCollection.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Translate/api/ApiQueryMessageCollection.php')
-rw-r--r--www/wiki/extensions/Translate/api/ApiQueryMessageCollection.php124
1 files changed, 79 insertions, 45 deletions
diff --git a/www/wiki/extensions/Translate/api/ApiQueryMessageCollection.php b/www/wiki/extensions/Translate/api/ApiQueryMessageCollection.php
index 1c7e7032..f9353d62 100644
--- a/www/wiki/extensions/Translate/api/ApiQueryMessageCollection.php
+++ b/www/wiki/extensions/Translate/api/ApiQueryMessageCollection.php
@@ -4,7 +4,7 @@
*
* @file
* @author Niklas Laxström
- * @license GPL-2.0+
+ * @license GPL-2.0-or-later
*/
/**
@@ -30,12 +30,48 @@ class ApiQueryMessageCollection extends ApiQueryGeneratorBase {
$this->run( $resultPageSet );
}
+ private function validateLanguageCode( $code ) {
+ if ( !Language::isValidBuiltInCode( $code ) ) {
+ $this->dieWithError( [ 'apierror-translate-invalidlanguage' ] );
+ }
+ }
+
private function run( ApiPageSet $resultPageSet = null ) {
+ global $wgTranslateBlacklist;
+
$params = $this->extractRequestParams();
$group = MessageGroups::getGroup( $params['group'] );
if ( !$group ) {
- $this->dieUsageMsg( array( 'missingparam', 'mcgroup' ) );
+ $this->dieWithError( [ 'apierror-missingparam', 'mcgroup' ] );
+ }
+
+ $languageCode = $params[ 'language' ];
+ $this->validateLanguageCode( $languageCode );
+ if ( $group->getSourceLanguage() === $languageCode ) {
+ $name = Language::fetchLanguageName( $languageCode, $this->getLanguage()->getCode() );
+ $this->addWarning( [ 'apiwarn-translate-language-disabled-source', wfEscapeWikiText( $name ) ] );
+ }
+ $languages = $group->getTranslatableLanguages();
+ if ( $languages !== null ) {
+ if ( !isset( $languages[ $languageCode ] ) ) {
+ $name = Language::fetchLanguageName( $languageCode, $this->getLanguage()->getCode() );
+ $this->dieWithError( [ 'apierror-translate-language-disabled', $name ] );
+ }
+ } else {
+ $checks = [
+ $group->getId(),
+ strtok( $group->getId(), '-' ),
+ '*'
+ ];
+
+ foreach ( $checks as $check ) {
+ if ( isset( $wgTranslateBlacklist[ $check ][ $languageCode ] ) ) {
+ $name = Language::fetchLanguageName( $languageCode, $this->getLanguage()->getCode() );
+ $reason = $wgTranslateBlacklist[ $check ][ $languageCode ];
+ $this->dieWithError( [ 'apierror-translate-language-disabled-reason', $name, $reason ] );
+ }
+ }
}
if ( MessageGroups::isDynamic( $group ) ) {
@@ -45,17 +81,6 @@ class ApiQueryMessageCollection extends ApiQueryGeneratorBase {
$group->setLanguage( $params['language'] );
}
- $result = $this->getResult();
-
- $languages = $group->getTranslatableLanguages();
-
- if ( $languages !== null && !isset( $languages[$params['language']] ) ) {
- $this->dieUsage(
- 'Translation to this language is disabled',
- 'translate-language-disabled'
- );
- }
-
$messages = $group->initCollection( $params['language'] );
foreach ( $params['filter'] as $filter ) {
@@ -73,7 +98,10 @@ class ApiQueryMessageCollection extends ApiQueryGeneratorBase {
$messages->filter( $filter, false, $value );
}
} catch ( MWException $e ) {
- $this->dieUsage( $e->getMessage(), 'invalidfilter' );
+ $this->dieWithError(
+ [ 'apierror-translate-invalidfilter', wfEscapeWikiText( $e->getMessage() ) ],
+ 'invalidfilter'
+ );
}
}
@@ -82,22 +110,23 @@ class ApiQueryMessageCollection extends ApiQueryGeneratorBase {
$batchSize = count( $messages );
list( /*$backwardsOffset*/, $forwardsOffset, $startOffset ) = $offsets;
+ $result = $this->getResult();
$result->addValue(
- array( 'query', 'metadata' ),
+ [ 'query', 'metadata' ],
'state',
self::getWorkflowState( $group->getId(), $params['language'] )
);
- $result->addValue( array( 'query', 'metadata' ), 'resultsize', $resultSize );
+ $result->addValue( [ 'query', 'metadata' ], 'resultsize', $resultSize );
$result->addValue(
- array( 'query', 'metadata' ),
+ [ 'query', 'metadata' ],
'remaining',
$resultSize - $startOffset - $batchSize
);
$messages->loadTranslations();
- $pages = array();
+ $pages = [];
if ( $forwardsOffset !== false ) {
$this->setContinueEnumParameter( 'offset', $forwardsOffset );
@@ -110,8 +139,13 @@ class ApiQueryMessageCollection extends ApiQueryGeneratorBase {
if ( is_null( $resultPageSet ) ) {
$data = $this->extractMessageData( $result, $props, $messages[$mkey] );
$data['title'] = $title->getPrefixedText();
+ $handle = new MessageHandle( $title );
+
+ if ( $handle->isValid() ) {
+ $data['primaryGroup'] = $handle->getGroup()->getId();
+ }
- $result->addValue( array( 'query', $this->getModuleName() ), null, $data );
+ $result->addValue( [ 'query', $this->getModuleName() ], null, $data );
} else {
$pages[] = $title;
}
@@ -119,7 +153,7 @@ class ApiQueryMessageCollection extends ApiQueryGeneratorBase {
if ( is_null( $resultPageSet ) ) {
$result->addIndexedTagName(
- array( 'query', $this->getModuleName() ),
+ [ 'query', $this->getModuleName() ],
'message'
);
} else {
@@ -128,9 +162,9 @@ class ApiQueryMessageCollection extends ApiQueryGeneratorBase {
}
/**
- * @param $result ApiResult
- * @param $props array
- * @param $message ThinMessage
+ * @param ApiResult $result
+ * @param array $props
+ * @param ThinMessage $message
* @return array
*/
public function extractMessageData( $result, $props, $message ) {
@@ -173,64 +207,64 @@ class ApiQueryMessageCollection extends ApiQueryGeneratorBase {
* @return string|bool State id or false.
*/
protected static function getWorkflowState( $groupId, $language ) {
- $dbr = wfGetDB( DB_SLAVE );
+ $dbr = wfGetDB( DB_REPLICA );
return $dbr->selectField(
'translate_groupreviews',
'tgr_state',
- array(
+ [
'tgr_group' => $groupId,
'tgr_lang' => $language
- ),
+ ],
__METHOD__
);
}
public function getAllowedParams() {
- return array(
- 'group' => array(
+ return [
+ 'group' => [
ApiBase::PARAM_TYPE => 'string',
ApiBase::PARAM_REQUIRED => true,
- ),
- 'language' => array(
+ ],
+ 'language' => [
ApiBase::PARAM_TYPE => 'string',
ApiBase::PARAM_DFLT => 'en',
- ),
- 'limit' => array(
+ ],
+ 'limit' => [
ApiBase::PARAM_DFLT => 500,
ApiBase::PARAM_TYPE => 'limit',
ApiBase::PARAM_MIN => 1,
ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG2,
ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2,
- ),
- 'offset' => array(
+ ],
+ 'offset' => [
ApiBase::PARAM_DFLT => '',
ApiBase::PARAM_TYPE => 'string',
ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
- ),
- 'filter' => array(
+ ],
+ 'filter' => [
ApiBase::PARAM_TYPE => 'string',
ApiBase::PARAM_DFLT => '!optional|!ignored',
ApiBase::PARAM_ISMULTI => true,
- ),
- 'prop' => array(
- ApiBase::PARAM_TYPE => array(
+ ],
+ 'prop' => [
+ ApiBase::PARAM_TYPE => [
'definition',
'translation',
'tags',
'revision',
'properties'
- ),
+ ],
ApiBase::PARAM_DFLT => 'definition|translation',
ApiBase::PARAM_ISMULTI => true,
ApiBase::PARAM_HELP_MSG =>
- array( 'apihelp-query+messagecollection-param-prop', '!!FUZZY!!' ),
- ),
- );
+ [ 'apihelp-query+messagecollection-param-prop', '!!FUZZY!!' ],
+ ],
+ ];
}
protected function getExamplesMessages() {
- return array(
+ return [
'action=query&meta=siteinfo&siprop=languages'
=> 'apihelp-query+messagecollection-example-1',
'action=query&list=messagecollection&mcgroup=page-Example'
@@ -240,6 +274,6 @@ class ApiQueryMessageCollection extends ApiQueryGeneratorBase {
=> 'apihelp-query+messagecollection-example-3',
'action=query&generator=messagecollection&gmcgroup=page-Example&gmclanguage=nl&prop=revisions'
=> 'apihelp-query+messagecollection-example-4',
- );
+ ];
}
}