Google translate - где же баг ?

Discussion in 'PHP' started by Mirovan, 17 Apr 2009.

  1. Mirovan

    Mirovan Elder - Старейшина

    Joined:
    10 Apr 2005
    Messages:
    49
    Likes Received:
    0
    Reputations:
    0
    Есть класс и вызов его:

    PHP:
    <?php

    class Google_API_translator {
        public 
    $opts = array("text" => """language_pair" => "en|it");
        public 
    $out "";

        function 
    __construct() {
        }

        function 
    setOpts($opts) {
            if(
    $opts["text"] != ""$this->opts["text"] = $opts["text"];
            if(
    $opts["language_pair"] != ""$this->opts["language_pair"] = $opts["language_pair"];
        }

        function 
    translate() {
            
    $this->out "";
            
    $google_translator_url "http://translate.google.com/translate_t?langpair=".urlencode($this->opts["language_pair"])."&amp;";
            
    $google_translator_data .= "text=".urlencode($this->opts["text"]);

            
    $gphtml $this->postPage(
                array(
                    
    "url" => $google_translator_url,
                    
    "data" => $google_translator_data
                
    )
            );

            
    $out substr($gphtmlstrpos($gphtml"<div id=result_box dir=\"ltr\">"));
            
    $out substr($out29);
            
    $out substr($out0strpos($out"</div>"));
    //        $this->out = iconv('KOI8-R', 'UTF-8//IGNORE', $out);    // en|ru
            
    $this->out $out;
            return 
    $this->out;
        }

        
    // post form data to a given url using curl libs
        
    function postPage($opts) {
            
    $html "";
            if(
    $opts["url"] != "" && $opts["data"] != "") {
                
    $ch curl_init($opts["url"]);
                
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
                
    curl_setopt($chCURLOPT_HEADER1);
                
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
                
    curl_setopt($chCURLOPT_TIMEOUT15);
                
    curl_setopt($chCURLOPT_POST1);
                
    curl_setopt($chCURLOPT_POSTFIELDS$opts["data"]);
                
    $html curl_exec($ch);
                if(
    curl_errno($ch)) $html "";
                
    curl_close ($ch);
            }
            return 
    $html;
        }
    }
    ?>

    <?php
    $g 
    = new Google_API_translator();
    $g->setOpts(
        array(
            
    "text" => "привет",
            
    "language_pair" => "ru|en"
        
    )
    );
    $g->translate();
    echo 
    $g->out;
    ?>

    Че то старнное твориться с кодировкой - не могу перевести из RU в EN, кодировка чето гонит.

    mb_detect_encoding говорит что данные в UTF-8, однако возвращаются крокозябры. Между не киррил. языками эзал utf8_encode - было все ок.

    Тут же проблема :(

    Как сделать передачу данных и получение в UTF-8 чтобы не мучиться с кодировкой.
     
  2. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Для перевода с англ на русс достаточно вставить в самый верх исполняемого скрипта:

    <meta http-equiv="Content-Type" content="text/html; charset=KOI8-R">';

    а с русского на англ бред какой-то, прилетает в ASCii, в общем пока подумаю

    А русский оно посылает вообще хитро, вот такой строкой (слово "привет", например):

    %D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82

    что в переводе означает:

    привет

    что в переводе означает:

    "привет" ( CP1251 → UTF-8 )

    так что вот этого и надо прыгать:) Хотя непонятно вообще, почему ответ в ASCii прилетает, если перевод с русского на англ
     
    #2 Pashkela, 17 Apr 2009
    Last edited: 17 Apr 2009
  3. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Забавно конечно, но если добавить
    PHP:
                curl_setopt($chCURLOPT_USERAGENT'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8');
    То все будет работать. Мистика, конечно, но гуглу видимо наплевать на заголовки Accept-Charset и посылает в кодировке указанной в юзерагенте.
     
    _________________________
    1 person likes this.
  4. Mirovan

    Mirovan Elder - Старейшина

    Joined:
    10 Apr 2005
    Messages:
    49
    Likes Received:
    0
    Reputations:
    0
    ХМ, гугл какой то странный :)
    Спасибо за совет попробую данный код, хотя и сам думал отправить ему хидеры, только вот про юзер агента как то даже не подумал.