summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Translate/api/ApiSearchTranslations.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Translate/api/ApiSearchTranslations.php')
-rw-r--r--www/wiki/extensions/Translate/api/ApiSearchTranslations.php131
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',
+ ];
+ }
+}