diff options
Diffstat (limited to 'www/wiki/extensions/Translate/api/ApiSearchTranslations.php')
-rw-r--r-- | www/wiki/extensions/Translate/api/ApiSearchTranslations.php | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/www/wiki/extensions/Translate/api/ApiSearchTranslations.php b/www/wiki/extensions/Translate/api/ApiSearchTranslations.php new file mode 100644 index 00000000..d2787a0c --- /dev/null +++ b/www/wiki/extensions/Translate/api/ApiSearchTranslations.php @@ -0,0 +1,131 @@ +<?php +/** + * API module for search translations + * @since 2015.07 + * @license GPL-2.0-or-later + */ +class ApiSearchTranslations extends ApiBase { + public function execute() { + global $wgTranslateTranslationServices; + + if ( !$this->getAvailableTranslationServices() ) { + $this->dieWithError( 'apierror-translate-notranslationservices' ); + } + + $params = $this->extractRequestParams(); + + $config = $wgTranslateTranslationServices[$params['service']]; + /** @var SearchableTTMServer $server */ + $server = TTMServer::factory( $config ); + + $result = $this->getResult(); + + if ( $params['filter'] !== '' ) { + $translationSearch = new CrossLanguageTranslationSearchQuery( $params, $server ); + $documents = $translationSearch->getDocuments(); + $total = $translationSearch->getTotalHits(); + } else { + $searchResults = $server->search( + $params['query'], + $params, + [ '', '' ] + ); + $documents = $server->getDocuments( $searchResults ); + $total = $server->getTotalHits( $searchResults ); + } + $result->addValue( [ 'search', 'metadata' ], 'total', $total ); + $result->addValue( 'search', 'translations', $documents ); + } + + protected function getAvailableTranslationServices() { + global $wgTranslateTranslationServices; + + $good = []; + foreach ( $wgTranslateTranslationServices as $id => $config ) { + if ( TTMServer::factory( $config ) instanceof SearchableTTMServer ) { + $good[] = $id; + } + } + + return $good; + } + + protected function getAllowedFilters() { + return [ + '', + 'translated', + 'fuzzy', + 'untranslated' + ]; + } + + public function getAllowedParams() { + global $wgLanguageCode, + $wgTranslateTranslationDefaultService; + $available = $this->getAvailableTranslationServices(); + + $filters = $this->getAllowedFilters(); + + $ret = [ + 'service' => [ + ApiBase::PARAM_TYPE => $available, + ], + 'query' => [ + ApiBase::PARAM_TYPE => 'string', + ApiBase::PARAM_REQUIRED => true, + ], + 'sourcelanguage' => [ + ApiBase::PARAM_TYPE => 'string', + ApiBase::PARAM_DFLT => $wgLanguageCode, + ], + 'language' => [ + ApiBase::PARAM_TYPE => 'string', + ApiBase::PARAM_DFLT => '', + ], + 'group' => [ + ApiBase::PARAM_TYPE => 'string', + ApiBase::PARAM_DFLT => '', + ], + 'filter' => [ + ApiBase::PARAM_TYPE => $filters, + ApiBase::PARAM_DFLT => '', + ], + 'match' => [ + ApiBase::PARAM_TYPE => 'string', + ApiBase::PARAM_DFLT => '', + ], + 'case' => [ + ApiBase::PARAM_TYPE => 'string', + ApiBase::PARAM_DFLT => '0', + ], + 'offset' => [ + ApiBase::PARAM_TYPE => 'integer', + ApiBase::PARAM_DFLT => 0, + ], + 'limit' => [ + ApiBase::PARAM_DFLT => 25, + ApiBase::PARAM_TYPE => 'limit', + ApiBase::PARAM_MIN => 1, + ApiBase::PARAM_MAX => ApiBase::LIMIT_SML1, + ApiBase::PARAM_MAX2 => ApiBase::LIMIT_SML2 + ], + ]; + + if ( $available ) { + // Don't add this if no services are available, it makes + // ApiStructureTest unhappy + $ret['service'][ApiBase::PARAM_DFLT] = $wgTranslateTranslationDefaultService; + } + + return $ret; + } + + protected function getExamplesMessages() { + return [ + 'action=searchtranslations&language=fr&query=aide' + => 'apihelp-searchtranslations-example-1', + 'action=searchtranslations&language=fr&query=edit&filter=untranslated' + => 'apihelp-searchtranslations-example-2', + ]; + } +} |