УрокПрограммный перевод текста с помощью 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
Аватар пользователя Spleshka
Spleshka написал:

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

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

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

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

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

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

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

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

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

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

23.02.2012 14:35
Аватар пользователя Володимир
Володимир написал:

В мене вибиває на локальному сервері вибиває
Fatal error: Call to undefined function drupal_http_request()
Допоможіть будь ласка!

10.07.2012 14:12
Аватар пользователя xr0m3oz
xr0m3oz написал:

Выдает ISO-8859-1
ru -> ua нужно сделать перевод

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

И все равно ероглифы,можете помочь?

25.12.2012 01:32
Аватар пользователя Spleshka
Spleshka написал:

$data = iconv('KOI8-R', 'UTF-8', $result->data);

25.12.2012 17:39
Аватар пользователя xr0m3oz
xr0m3oz написал:

$data = iconv('KOI8-R', 'UTF-8', $result->data); Так пробовал тоже, самого начала,но оно в иероглифах,
после чего попробовал ваш второй способ просмотрел лог ответа
[content-type] => text/javascript; charset=ISO-8859-1

И по вашему второму способу, попробовал
$data = mb_convert_encoding($result->data, 'UTF-8', 'ISO-8859-1');

Вообщем не тот и не тот способ не работает по переводу, с русского на украинский.
Еще возможно есть идеи?

25.12.2012 21:48
Аватар пользователя Spleshka
Spleshka написал:

Да, жми по ссылкам и пробуй :)

25.12.2012 21:56
Аватар пользователя xr0m3oz
xr0m3oz написал:

Да и до этого как помощи просить гуглил,и вот еще гуглил , пробывал в итоге так и ничего не вышло...

25.12.2012 23:34
Аватар пользователя xr0m3oz
xr0m3oz написал:

Еще проблема в том что когда ввожу текст в
'text' => 'Dude! This is awesome!', // Текст для перевода.

Что то русское дебагинг даже не срабатывает...

26.12.2012 00:33
Аватар пользователя Олег Корнелюк
Олег Корнелюк написал:

после неудачных попыток конвертации немножко модифицировал код и все получилось:

// Собираем массив с параметрами для перевода.
$data = array(
  'client' => 'x', // Не меняйте этот параметр.
  'text' => 'Dude! This is awesome!', // Текст для перевода.
  'sl' => 'en',  // Язык, с которого переводим.
  'tl' => 'ru', // Язык, на который переводим.
  'ie' => 'UTF-8',
  'oe' => 'UTF-8',
);
// Декодируем полученые данные.
$data = $result->data;
29.05.2014 23:17
Аватар пользователя Koka
Koka написал:

Если вы ищете практичный локализационный инструмент для перевода вашего сайта или мобильного приложения на другой язык, присмотритесь к https://poeditor.com/

05.02.2015 17:46

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