'fil',
'zh-hant' => 'zh-Hant',
'zh-hans' => 'zh-Hans',
'sr-ec' => 'sr-Cyrl',
'sr-el' => 'sr-Latn',
'pt-br' => 'pt',
];
return $map[$code] ?? $code;
}
protected function doPairs() {
if ( !isset( $this->config['key'] ) ) {
throw new TranslationWebServiceConfigurationException( 'key is not set' );
}
$key = $this->config['key'];
$options = [];
$options['method'] = 'GET';
$options['timeout'] = $this->config['timeout'];
$url = $this->config['url'] . '/languages?api-version=3.0';
$req = MWHttpRequest::factory( $url, $options );
$req->setHeader( 'Ocp-Apim-Subscription-Key', $key );
$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 )
);
}
$json = $req->getContent();
$response = json_decode( $json, true );
if ( !isset( $response[ 'translation' ] ) ) {
throw new TranslationWebServiceException(
'Unable to fetch list of available languages: ' . $json
);
}
$languages = array_keys( $response[ 'translation' ] );
// 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['key'] ) ) {
throw new TranslationWebServiceConfigurationException( 'key is not set' );
}
$key = $this->config['key'];
$text = trim( $text );
$text = $this->wrapUntranslatable( $text );
$url = $this->config['url'] . '/translate';
$params = [
'api-version' => '3.0',
'from' => $from,
'to' => $to,
'textType' => 'html',
];
$headers = [
'Ocp-Apim-Subscription-Key' => $key,
'Content-Type' => 'application/json',
];
$body = json_encode( [ [ 'Text' => $text ] ] );
if ( strlen( $body ) > 5000 ) {
throw new TranslationWebServiceInvalidInputException( 'Source text too long' );
}
return TranslationQuery::factory( $url )
->timeout( $this->config['timeout'] )
->queryParameters( $params )
->queryHeaders( $headers )
->postWithData( $body );
}
protected function parseResponse( TranslationQueryResponse $reply ) {
$body = $reply->getBody();
$response = json_decode( $body, true );
if ( !isset( $response[ 0 ][ 'translations' ][ 0 ][ 'text' ] ) ) {
throw new TranslationWebServiceException(
'Unable to parse translation response: ' . $body
);
}
$text = $response[ 0 ][ 'translations' ][ 0 ][ 'text' ];
$text = $this->unwrapUntranslatable( $text );
return $text;
}
/// Override from parent
protected function wrapUntranslatable( $text ) {
$pattern = '~%[^% ]+%|\$\d|{VAR:[^}]+}|{?{(PLURAL|GRAMMAR|GENDER):[^|]+\||%(\d\$)?[sd]~';
$wrap = '\0';
return preg_replace( $pattern, $wrap, $text );
}
/// Override from parent
protected function unwrapUntranslatable( $text ) {
$pattern = '~\s*(.*?)\s*~';
return preg_replace( $pattern, '\1', $text );
}
}