УрокПрограммный перевод текста с помощью Google Translate

Не так давно поставили передо мной задачу: парсить сайт на английском языке, попутно переводя его на русский. И именно перевод вызвал затруднения. Раньше ведь всё проще было, когда существовал бесплатный Google Translate API. А теперь лавочку прикрыли, попросив выложить на стол по 20$ за каждый миллион переведённых символов. Деньги совсем не большие, но русская душа требует халявы. Поэтому немного подумав, я нашёл вполне легальный спосом обхода нововведения. А именно - воспользоваться их сервисом Google Translate со своего сайта :)

Без долгих введений, к бою:

// Собираем массив с параметрами для перевода.
$data = array(
  'client' => 'x', // Не меняйте этот параметр.
  'text' => 'Dude! This is awesome!', // Текст для перевода.
  'sl' => 'en',  // Язык, с которого переводим.
  'tl' => 'ru', // Язык, на который переводим.
);
 
// Кодируем их для передачи в урл.
$data = http_build_query($data, '', '&');
 
// Собираем массив для отправки запроса в google translate.
$options = array(
  'method' => 'POST',
  'data' => $data,
);
 
// Отправляем запрос и получаем ответ.
$result = drupal_http_request('http://translate.google.ru/translate_a/t', $options);
 
// Декодируем полученые данные.
$data = iconv('KOI8-R', 'UTF-8', $result->data);
$data = json_decode($data);
 
// Данные возвращаются в виде массива, у которого
// одно предложение = один элемент массива.
// Поэтому собираем эти предложения в текст.
$output = '';
foreach ($data->sentences as $sencence) {
  $output .= $sencence->trans;
}
 
// А вот и переведённый текст!
print $output;

Все комментарии в коде. Однако у меня есть дополнения по поводу декодирования полученных данных. Когда я получаю перевод с английского языка, ответ от сервера приходит в кодировке KOI8-R. Но при переводе с других языков ответ может приходить в другой кодировке. Поэтому для того, чтобы получить правильный результат от перевода текста, первым делом надо посмотреть кодировку полученных данных. Сделать это можно, например, так:

$result = drupal_http_request('http://translate.google.ru/translate_a/t', $options);
// После получения результата выводим все полученные данные на экран.
debug($result);

В результате у меня получился приблизительно такой ответ:

stdClass Object
(
    [request] => POST /translate_a/t HTTP/1.0
Host: translate.google.ru
User-Agent: Drupal (+http://drupal.org/)
Content-Length: 52
 
client=x&text=Dude%21+This+is+awesome%21&sl=en&tl=ru
    [data] => {"sentences":[{"trans":"�����! ","orig":"Dude!","translit":"Chuvak! ","src_translit":""},{"trans":"��� ����������!","orig":"This is awesome!","translit":"Eto potryasayushche!","src_translit":""}],"src":"en","server_time":1}
    [protocol] => HTTP/1.0
    [status_message] => OK
    [headers] => Array
        (
            [pragma] => no-cache
            [date] => Wed, 22 Feb 2012 00:17:22 GMT
            [expires] => Wed, 22 Feb 2012 00:17:22 GMT
            [cache-control] => private, max-age=600
            [content-type] => text/javascript; charset=KOI8-R
            [content-language] => ru
            [set-cookie] => PREF=ID=455ed6e84ef4b08b:NW=1:TM=1329869842:LM=1329869842:S=esTmJx-MV_kDypXE; expires=Fri, 21-Feb-2014 00:17:22 GMT; path=/; domain=.google.ru
            [x-content-type-options] => nosniff
            [content-disposition] => attachment
            [server] => HTTP server (unknown)
            [x-xss-protection] => 1; mode=block
        )
 
    [code] => 200
)

Здесь нас интересует вот эта строка, которая содержит кодировку полученных данных:

[content-type] => text/javascript; charset=KOI8-R

В принципе, на этом можно было бы и закончить. Но я хочу поделиться опытом перевода с японского языка (да я сам в восторге).

При переводе через Google Translate с японского на русский, ответ я получал в кодировке ISO-8859-1. Казалось бы - подставляй его в iconv() и конвертируй себе на здоровье. Однако, перепробовав и iconv(), и utf8_encode(), и ещё огромное количество других (иногда даже самописных) конвертеров, я, наконец, нашёл рабочий вариант и мой японский враг был повержен:

$data = mb_convert_encoding($result->data, 'UTF-8', 'ISO-8859-1');

P.S. С японского переводит довольно слабенько.

Комментарии

Аватар пользователя xandeadx
xandeadx написал:

забанят ведь! у яндекса есть бесплатный переводчик с api. говорят переводит неплохо http://habrahabr.ru/blogs/php/138563/

22.02.2012 04:54
Аватар пользователя SplasH
SplasH написал:

Спасибо за наводку. Посмотрел исходники с хабра - по сути, то же самое, что делаю я с гуглом, только через cURL. И нет переводов со многих других языков.

22.02.2012 14:48
Аватар пользователя unic
unic написал:

Насколько знаю, использовать программно сервис запрещено в соглашении. Поэтому способ всё же нелегальный.

Ну и исправьте опечатку "спосом обхода" =)

22.02.2012 09:47
Аватар пользователя SplasH
SplasH написал:

Внимательно прочитал условия пользования сервисами Google, но ничего запрещающего вроде как не нашёл. За опечатку спасибо.

22.02.2012 14:55
Аватар пользователя Роман
Роман написал:

Спасибо! Только я не совсем понял куда именно вставлять код?

23.02.2012 01:35
Аватар пользователя SplasH
SplasH написал:

В любое место, где вам нужно перевести полученную строку. Хоть в ноду с php фильтром))

23.02.2012 14:35

Комментировать

                                                                                       
888b 88 88 88 888b 88 I8, 8 ,8I ,ad8888ba,
8888b 88 88 88 8888b 88 `8b d8b d8' d8"' `"8b
88 `8b 88 88 88 88 `8b 88 "8, ,8"8, ,8" d8'
88 `8b 88 88aaaaaaaa88 88 `8b 88 Y8 8P Y8 8P 88
88 `8b 88 88""""""""88 88 `8b 88 `8b d8' `8b d8' 88 88888
88 `8b 88 88 88 88 `8b 88 `8a a8' `8a a8' Y8, 88
88 `8888 88 88 88 `8888 `8a8' `8a8' Y8a. .a88
88 `888 88 88 88 `888 `8' `8' `"Y88888P"

Enter the code depicted in ASCII art style.