jenkins-bot has submitted this change and it was merged.
Change subject: Get untranslated messages in the target language, using
MessageCollection
......................................................................
Get untranslated messages in the target language, using MessageCollection
Steps:
1. Fetch 1000 messages for the query string in the source language.
2. Create message definitions for all message keys found in step 1.
3. Filter to get all the translations of said messages not existing
in the selected target language.
4. After filtering, if the messages count is less than the limit, say 25,
then repeat step 1 to fetch the next 1000 messages until found the remaining.
By default:
* the source language is the wiki's content language,
* the target language is the interface language.
Use parameter 'filter=untranslated' to get untranslated messages.
Bug: T101220
Change-Id: I3b24a6170a1b27f5e7b8ae5828afd32d85bfeb2b
Followup-id: I246aeea623c1d81f5ce148185be8c9c9ef8f0923
---
M specials/SpecialSearchTranslations.php
1 file changed, 96 insertions(+), 4 deletions(-)
Approvals:
Nikerabbit: Looks good to me, approved
jenkins-bot: Verified
diff --git a/specials/SpecialSearchTranslations.php
b/specials/SpecialSearchTranslations.php
index 527ca40..ac3566d 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', $wgLanguageCode );
$opts->add( 'language', '' );
$opts->add( 'group', '' );
$opts->add( 'grouppath', '' );
+ $opts->add( 'filter', '' );
$opts->add( 'limit', $this->limit );
$opts->add( 'offset', 0 );
@@ -80,8 +83,42 @@
return;
}
+ $filter = $opts->getValue( 'filter' );
try {
- $resultset = $server->search( $queryString, $opts,
$this->hl );
+ if ( $filter !== '' ) {
+ $documents = array();
+ $total = $start = 0;
+ $offset = $opts->getValue( 'offset' );
+ $limit = $opts->getValue( 'limit' );
+ $size = 1000;
+
+ $options = clone( $opts );
+ $options->setValue( 'limit', $size );
+ $options->setValue( 'language',
$opts->getValue( 'sourcelanguage' ) );
+ do {
+ $options->setValue( 'offset', $start );
+ $resultset = $server->search(
$queryString, $options, $this->hl );
+
+ list( $results, $offsets ) =
$this->extractMessages(
+ $resultset,
+ $offset,
+ $limit
+ );
+ $offset = $offsets['start'] +
$offsets['left'] - $offsets['total'];
+ $limit = $limit - $offsets['left'];
+ $total = $total + $offsets['total'];
+
+ $documents = array_merge( $documents,
$results );
+ $start = $start + $size;
+ } while (
+ $offsets['start'] + $offsets['left'] >=
$offsets['total'] &&
+ $resultset->getTotalHits() > $start
+ );
+ } else {
+ $resultset = $server->search( $queryString,
$opts, $this->hl );
+ $documents = $server->getDocuments( $resultset
);
+ $total = $server->getTotalHits( $resultset );
+ }
} catch ( TTMServerException $e ) {
error_log( 'Translation search server unavailable:' .
$e->getMessage() );
throw new ErrorPageError( 'tux-sst-solr-offline-title',
'tux-sst-solr-offline-body' );
@@ -89,7 +126,6 @@
// Part 1: facets
$facets = $server->getFacets( $resultset );
- $total = $server->getTotalHits( $resultset );
$facetHtml = '';
if ( count( $facets['language'] ) > 0 ) {
@@ -113,7 +149,6 @@
// Part 2: results
$resultsHtml = '';
- $documents = $server->getDocuments( $resultset );
foreach ( $documents as $document ) {
$text = $document['content'];
@@ -144,7 +179,7 @@
$resultAttribs['data-translation'] =
$helpers->getTranslation();
$resultAttribs['data-group'] = $groupId;
- $uri = wfAppendQuery( $document['uri'], array(
'action' => 'edit' ) );
+ $uri = $title->getLocalUrl( array( 'action' =>
'edit' ) );
$link = Html::element(
'a',
array( 'href' => $uri ),
@@ -219,6 +254,63 @@
$this->showSearch( $search, $count, $facetHtml, $resultsHtml );
}
+ /*
+ * Extract messages from the resultset and build message definitions.
+ * Create a message collection from the definitions in the target
language.
+ * Filter the message collection to get filtered messages.
+ * Slice messages according to limit and offset given.
+ */
+ protected function extractMessages( $resultset, $offset, $limit ) {
+ $messages = $documents = $ret = array();
+ $server = TTMServer::primary();
+
+ $language = $this->getLanguage()->getCode();
+ foreach ( $resultset->getResults() as $document ) {
+ $data = $document->getData();
+
+ if ( !$server->isLocalSuggestion( $data ) ) {
+ continue;
+ }
+
+ $title = Title::newFromText( $data['localid'] );
+ if ( !$title ) {
+ continue;
+ }
+
+ $handle = new MessageHandle( $title );
+ if ( !$handle->isValid() ) {
+ continue;
+ }
+
+ $key = $title->getNamespace() . ':' .
$title->getDBKey();
+ $messages[$key] = $data['content'];
+ }
+
+ $definitions = new MessageDefinitions( $messages );
+ $collection = MessageCollection::newFromDefinitions(
$definitions, $language );
+ $collection->filter( 'hastranslation', true );
+
+ $total = count( $collection );
+ $offset = $collection->slice( $offset, $limit );
+ $left = count( $collection );
+
+ $offsets = array(
+ 'start' => $offset[2],
+ 'left' => $left,
+ 'total' => $total,
+ );
+
+ foreach ( $collection->keys() as $mkey => $title ) {
+ $documents[$mkey]['content'] = $messages[$mkey];
+ $handle = new MessageHandle( $title );
+ $documents[$mkey]['localid'] =
$handle->getTitleForBase()->getPrefixedText();
+ $documents[$mkey]['language'] = $language;
+ $ret[] = $documents[$mkey];
+ }
+
+ return array( $ret, $offsets );
+ }
+
protected function getLanguages( array $facet ) {
$output = array();
--
To view, visit https://gerrit.wikimedia.org/r/220447
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I3b24a6170a1b27f5e7b8ae5828afd32d85bfeb2b
Gerrit-PatchSet: 16
Gerrit-Project: mediawiki/extensions/Translate
Gerrit-Branch: master
Gerrit-Owner: Phoenix303 <[email protected]>
Gerrit-Reviewer: Nemo bis <[email protected]>
Gerrit-Reviewer: Nikerabbit <[email protected]>
Gerrit-Reviewer: Phoenix303 <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits