УрокПрограммный перевод текста с помощью Google Translate
Не так давно поставили передо мной задачу: парсить сайт на английском языке, попутно переводя его на русский. И именно перевод вызвал затруднения. Раньше ведь всё проще было, когда существовал бесплатный . А теперь лавочку прикрыли, попросив выложить на стол по 20$ за каждый миллион переведённых символов. Деньги совсем не большие, но русская душа требует халявы. Поэтому немного подумав, я нашёл вполне легальный спосом обхода нововведения. А именно - воспользоваться их сервисом со своего сайта :)
Без долгих введений, к бою:
// Собираем массив с параметрами для перевода. $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. С японского переводит довольно слабенько.
- SplasH
- 22.02.2012
- 1682
Комментарии
забанят ведь! у яндекса есть бесплатный переводчик с api. говорят переводит неплохо http://habrahabr.ru/blogs/php/138563/
Спасибо за наводку. Посмотрел исходники с хабра - по сути, то же самое, что делаю я с гуглом, только через cURL. И нет переводов со многих других языков.
Насколько знаю, использовать программно сервис запрещено в соглашении. Поэтому способ всё же нелегальный.
Ну и исправьте опечатку "спосом обхода" =)
Внимательно прочитал условия пользования сервисами Google, но ничего запрещающего вроде как не нашёл. За опечатку спасибо.
Спасибо! Только я не совсем понял куда именно вставлять код?
В любое место, где вам нужно перевести полученную строку. Хоть в ноду с php фильтром))
Комментировать