Многоязычная PHP функция перевода gtranslate()

Ещё 26 мая 2011 года Google закрыл свой Translate API, но не отказался от использования того же JSON в переводчике. Поэтому мы имеем неофициальную возможность, использовать данный источник для создания PHP-функции, которая позволяет переводить слова, фразы и целые документы с одного языка на другой. В этой статье я хочу привести пример своей PHP-функции многоязычного перевода gtranslate(). Ничего сложного в ней нет, но тем не менее.

А начну я с того, что переводчик Google достаточно динамичный сервис. Помимо использования кнопки «Перевести», перевод, вводимых в форму данных, может осуществляться и автоматически, т.е. налету. Каждый такой перевод, это запрос к серверу. Таким образом, можно сказать, что наш запрос не создаст особой проблемы. Тем не менее, злоупотреблять данной возможностью, пожалуй, не стоит.

В своей функции перевода я использую file_get_contents()с контекстным потоком для подмены user_agent, у меня это Firefox 26, но Вы можете прописать и свой. В целом, этого должно хватить для придания запросу естественного вида. В тоже время, таким образом, мы не сможем скрыть реферер или IP-адрес и это стоит учесть.

Для получения результата в формате JSON параметру client надо присвоить значение x. В параметре qпередаётся текст, который надо перевести. Параметр slсодержит идентификатор языка с которого осуществляется перевод, а tl– идентификатор языка на который осуществляется перевод. И ещё, результат будет в кодировке UTF-8.

В принципе, ничего сложного, а вот и PHP-код функции:

function gtranslate($str, $lang_from, $lang_to) {
  $query_data = array(
    'client' => 'x',
    'q' => $str,
    'sl' => $lang_from,
    'tl' => $lang_to
  );
  $filename = 'http://translate.google.ru/translate_a/t';
  $options = array(
    'http' => array(
      'user_agent' => 'Mozilla/5.0 (Windows NT 6.0; rv:26.0) Gecko/20100101 Firefox/26.0',
      'method' => 'POST',
      'header' => 'Content-type: application/x-www-form-urlencoded',
      'content' => http_build_query($query_data)
    )
  );
  $context = stream_context_create($options);
  $response = file_get_contents($filename, false, $context);
  return json_decode($response);
}

Обращаю Ваше внимание на то, что функция gtranslate()вернёт объект с соответствующими свойствами. Таким образом, функция получается достаточно гибкой и динамичной.

Ниже я приведу пример получения значения строки перевода:

$gt = gtranslate('пример использования машинного масла', 'ru', 'en');
echo $gt->sentences['0']->trans; // вернёт строку: example of the use of engine oil

Для того чтобы просмотреть весь перечень свойств и значений, Вы можете использовать тот же var_dump():

echo '<pre>'; var_dump($gt); echo '</pre>';

В случае с приведённым примером, Вы получите следующее:

object(stdClass)#1 (3) {
  ["sentences"]=>
  array(1) {
    [0]=>
    object(stdClass)#2 (4) {
      ["trans"]=>
      string(32) "example of the use of engine oil"
      ["orig"]=>
      string(69) "пример использования машинного масла"
      ["translit"]=>
      string(0) ""
      ["src_translit"]=>
      string(38) "primer ispol'zovaniya mashinnogo masla"
    }
  }
  ["src"]=>
  string(2) "ru"
  ["server_time"]=>
  int(1)
}

Обратите внимание, что Google переводчик возвращает результат разбитый на предложения (англ. sentences), я бы назвал фрагменты. При большом объёме данных, мы получим целый массив таких предложений. Обработать их можно, например, так:

foreach ( $gt->sentences as $sentence ) {
  echo '<p>'. $sentence->trans .'</p>';
  echo '<p>'. $sentence->orig .'</p>';
}

С учётом того, что в моей функции теперь используется метод передачи данных POST, проблем с большими данными возникнуть не должно.

Интересным здесь является и параметр src_translit, которое содержит транслит фрагмента, в данном случае написание русского текста латинскими буквами. Впрочем, для этого лучше использовать локальный вариант, см. php-функцию translit(). Правда последняя заточена в большей степени для создания ЧПУ.

Возвращаясь же к Google переводчику, стоит ещё сказать и о параметре dict, который появляется при переводе одного слова. Он будет содержать ряд дополнительных словарных данных, вроде определения части речи, вариантов перевода и т.д., но тут смотрите сами.

На этом у меня всё. Спасибо за внимание. Удачи!