protected function getAvailableTranslationServices()
 {
     global $wgTranslateTranslationServices;
     $good = array();
     foreach ($wgTranslateTranslationServices as $id => $config) {
         if (TTMServer::factory($config) instanceof SearchableTTMServer) {
             $good[] = $id;
         }
     }
     return $good;
 }
 public function getData()
 {
     $suggestions = array();
     $text = $this->getDefinition();
     $from = $this->group->getSourceLanguage();
     $to = $this->handle->getCode();
     // "Local" queries using a client can't be run in parallel with web services
     global $wgTranslateTranslationServices;
     foreach ($wgTranslateTranslationServices as $name => $config) {
         $server = TTMServer::factory($config);
         try {
             if ($server instanceof ReadableTTMServer) {
                 // Except if they are public, we can call back via API
                 if (isset($config['public']) && $config['public'] === true) {
                     continue;
                 }
                 $query = $server->query($from, $to, $text);
             } else {
                 continue;
             }
         } catch (Exception $e) {
             // Not ideal to catch all exceptions
             continue;
         }
         foreach ($query as $item) {
             $item['service'] = $name;
             $item['source_language'] = $from;
             $item['local'] = $server->isLocalSuggestion($item);
             $item['uri'] = $server->expandLocation($item);
             $suggestions[] = $item;
         }
     }
     // Results from web services
     foreach ($this->getQueryData() as $queryData) {
         $sugs = $this->formatSuggestions($queryData);
         $suggestions = array_merge($suggestions, $sugs);
     }
     $suggestions = TTMServer::sortSuggestions($suggestions);
     // Must be here to not mess up the sorting function
     $suggestions['**'] = 'suggestion';
     return $suggestions;
 }
 public function testSearchableTTMServer()
 {
     global $wgTranslateTestTTMServer;
     if (!$wgTranslateTestTTMServer) {
         $this->markTestSkipped('No test TTMServer available');
     }
     $server = TTMServer::factory($wgTranslateTestTTMServer);
     $solarium = $server->getSolarium();
     // Empty it
     $update = $solarium->createUpdate();
     $update->addDeleteQuery('*:*');
     $update->addCommit();
     $solarium->update($update);
     // Check that it is empty indeed
     $select = $solarium->createSelect();
     $select->setRows(0);
     $select->setQuery('*:*');
     $result = $solarium->select($select);
     $this->assertEquals(0, $result->getNumFound());
     // Add one definition
     $title = Title::newFromText('MediaWiki:one/en');
     $page = WikiPage::factory($title);
     $content = ContentHandler::makeContent('1', $title);
     $page->doEditContent($content, __METHOD__);
     $select = $solarium->createSelect();
     $select->setRows(1);
     $select->setQuery('*:*');
     $result = $solarium->select($select);
     $this->assertEquals(1, $result->getNumFound());
     $doc = null;
     foreach ($result as $doc) {
         // @todo FIXME Empty foreach statement.
     }
     $this->assertEquals(wfWikiId(), $doc->wiki);
     $this->assertEquals('en', $doc->language);
     $this->assertEquals('1', $doc->content);
     $this->assertEquals(array('ttmserver-test'), $doc->group);
     // Add one translation
     $title = Title::newFromText('MediaWiki:one/fi');
     $page = WikiPage::factory($title);
     $content = ContentHandler::makeContent('yksi', $title);
     $page->doEditContent($content, __METHOD__);
     $select = $solarium->createSelect();
     $select->setRows(1);
     $select->setQuery('language:fi');
     $result = $solarium->select($select);
     $this->assertEquals(1, $result->getNumFound());
     $doc = null;
     foreach ($result as $doc) {
         // @todo FIXME Empty foreach statement.
     }
     $this->assertEquals('yksi', $doc->content);
     $this->assertEquals(array('ttmserver-test'), $doc->group);
     // Update definition
     $title = Title::newFromText('MediaWiki:one/en');
     $page = WikiPage::factory($title);
     $content = ContentHandler::makeContent('1-updated', $title);
     $page->doEditContent($content, __METHOD__);
     $select = $solarium->createSelect();
     $select->setQuery('language:en');
     $result = $solarium->select($select);
     $this->assertEquals(2, $result->getNumFound(), 'Old and new definition exists');
     // Translation is fuzzied
     $title = Title::newFromText('MediaWiki:one/fi');
     $page = WikiPage::factory($title);
     $content = ContentHandler::makeContent('!!FUZZY!!yksi', $title);
     $page->doEditContent($content, __METHOD__);
     $select = $solarium->createSelect();
     $select->setQuery('language:fi');
     $result = $solarium->select($select);
     $this->assertEquals(0, $result->getNumFound());
     // Translation is udpated
     $title = Title::newFromText('MediaWiki:one/fi');
     $page = WikiPage::factory($title);
     $content = ContentHandler::makeContent('yksi-päiv', $title);
     $page->doEditContent($content, __METHOD__);
     $select = $solarium->createSelect();
     $select->setQuery('language:fi');
     $result = $solarium->select($select);
     $this->assertEquals(1, $result->getNumFound());
     $doc = null;
     foreach ($result as $doc) {
         // @todo FIXME Empty foreach statement.
     }
     $this->assertEquals('yksi-päiv', $doc->content);
     // And now the messages should be orphaned
     global $wgHooks;
     $wgHooks['TranslatePostInitGroups'] = array();
     MessageGroups::singleton()->recache();
     MessageIndex::singleton()->rebuild();
     self::runJobs();
     $select = $solarium->createSelect();
     $select->setQuery('*:*');
     $result = $solarium->select($select);
     $this->assertEquals(2, $result->getNumFound(), 'One definition and one translation exists');
     foreach ($result as $doc) {
         $this->assertEquals(null, $doc->group, 'Messages are orphaned');
     }
     // And message deletion
     $title = Title::newFromText('MediaWiki:one/fi');
     $page = WikiPage::factory($title);
     $page->doDeleteArticle(__METHOD__);
     $select = $solarium->createSelect();
     $select->setQuery('language:fi');
     $result = $solarium->select($select);
     $this->assertEquals(0, $result->getNumFound());
 }
 protected function exportGroup(MessageGroup $group, $config)
 {
     $server = TTMServer::factory($config);
     $server->setLogger($this);
     $id = $group->getId();
     $sourceLanguage = $group->getSourceLanguage();
     $stats = MessageGroupStats::forGroup($id);
     $collection = $group->initCollection($sourceLanguage);
     $collection->filter('ignored');
     $collection->initMessages();
     $server->beginBatch();
     $inserts = array();
     foreach ($collection->keys() as $mkey => $title) {
         $handle = new MessageHandle($title);
         $inserts[] = array($handle, $sourceLanguage, $collection[$mkey]->definition());
     }
     while ($inserts !== array()) {
         $batch = array_splice($inserts, 0, $this->mBatchSize);
         $server->batchInsertDefinitions($batch);
     }
     $inserts = array();
     foreach ($stats as $targetLanguage => $numbers) {
         if ($targetLanguage === $sourceLanguage) {
             continue;
         }
         if ($numbers[MessageGroupStats::TRANSLATED] === 0) {
             continue;
         }
         $collection->resetForNewLanguage($targetLanguage);
         $collection->filter('ignored');
         $collection->filter('translated', false);
         $collection->loadTranslations();
         foreach ($collection->keys() as $mkey => $title) {
             $handle = new MessageHandle($title);
             $inserts[] = array($handle, $sourceLanguage, $collection[$mkey]->translation());
         }
         while (count($inserts) >= $this->mBatchSize) {
             $batch = array_splice($inserts, 0, $this->mBatchSize);
             $server->batchInsertTranslations($batch);
         }
     }
     while ($inserts !== array()) {
         $batch = array_splice($inserts, 0, $this->mBatchSize);
         $server->batchInsertTranslations($batch);
     }
     $server->endBatch();
 }