mirror of
https://github.com/avecms/AVE.cms.git
synced 2025-01-22 07:20:07 +00:00
120 lines
4.1 KiB
PHP
120 lines
4.1 KiB
PHP
<?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;
|
||
|
||
}
|
||
}
|
||
?>
|