Переводчик Google на PHP

Категория: / DEV Блог / PHP (LAMP)
Сервис автоматического перевода текста от гугл с появлением API второй версии в конце лета 2011
внезапно стал платным. Переписав свои старые скрипты на новый лад программистам показывалось сообщение
"Daily Limit Exceeded", что означает что нужно занести денежку в гугль. Ценник на данный момент такой -
1 M текста = $20.00. Много это или мало?, зависит от решаемых задач. Что забавно, бесплатная альтернатива от
майкрософт в лице апи бинга продолжает работать и можно адаптировать скрипт под него.

Ну а мы с вами займемся простым незаконным парсингом результатов веб формы гугло переводчика, расположенной по адресу
http://translate.google.ru/translate_a

Если не превышать разумных пределов обращений к этой форме, можно успешно пользоваться ей вместо платного апи.

Скрипт переводчика google translate (PHP):

class google_translator_exception extends Exception {
}
 
class google_translator {
 
private $_user_agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
       
private $_sleep = 0;
 
private $_lang_s = '';
private $_lang_t = '';
 
private $_sources = array();
 
function set_sleep($s) {
    $this->_sleep = $s;
    return $this;
}
 
function set_langs($from, $to) {
    $this->_lang_s = $from;
    $this->_lang_t = $to;
    return $this;
}
 
function set_text($src) {
    $this->_sources = is_array($src) ? $src : array($src);
    return $this;
}
 
 
/**
* @param mixed array or text
* @return mixed array[0,1,2..] or text
*/

function translate($text = false) {
   
  $is_array = is_array($text);  
   
  $text = ($text === false) ? $this->_sources : (is_array($text) ? $text : array($text));  
 
  $result = array();
 
  $url = "http://translate.google.ru/translate_a/t?client=t&text=%s&hl={$this->_lang_t}&sl={$this->_lang_s}&tl={$this->_lang_t}&multires=1&otf=2&ssel=4&tsel=0&sc=1";
     
  $ch = curl_init();
         $Headers = array(
            "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
            "Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3",
            "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7"        
        );                                                  
  curl_setopt($ch, CURLOPT_HTTPHEADER, $Headers);  
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_USERAGENT, $this->_user_agent);
 
  foreach ($text as $k => $t) {
     
    $t = urlencode($t);
 
    $ref = "http://translate.google.ru/#{$this->_lang_s}|{$this->_lang_t}|{$t}"  ;
    curl_setopt($ch, CURLOPT_REFERER, $ref);
 
    curl_setopt($ch, CURLOPT_URL, sprintf($url, $t));
   
    $body = curl_exec($ch);
   
    if (CURLE_OK != curl_errno($ch)) {
      throw new google_translator_exception (curl_error($ch));
    }
 
    $body = iconv('KOI8-R', 'UTF-8', substr($body,2));
    $result[$k] = preg_replace('@^\[\"(.*)\",\".*$@Uu', '$1', $body);    
 
    if ($this->_sleep) sleep($this->_sleep);
       
  }
 
  curl_close($ch);
 
  return $is_array ? $result : array_pop($result);
 
 
}
}


Ну и тестирующий код

$gt = new google_translator();
 
echo
    $gt->set_langs('en', 'ru')
    ->set_text('hello babe, how are you')
    ->translate();