Phoenix303 has uploaded a new change for review. https://gerrit.wikimedia.org/r/225005
Change subject: Get outdated messages in the target language using MessageCollection ...................................................................... Get outdated messages in the target language using MessageCollection Steps: 1. Used filtered query to search for a string in a source language. Suppose source language is finnish, search for 'Aloita', it returns all finnish messages with 'Aloita'.(Default source language is the wiki's content language) 2. Create message definitions for all message keys found in step 1. 3. Filter to get all the outdated messages in the selected target language. By default the target language is the interface language. Use parameter 'filter=translated' to get translated messages. Bug: T101221 Change-Id: Ic0326d688f799a91d308ebd1d78facccb2a4e61a --- M specials/SpecialSearchTranslations.php M ttmserver/ElasticSearchTTMServer.php 2 files changed, 106 insertions(+), 10 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Translate refs/changes/05/225005/1 diff --git a/specials/SpecialSearchTranslations.php b/specials/SpecialSearchTranslations.php index 17c880e..364ed16 100644 --- a/specials/SpecialSearchTranslations.php +++ b/specials/SpecialSearchTranslations.php @@ -51,6 +51,7 @@ } public function execute( $par ) { + global $wgLanguageCode; $this->setHeaders(); $this->checkPermissions(); @@ -64,9 +65,11 @@ $this->opts = $opts = new FormOptions(); $opts->add( 'query', '' ); + $opts->add( 'sourcelanguage', '' ); $opts->add( 'language', '' ); $opts->add( 'group', '' ); $opts->add( 'grouppath', '' ); + $opts->add( 'filter', '' ); $opts->add( 'limit', $this->limit ); $opts->add( 'offset', 0 ); @@ -87,9 +90,23 @@ throw new ErrorPageError( 'tux-sst-solr-offline-title', 'tux-sst-solr-offline-body' ); } + $terms = array(); + if( $opts->getValue( 'filter' ) === 'outdated' ) { + if ( $opts->getValue( 'language' ) === '' ) { + $opts->add( 'language', $this->getLanguage()->getCode() ); + } + $collection = $this->applyFilter( $resultset ); + $docs = $collection['documents']; + $terms = $collection['terms']; + $documents = $this->getMessages( $docs ); + $total = $collection['total']; + } else { + $documents = $server->getDocuments( $resultset ); + $total = $server->getTotalHits( $resultset ); + } + // Part 1: facets $facets = $server->getFacets( $resultset ); - $total = $server->getTotalHits( $resultset ); $facetHtml = ''; if ( count( $facets['language'] ) > 0 ) { @@ -113,7 +130,6 @@ // Part 2: results $resultsHtml = ''; - $documents = $server->getDocuments( $resultset ); foreach ( $documents as $document ) { $text = $document['content']; @@ -145,7 +161,7 @@ $resultAttribs['data-translation'] = $helpers->getTranslation(); $resultAttribs['data-group'] = $groupId; - $uri = wfAppendQuery( $document['uri'], array( 'action' => 'edit' ) ); + $uri = wfAppendQuery( $handle->getTitle()->getCanonicalUrl(), array( 'action' => 'edit' ) ); $link = Html::element( 'a', array( 'href' => $uri, ), $this->msg( 'tux-sst-edit' )->text() ); @@ -209,6 +225,47 @@ $this->showSearch( $search, $count, $facetHtml, $resultsHtml ); } + protected function getMessages( $collect ) { + $ret = $documents = array(); + foreach ( $collect as $mkey => $value ) { + $ret = array(); + $ret['content'] = $collect[$mkey]['translation']; + $localid = explode( '/', $collect[$mkey]['title']->getPrefixedText() ); + $ret['localid'] = $localid[0]; + $ret['language'] = $localid[1]; + $documents[] = $ret; + } + return $documents; + } + + protected function applyFilter( $resultset ) { + $messages = $documents = $terms = array(); + $language = $this->opts->getValue( 'language' ); + foreach ( $resultset->getResults() as $document ) { + $data = $document->getData(); + $localid = explode( ':', $data['localid'] ); + $namespace = strtoupper( "NS_" . $localid[0] ); + $key = implode( ':', array( constant( $namespace ), $localid[1] ) ); + $messages[$key] = $data['content']; + $terms[] = $data['localid']; + } + + $definitions = new MessageDefinitions( $messages ); + $collection = MessageCollection::newFromDefinitions( $definitions, $language ); + $collection->filter( 'fuzzy', false ); + + $total = count( $collection ); + $offset = $collection->slice( $this->opts->getValue('offset'), $this->limit ); + $collection->loadTranslations(); + + foreach ( $collection->keys() as $mkey => $title ) { + $documents[$mkey]['title'] = $title; + $documents[$mkey]['definition'] = $messages[$mkey]; + $documents[$mkey]['translation'] = $collection[$mkey]->translation(); + } + return array( 'documents' => $documents, 'terms'=> $terms, 'total' => $total ); + } + protected function getLanguages( array $facet ) { $output = array(); diff --git a/ttmserver/ElasticSearchTTMServer.php b/ttmserver/ElasticSearchTTMServer.php index c0dbb55..7fffc1a 100644 --- a/ttmserver/ElasticSearchTTMServer.php +++ b/ttmserver/ElasticSearchTTMServer.php @@ -461,6 +461,7 @@ // Search interface public function search( $queryString, $opts, $highlight ) { + global $wgLanguageCode; $query = new \Elastica\Query(); // Allow searching either by message content or message id (page name @@ -472,7 +473,30 @@ $messageQuery = new \Elastica\Query\Term(); $messageQuery->setTerm( 'localid', $queryString ); $serchQuery->addShould( $messageQuery ); - $query->setQuery( $serchQuery ); + + if ( $opts->getValue( 'filter' ) === 'outdated' ) { + $filteredQuery = new \Elastica\Query\Filtered(); + $filterbool = new \Elastica\Filter\Bool(); + + if ( $opts->getValue( 'sourcelanguage' ) !== '' + && $opts->getValue( 'sourcelanguage' ) !== null + ) { + $sourcelanguage = $opts->getValue( 'sourcelanguage' ); + } else { + $sourcelanguage = $wgLanguageCode; + } + + $languageFilter = new \Elastica\Filter\Term(); + $languageFilter->setTerm( 'language', $sourcelanguage ); + $filterbool->addMust( $languageFilter ); + + $filteredQuery->setFilter($filterbool); + $filteredQuery->setQuery($serchQuery); + + $query->setQuery( $filteredQuery ); + } else { + $query->setQuery( $serchQuery ); + } $language = new \Elastica\Facet\Terms( 'language' ); $language->setField( 'language' ); @@ -495,7 +519,12 @@ // of the subfilters are reused. May not make a difference in this context. $filters = new \Elastica\Filter\Bool(); - $language = $opts->getValue( 'language' ); + if ( $opts->getValue( 'filter' ) === 'outdated' ) { + $language = ''; + } else { + $language = $opts->getValue( 'language' ); + } + if ( $language !== '' ) { $languageFilter = new \Elastica\Filter\Term(); $languageFilter->setTerm( 'language', $language ); @@ -526,11 +555,21 @@ 'post_tags' => array( $post ), ) ); - try { - return $this->getType()->getIndex()->search( $query ); - } catch ( \Elastica\Exception\ExceptionInterface $e ) { - throw new TTMServerException( $e->getMessage() ); - } + do { + try { + $resultset = $this->getType()->getIndex()->search( $query ); + } catch ( \Elastica\Exception\ExceptionInterface $e ) { + throw new TTMServerException( $e->getMessage() ); + } + $query->setFrom( 0 ); + $size = $query->getParam( 'size' ); + $query->setSize( $resultset->getTotalHits() ); + + } while ( $opts->getValue('filter') === 'outdated' + && $resultset->getTotalHits() > $size + ); + + return $resultset; } public function getFacets( $resultset ) { -- To view, visit https://gerrit.wikimedia.org/r/225005 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ic0326d688f799a91d308ebd1d78facccb2a4e61a Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Translate Gerrit-Branch: master Gerrit-Owner: Phoenix303 <divyalife...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits