'Invalid document_key format']); exit; } // Add polling timeout for performance set_time_limit(30); // 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); curl_close($ch); 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'; // If succeeded, copy the file from Microsoft's expected location to our local storage // This would normally happen via Azure Blob Storage notification // For now, we'll just assume success and show a placeholder message if ($msStatus === 'succeeded') { logMessage("Translation succeeded - would download translated file here"); // In a real implementation, check if the translated file exists // and if not, write a placeholder file if (isset($documentKeyData['target_blob'])) { $targetFileName = $documentKeyData['target_blob']; $targetPath = dirname(__FILE__) . '/local_storage/translated-documents/' . $targetFileName; // Create a placeholder file if it doesn't exist if (!file_exists($targetPath)) { $placeholderContent = "This is a placeholder for the translated content.\n"; $placeholderContent .= "In a real implementation, the Microsoft Translator service would store the translated file at this location.\n"; $placeholderContent .= "Status: Translation succeeded."; file_put_contents($targetPath, $placeholderContent); logMessage("Created placeholder translated file at: $targetPath"); } } } } 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 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]); } } } else { logMessage("Missing document_id or document_key", 'ERROR'); echo json_encode(['error' => 'Missing document_id or document_key']); } ?>