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

214 lines
No EOL
9.1 KiB
PHP

<?php
// This is a modified version of process.php that uses local storage rather than Azure Blob Storage
// Enable error reporting for debugging
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
include 'config.php';
include 'logger.php';
include 'storage_model.php';
// Create log file if it doesn't exist
$logFile = 'app.log';
if (!file_exists($logFile)) {
file_put_contents($logFile, "Log started at " . date('Y-m-d H:i:s') . PHP_EOL);
chmod($logFile, 0666);
}
header('Content-Type: application/json');
logMessage("Received request to local_process.php");
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
try {
logMessage("Received POST request");
if (!isset($_FILES['file'])) {
logMessage("No file received", 'ERROR');
echo json_encode(['error' => 'No file received']);
exit;
}
$file = $_FILES['file'];
logMessage("File received: " . $file['name']);
// Check for upload errors
if ($file['error'] !== UPLOAD_ERR_OK) {
$uploadErrors = [
1 => 'The uploaded file exceeds the upload_max_filesize directive in php.ini',
2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
3 => 'The uploaded file was only partially uploaded',
4 => 'No file was uploaded',
6 => 'Missing a temporary folder',
7 => 'Failed to write file to disk',
8 => 'A PHP extension stopped the file upload'
];
$errorMessage = isset($uploadErrors[$file['error']]) ? $uploadErrors[$file['error']] : 'Unknown upload error';
logMessage("File upload error: " . $errorMessage, 'ERROR');
echo json_encode(['error' => 'File upload error: ' . $errorMessage]);
exit;
}
// Verify file
if (!file_exists($file['tmp_name']) || !is_readable($file['tmp_name'])) {
logMessage("Temporary file does not exist or is not readable: " . $file['tmp_name'], 'ERROR');
echo json_encode(['error' => 'Temporary file does not exist or is not readable']);
exit;
}
// Get translation parameters
$source_lang = $_POST['source_lang'] ?? '';
$target_lang = $_POST['target_lang'] ?? '';
$formality = $_POST['formality'] ?? 'default';
logMessage("Source Language: $source_lang");
logMessage("Target Language: $target_lang");
logMessage("Formality: $formality");
// Initialize Storage Helper
logMessage("Initializing Storage Helper");
$storageHelper = new StorageHelper();
// Upload file to local storage
logMessage("Uploading file to local storage: " . $file['name']);
$sourceFile = $storageHelper->uploadSourceFile($file['tmp_name'], $file['name']);
if (!$sourceFile) {
logMessage("Failed to save file to local storage", 'ERROR');
echo json_encode(['error' => 'Failed to save file to local storage']);
exit;
}
// Set up target info for the translated file
logMessage("Setting up target info for translated file");
$targetInfo = $storageHelper->getTargetInfo($file['name'], $target_lang);
if (!$targetInfo) {
logMessage("Failed to set up target file info", 'ERROR');
echo json_encode(['error' => 'Failed to set up target file info']);
exit;
}
// Prepare the request to Microsoft Document Translation API
$batchTranslationUrl = MS_API_ENDPOINT . 'translator/document/batches?api-version=' . MS_API_VERSION;
logMessage("Prepared translation API URL: $batchTranslationUrl");
// Format the source and target language codes correctly
$formattedSourceLang = $source_lang !== 'AUTO' ? strtolower($source_lang) : '';
$formattedTargetLang = strtolower($target_lang);
// Handle special cases for Microsoft's language codes
if ($formattedTargetLang === 'en-gb') {
$formattedTargetLang = 'en-GB';
} else if ($formattedTargetLang === 'en-us') {
$formattedTargetLang = 'en-US';
} else if ($formattedTargetLang === 'pt-pt') {
$formattedTargetLang = 'pt-PT';
} else if ($formattedTargetLang === 'pt-br') {
$formattedTargetLang = 'pt-BR';
}
// Generate URLs for Microsoft Translator API
$sourceUrl = $sourceFile['file_url']; // Direct file URL
$targetUrl = $targetInfo['blob_url']; // Directory URL for target
logMessage("Source URL: $sourceUrl");
logMessage("Target URL: $targetUrl");
// Create the request body for Document Translation API
$requestBody = [
'inputs' => [
[
'source' => [
'sourceUrl' => $sourceUrl,
'storageSource' => 'AzureBlob', // We say AzureBlob but using local URLs
'language' => $formattedSourceLang ?: 'en'
],
'targets' => [
[
'targetUrl' => $targetUrl,
'storageSource' => 'AzureBlob',
'language' => $formattedTargetLang,
'category' => 'general'
]
]
]
]
];
// Set formality if supported
if ($formality === 'more' || $formality === 'less') {
$requestBody['inputs'][0]['targets'][0]['formality'] = ($formality === 'more') ? 'Formal' : 'Informal';
}
logMessage("Prepared request body: " . json_encode($requestBody, JSON_PRETTY_PRINT));
// Make the API call
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $batchTranslationUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Ocp-Apim-Subscription-Key: ' . MS_API_KEY,
'Ocp-Apim-Subscription-Region: ' . MS_API_REGION,
'Content-Type: application/json'
]);
$jsonBody = json_encode($requestBody);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonBody);
logMessage("Sending request to Microsoft Translator API");
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_error($ch);
logMessage("CURL Info: " . json_encode(curl_getinfo($ch)));
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");
if ($httpCode >= 400) {
logMessage("HTTP Error Response: $httpCode - $response", 'ERROR');
echo json_encode(['error' => "HTTP Error: $httpCode", 'details' => $response]);
} else {
$result = json_decode($response, true);
if (json_last_error() === JSON_ERROR_NONE) {
// Store information for later use
if (isset($result['id'])) {
// Create a custom response that matches what our frontend expects
$translationResponse = [
'document_id' => $result['id'], // Microsoft's batch ID
'document_key' => json_encode([
'source_blob' => $sourceFile['blob_name'],
'target_blob' => $targetInfo['blob_name'],
'ms_response' => $result
])
];
echo json_encode($translationResponse);
logMessage("Translation job submitted successfully with ID: " . $result['id']);
} else {
logMessage("Microsoft Translator API error: " . json_encode($result), 'ERROR');
echo json_encode(['error' => 'Microsoft Translator API response missing ID', 'details' => $result]);
}
} else {
logMessage("Invalid JSON response: " . json_last_error_msg(), 'ERROR');
echo json_encode(['error' => 'Invalid JSON response: ' . json_last_error_msg(), 'raw_response' => $response]);
}
}
}
} catch (Exception $e) {
logMessage("Exception: " . $e->getMessage() . "\nStack trace: " . $e->getTraceAsString(), 'ERROR');
echo json_encode(['error' => 'Server error: ' . $e->getMessage()]);
}
} else {
logMessage("Received non-POST request", 'ERROR');
echo json_encode(['error' => 'Invalid request method']);
}
?>