Я провел еще немного расследований и в итоге открыл билет с помощью Microsoft Cognitive Services. Сценарий, как он есть / работал нормально, несколько месяцев за go, и я фактически переводил пару абзацев примерно на 40 разных языков (почти все, что они поддерживают), используя единый вызов в виде связанного вызова, и я получал ответ обратно, имеющий все переводы. Раньше это работало нормально.
Однако для запросов API к службам перевода есть ограничения по символам:
См .: Ограничения запросов для текста переводчика
"Каждый запрос на перевод ограничен 5000 символами для всех целевых языков, на которые вы переводите. Например, отправка запроса на перевод 1500 символов для перевода на 3 различных языка приводит к размеру запроса 1500x3 = 4500 символов, что соответствует пределу количества запросов. Вы платите за символ, а не за количество запросов. Рекомендуется отправлять более короткие запросы. "
С 40 различными языками и парой абзацев, имеющих несколько сотен символов у меня были за пределом. После торговли электронными письмами с поддержкой MS выясняется, что лимит запросов API не применялся в течение части прошлого года и недавно из-за ошибки на их конце, и они, по-видимому, недавно ее исправили.
Только для В данном случае старый код был примерно таким, со строкой запроса около 40 или около того & to = lang &. , , .
$languages = $data['languagearray'];
$params = '&from=' . $data["from"] ;
foreach ($languages as $language) {
$params .= "&to=" . $language;
}
$params .= "&textType=html";
$text = $data["text"];
if (!function_exists('com_create_guid')) {
function com_create_guid() {
return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
mt_rand( 0, 0xffff ),
mt_rand( 0, 0x0fff ) | 0x4000,
mt_rand( 0, 0x3fff ) | 0x8000,
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
);
}
}
function Translate ($host, $path, $key, $params, $content) {
$headers = "Content-type: application/json\r\n" .
"Content-length: " . strlen($content) . "\r\n" .
"Ocp-Apim-Subscription-Key: $key\r\n" .
"X-ClientTraceId: " . com_create_guid() . "\r\n";
// NOTE: Use the key 'http' even if you are making an HTTPS request. See:
// http://php.net/manual/en/function.stream-context-create.php
$options = array (
'http' => array (
'header' => $headers,
'method' => 'POST',
'content' => $content
)
);
$context = stream_context_create ($options);
$result = file_get_contents ($host . $path . $params, false, $context);
echo $result;
return $result;
}
$requestBody = array (
array (
'Text' => $text,
),
);
function jsonp_decode($jsonp, $assoc = false) { // PHP 5.3 adds depth as third parameter to json_decode
if($jsonp[0] !== '[' && $jsonp[0] !== '{') { // we have JSONP
$jsonp = substr($jsonp, strpos($jsonp, '('));
}
return json_decode(trim($jsonp,'();'), $assoc);
}
$content = json_encode($requestBody);
$result = Translate ($host, $path, $key, $params, $content);
// Note: We convert result, which is JSON, to and from an object so we can pretty-print it.
// We want to avoid escaping any Unicode characters that result contains. See:
// http://php.net/manual/en/function.json-encode.php
$json = jsonp_decode($result, true)[0]["translations"];
$conn = DatabaseFactory::getFactory()->getConnection();
foreach ($json as $language) {
$query = 'UPDATE kronen_translations SET translated_text = ? WHERE language_code = ?';
$parameters = [$language['text'], $language['to']];
$stmt = $conn->prepare($query);
$stmt->execute($parameters);
echo $language['to'] . '<br>';
echo $language['text'] . '<br>';
}
Вам разрешается делать подобные звонки в связке, а затем декодировать полученные результаты.
Решением было сделать серию звонков (по одному за раз). в данном случае) по одному для каждого языка, а затем последовательно обрабатывать результаты. Новый код выглядит примерно так. Возможно, есть лучший способ, но, по крайней мере, таким образом я могу обрабатывать куски текста разумного размера. Запуск сценария для примерно 40 языков занимает немного времени, хотя все равно только 30 секунд, в зависимости от размера текста.
function Translate ($host, $path, $key, $params, $content) {
$headers = "Content-type: application/json\r\n" .
"Content-length: " . strlen($content) . "\r\n" .
"Ocp-Apim-Subscription-Key: $key\r\n" .
"X-ClientTraceId: " . com_create_guid() . "\r\n";
// NOTE: Use the key 'http' even if you are making an HTTPS request. See:
// http://php.net/manual/en/function.stream-context-create.php
$options = array (
'http' => array (
'header' => $headers,
'method' => 'POST',
'content' => $content
)
);
$context = stream_context_create ($options);
$result = file_get_contents ($host . $path . $params, false, $context);
echo $result;
return $result;
}
function jsonp_decode($jsonp, $assoc = false) { // PHP 5.3 adds depth as third parameter to json_decode
if($jsonp[0] !== '[' && $jsonp[0] !== '{') { // we have JSONP
$jsonp = substr($jsonp, strpos($jsonp, '('));
}
return json_decode(trim($jsonp,'();'), $assoc);
}
$key = 'xxxxx';
$host = "https://api.cognitive.microsofttranslator.com";
$path = "/translate?api-version=3.0";
$languages = $data['languagearray'];
// print_r($languages);
$conn = DatabaseFactory::getFactory()->getConnection();
$text = $data["text"];
foreach ($languages as $language) {
$params = '&from=' . $data["from"] ;
$params .= "&to=" . $language;
$params .= "&textType=html";
$text = $data["text"];
$requestBody = array (
array (
'Text' => $text,
),
);
$content = json_encode($requestBody);
$result = Translate ($host, $path, $key, $params, $content);
$json = jsonp_decode($result, true)[0]["translations"];
foreach ($json as $language) {
$query = 'UPDATE kronen_translations SET translated_text = ? WHERE language_code = ?';
$parameters = [$language['text'], $language['to']];
$stmt = $conn->prepare($query);
$stmt->execute($parameters);
echo $language['to'] . '<br>';
echo $language['text'] . '<br>';
}