AVE.CMS v3.28
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
4.1 KiB

8 years ago
<?php
/*
* Класс для использования API переводчика от Яндекс
* Идеален для славянских языков, в частности русский <-> украинский
*/
class Yandex_Translate {
protected $rootURL = 'http://translate.yandex.ru/tr.json';
protected $translatePath = '/translate';
protected $langCodesPairsListPath = '/getLangs';
/**
* @var string - символ или тег конца абзаца
* Варианты: вывод в браузер - <br />, в файл - \n, может зависеть от ОС
*/
public $eolSymbol = '<br />';
/**
* @var string - разделитель языков в запросе. Пока однозначно так определено Яндексом
*/
public $langDelimiter = '-';
protected $cURLHeaders = array(
'User-Agent' => "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0; .NET CLR 2.0.50727)",
'Accept' => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
'Accept-Language' => "ru,en-us;q=0.7,en;q=0.3",
'Accept-Encoding' => "gzip,deflate",
'Accept-Charset' => "utf-8;q=0.7,*;q=0.7",
'Keep-Alive' => '300',
'Connection' => 'keep-alive',
);
protected function yandexConnect($path, $transferData = array()) {
$res = curl_init();
$url = $this->rootURL.$path.'?'.http_build_query($transferData, '', '&');
$options = array(
CURLOPT_URL => $url,
CURLOPT_HTTPHEADER => $this->cURLHeaders,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 30,
);
curl_setopt_array($res, $options);
$response = curl_exec($res);
curl_close($res);
return $response;
}
/**
* @return mixed Получаем пары перевода from-to в виде 'ru-uk', 'en-fr'
*/
public function yandexGetLangsPairs(){
$jsonLangsPairs = $this->yandexConnect($this->langCodesPairsListPath);
$rawOut = json_decode($jsonLangsPairs, true);
return $rawOut['dirs'];
}
/**
* @return получаем все языки FROM
*/
public function yandexGet_FROM_Langs(){
$langPairs = $this->yandexGetLangsPairs();
foreach ($langPairs as $langPair){
$smallArray = explode($this->langDelimiter, $langPair);
$outerArray[$smallArray[0]] = $smallArray[0];
}
return $outerArray;
}
/**
* @return получаем все языки TO
*/
public function yandexGet_TO_Langs(){
$langPairs = $this->yandexGetLangsPairs();
foreach ($langPairs as $langPair){
$smallArray = explode($this->langDelimiter, $langPair);
$outerArray[$smallArray[1]] = $smallArray[1];
}
return $outerArray;
}
/**
* Собственно перевод
* @param $fromLang - с какого, код языка, 'ru' напр.
* @param $toLang - на какой, код языка. Следите: не все языки FROM доступны в TO
* @param $text - переводимый текст
* @return mixed - перевод. Следите за разделителями eolSymbol
*/
public function yandexTranslate($fromLang, $toLang, $text) {
//один из языков должен быть ru - проверяем, хотя переводчик и так вернет текст - сообщение об ошибке
if ($fromLang != 'ru' AND $toLang != 'ru'){
return 'Sorry, translation directly from '.$fromLang.' to '.$toLang.' is impossible';
}
$transferData = array(
'lang' => $fromLang.'-'.$toLang,
'text' => $text,
);
$rawTranslate = $this->yandexConnect($this->translatePath, $transferData);
$rawTranslate = trim($rawTranslate, '"');
$translate = str_replace('\n', $this->eolSymbol, $rawTranslate);
return $translate;
}
}
?>