%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/extensions/Translate/webservices/ |
| Current File : /www/varak.net/wiki.varak.net/extensions/Translate/webservices/MicrosoftWebService.php |
<?php
/**
* Contains a class for querying external translation service.
*
* @file
* @author Niklas Laxström
* @author Ulrich Strauss
* @license GPL-2.0-or-later
*/
/**
* Implements support for Microsoft translation api v2.
* @see https://msdn.microsoft.com/en-us/library/ff512421.aspx
* @ingroup TranslationWebService
* @since 2013-01-01
*/
class MicrosoftWebService extends TranslationWebService {
public function getType() {
return 'mt';
}
protected function mapCode( $code ) {
$map = [
'zh-hant' => 'zh-CHT',
'zh-hans' => 'zh-CHS',
];
return isset( $map[$code] ) ? $map[$code] : $code;
}
protected function getMSTokens( $clientID, $clientSecret ) {
$authUrl = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/";
$params = [
'grant_type' => "client_credentials",
'scope' => "http://api.microsofttranslator.com",
'client_id' => $clientID,
'client_secret' => $clientSecret
];
$params = wfArrayToCgi( $params );
$options['method'] = 'POST';
$options['timeout'] = $this->config['timeout'];
$options['postData'] = $params;
$req = MWHttpRequest::factory( $authUrl, $options );
$status = $req->execute();
if ( !$status->isOK() ) {
$error = $req->getContent();
// Most likely a timeout or other general error
throw new TranslationWebServiceException(
'Http::get failed: ' . $authUrl . serialize( $error ) . serialize( $status )
);
}
$ret = $req->getContent();
$response = json_decode( $ret, true );
if ( isset( $response['error'] ) ) {
throw new TranslationWebServiceException( $response['error_description'] );
}
return $response['access_token'];
}
protected function doPairs() {
if ( !isset( $this->config['clientId'] ) || !isset( $this->config['clientSecret'] ) ) {
throw new TranslationWebServiceConfigurationException( 'clientId or clientSecret is not set' );
}
$clientID = $this->config['clientId'];
$clientSecret = $this->config['clientSecret'];
// get access token from service
$accessToken = $this->getMSTokens( $clientID, $clientSecret );
$options = [];
$options['method'] = 'GET';
$options['timeout'] = $this->config['timeout'];
$url = 'http://api.microsofttranslator.com/V2/Http.svc/GetLanguagesForTranslate?';
$req = MWHttpRequest::factory( $url, $options );
$req->setHeader( 'Authorization', "Bearer $accessToken" );
$status = $req->execute();
if ( !$status->isOK() ) {
$error = $req->getContent();
// Most likely a timeout or other general error
throw new TranslationWebServiceException(
'Http::get failed:' . serialize( $error ) . serialize( $status )
);
}
$xml = simplexml_load_string( $req->getContent() );
$languages = [];
foreach ( $xml->string as $language ) {
$languages[] = (string)$language;
}
// Let's make a cartesian product, assuming we can translate from any language to any language
$pairs = [];
foreach ( $languages as $from ) {
foreach ( $languages as $to ) {
$pairs[$from][$to] = true;
}
}
return $pairs;
}
protected function getQuery( $text, $from, $to ) {
if ( !isset( $this->config['clientId'] ) || !isset( $this->config['clientSecret'] ) ) {
throw new TranslationWebServiceConfigurationException(
'clientId or clientSecret is not set'
);
}
$text = trim( $text );
$text = $this->wrapUntranslatable( $text );
// get access token from service
$accessToken = $this->getMSTokens(
$this->config['clientId'],
$this->config['clientSecret']
);
$params = [
'text' => $text,
'from' => $from,
'to' => $to,
];
$headers = [
'Authorization' => 'Bearer ' . $accessToken,
];
return TranslationQuery::factory( $this->config['url'] )
->timeout( $this->config['timeout'] )
->queryParameters( $params )
->queryHeaders( $headers );
}
protected function parseResponse( TranslationQueryResponse $reply ) {
$body = $reply->getBody();
$text = preg_replace( '~<string.*>(.*)</string>~s', '\\1', $body );
$text = Sanitizer::decodeCharReferences( $text );
$text = $this->unwrapUntranslatable( $text );
return $text;
}
/// Override from parent
protected function wrapUntranslatable( $text ) {
$pattern = '~%[^% ]+%|\$\d|{VAR:[^}]+}|{?{(PLURAL|GRAMMAR|GENDER):[^|]+\||%(\d\$)?[sd]~';
$wrap = '<span translate="no">\0</span>';
return preg_replace( $pattern, $wrap, $text );
}
/// Override from parent
protected function unwrapUntranslatable( $text ) {
$pattern = '~<span translate="no">(.*?)</span>~';
return preg_replace( $pattern, '\1', $text );
}
}