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(); }