msft-trns/status.php
2026-03-02 17:21:57 +00:00

128 lines
No EOL
5.5 KiB
PHP

<?php
include 'config.php';
include 'logger.php';
header('Content-Type: application/json');
logMessage("Received request to status.php");
if (isset($_GET['document_id']) && isset($_GET['document_key'])) {
$document_id = $_GET['document_id'];
$document_key = $_GET['document_key'];
logMessage("Checking status for Document ID: $document_id");
// Decode the document key to get Microsoft-specific details
$documentKeyData = json_decode($document_key, true);
if (json_last_error() !== JSON_ERROR_NONE) {
logMessage("Invalid document_key format", 'ERROR');
echo json_encode(['error' => 'Invalid document_key format']);
exit;
}
// Add polling timeout for performance
set_time_limit(30); // Set timeout to 30 seconds for this request
// Check batch translation status in Microsoft Translator API
$statusUrl = MS_API_ENDPOINT . "/translator/document/batches/$document_id?api-version=" . MS_API_VERSION;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $statusUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Ocp-Apim-Subscription-Key: ' . MS_API_KEY,
'Ocp-Apim-Subscription-Region: ' . MS_API_REGION
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
logApiCall($statusUrl, 'GET', [
'Ocp-Apim-Subscription-Key: ' . MS_API_KEY,
'Ocp-Apim-Subscription-Region: ' . MS_API_REGION
], [], $response, $httpCode);
if ($response === false) {
$error = curl_error($ch);
logMessage("cURL Error: " . $error, 'ERROR');
echo json_encode(['error' => 'cURL error: ' . $error]);
} else {
logMessage("API Response Code: $httpCode");
logMessage("API Response: $response");
$msResponse = json_decode($response, true);
if (json_last_error() === JSON_ERROR_NONE) {
// Convert Microsoft's status format to match what our frontend expects
$status = 'in_progress';
$errorMessage = '';
// Check overall status
if (isset($msResponse['status'])) {
$msStatus = strtolower($msResponse['status']);
if ($msStatus === 'succeeded' || $msStatus === 'validated') {
$status = 'done';
} elseif ($msStatus === 'failed' || $msStatus === 'cancelled') {
$status = 'error';
// Extract error details for better debugging
if (isset($msResponse['error'])) {
$errorMessage = $msResponse['error']['code'] . ': ' . $msResponse['error']['message'];
// Log error details
logMessage("Translation error: " . $errorMessage, 'ERROR');
// If there's an inner error with more details, include it
if (isset($msResponse['error']['innerError'])) {
$innerError = $msResponse['error']['innerError']['code'] . ': ' . $msResponse['error']['innerError']['message'];
$errorMessage .= " (" . $innerError . ")";
logMessage("Inner error: " . $innerError, 'ERROR');
}
}
} elseif ($msStatus === 'validationfailed') {
$status = 'error';
$errorMessage = 'Validation failed: ';
// Extract error details
if (isset($msResponse['error'])) {
$errorMessage .= $msResponse['error']['code'] . ': ' . $msResponse['error']['message'];
// Log validation error
logMessage("Validation error: " . $errorMessage, 'ERROR');
// Include inner error if available
if (isset($msResponse['error']['innerError'])) {
$innerError = $msResponse['error']['innerError']['code'] . ': ' . $msResponse['error']['innerError']['message'];
$errorMessage .= " (" . $innerError . ")";
logMessage("Inner validation error: " . $innerError, 'ERROR');
}
}
}
}
// Create a response that matches what the frontend expects
$statusResponse = [
'document_id' => $document_id,
'status' => $status,
'seconds_remaining' => isset($msResponse['summary']['estimatedTranslationTimeInSeconds'])
? $msResponse['summary']['estimatedTranslationTimeInSeconds']
: 0,
'ms_status' => isset($msResponse['status']) ? $msResponse['status'] : 'unknown',
'error_message' => $errorMessage
];
// Include the original Microsoft response for complete debugging
$statusResponse['ms_response'] = $msResponse;
echo json_encode($statusResponse);
} else {
logMessage("Invalid JSON response", 'ERROR');
echo json_encode(['error' => 'Invalid JSON response', 'raw_response' => $response]);
}
}
curl_close($ch);
} else {
logMessage("Missing document_id or document_key", 'ERROR');
echo json_encode(['error' => 'Missing document_id or document_key']);
}