Проверьте мою функцию перевода через Google Translate. И еще пара вопросов

123 4
[Удален]
2799

Сделал перевод через Google API. Предусмотрел момент, когда входящий текст очень большой, тогда я его разбиваю на слова, перевожу поочередно фрагменты, а затем леплю все переведенные обратно в целый текст. Вопроса два:

1. Проверьте, плз, нет ли в коде каких-либо "закравшихся ошибок".

2. Может ли такая функция при значительном количестве последовательных обращений (или при бане гуглом IP, с которого идет запрос) блокироваться и зависать?


function translateANY($s_text,$langpair) //пример $langpair - "en|ru"
{
$trans_s_text="";
$words_in_bite=400;

$s_text=trim($s_text);

if(empty($s_text))
{
return false;
}

$words=explode(" ",$s_text);
$textParts=array_chunk($words,$words_in_bite);

foreach($textParts as $bite)
{
$part_s_text=implode(" ",$bite);

$post_data['q']=$part_s_text;
$post_data['langpair']=$langpair;//"en|ru";
$query=http_build_query($post_data);
$url = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0";
$c = curl_init();
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_POST, 0);
curl_setopt($c, CURLOPT_POSTFIELDS, $query);
$b = curl_exec($c);
curl_close($c);
$json = json_decode($b, true);
if ($json['responseStatus'] != 200){
return false;
}
else{
$trans_s_text.=$json['responseData']['translatedText']." ";

}

}
$trans_s_text=trim($trans_s_text);
return $trans_s_text;

}
skAmZ
На сайте с 04.09.2009
Offline
122
#1

Вообще для перевода текстов большой длины метод GET не подходит, на него накладываются слишком жесткие ограничения по длине текста.

Я что-то сомневаюсь, что текст их 400 слов пройдет по длине в GET, но утверждать не буду.

В остальном вроде все нормально.

Я предлагаю Вам использовать POST запросы, Google API их тоже поддерживает, и длина переводимого текста 5000 символов, для тестирования переводил 5010 символов – работало, 5100 уж нет, так что он в полнее лоялен.

Привожу код функции которой пользуюсь сам:

function translate($s_text, $s_lang, $d_lang)

{
$url='http://ajax.googleapis.com/ajax/services/language/translate?v=1.0';
$post='q='.urlencode($s_text).'&langpair='.$s_lang.'%7C'.$d_lang.'&key=notsupplied';

$c = curl_init();
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_REFERER, "http://site.ru/");
curl_setopt($c, CURLOPT_POST, 1);
curl_setopt($c, CURLOPT_POSTFIELDS, $post);
$b = curl_exec($c);
curl_close($c);
$json = json_decode($b, true);
if ($json['responseStatus'] != 200)return false;
return $json['responseData']['translatedText'];
}

Собственно для использования этой функции пользуюсь следующим кодом для перевода:

$translate_pos=0;

$translate_result='';
while(strlen($result)>0)
{
if(strlen($result)<5000)
{
$translate_result.=translate($result, $_lang, 'ru');
$translate_pos=5000;
$result='';
}
else
{
$translate_pos=strrpos(substr($result, 0, 5000), '.');
$translate_result.=translate(substr($result, 0, $translate_pos), $_lang, 'ru');
$result=substr($result, $translate_pos);
}
}

Тут $result исходный текст, $_lang – исходный язык текста (к примеру «en» ), в $translate_result результат перевода. В общем переделать для своих целей не проблема. Вкратце: в цикле переводятся цельные предложения, не более 5000 символов. Много какие моменты не рассматриваются, но вроде работает, это просто пример использования.

На счет вашего 2-го вопроса. Сколько я работал с переводом, гугл не разу не блокировал даже при огромном количестве запросов.

[Удален]
#2
skAmZ:

Я предлагаю Вам использовать POST запросы

а я что делаю?


curl_setopt($c, CURLOPT_POST, 0);
curl_setopt($c, CURLOPT_POSTFIELDS, $query);

несмотря на CURLOPT_POST установленный в 0 - передача происходит методом POST (сам удивляюсь)))

skAmZ
На сайте с 04.09.2009
Offline
122
#3

curl_setopt($c, CURLOPT_POST, 0);

Указывает не использовать POST, т.е. GET.

skAmZ добавил 28.02.2010 в 09:40

Извиняюсь, был не прав) Как оказалось используется POST =)

skAmZ добавил 28.02.2010 в 09:42

Собственно, если говорить о подводных камнях Вашего кода, то возможно превышение длины в 5000 символов, при использовании 400 слов, что конечно маловероятно, но возможно.

[Удален]
#4
skAmZ:
curl_setopt($c, CURLOPT_POST, 0);

Указывает не использовать POST, т.е. GET.

skAmZ добавил 28.02.2010 в 09:40
Извиняюсь, был не прав) Как оказалось используется POST =)

skAmZ добавил 28.02.2010 в 09:42
Собственно, если говорить о подводных камнях Вашего кода, то возможно превышение длины в 5000 символов, при использовании 400 слов, что конечно маловероятно, но возможно.

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

skAmZ
На сайте с 04.09.2009
Offline
122
#5

ИМХО дело не в этой функции, правильно ли обрабатывается, результат перевода, при возврате false?

[Удален]
#6
skAmZ:
ИМХО дело не в этой функции, правильно ли обрабатывается, результат перевода, при возврате false?

да вроде:



$transContent=translateANY($content,$sourlan."|".$destlan); $transTitle=translateANY($title,$sourlan."|".$destlan);


if($transContent===false || $transTitle===false)
{
echo "$tok: перевод пустой ".$sourlan."-".$destlan."\n";
}
else
{
echo "продолжаем работу";
}
skAmZ
На сайте с 04.09.2009
Offline
122
#7

Установлены ли расширения для работы с json, curl? Для тестирования можно указать error_reporting(E_ALL & ~E_NOTICE); для отслеживания ошибок.

ewg777
На сайте с 04.06.2007
Offline
225
#8
[Удален]
#9
skAmZ:
Установлены ли расширения для работы с json, curl? Для тестирования можно указать error_reporting(E_ALL & ~E_NOTICE); для отслеживания ошибок.

да, как выяснилось у человека не установлен json. А где взять эту библиотеку чтобы доустановить?

skAmZ
На сайте с 04.09.2009
Offline
122
#10

Ну это зависит от хостинга, проще всего этот вопрос решать с суппортом, лично у меня на хостинге это включается в админке.

123 4

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий