load(); } catch (\Dotenv\Exception\InvalidPathException $e) { http_response_code(500); $errorMessage = "Error al cargar la configuración del entorno: " . $e->getMessage(); // No mostrar detalles sensibles en producción, pero sí en logs error_log($errorMessage); echo json_encode(["error" => "No se pudo cargar la configuración del entorno."]); exit; } // Para depuración: registrar qué entorno y URL se están usando $logEnvData = [ 'timestamp' => date('Y-m-d H:i:s'), 'message' => 'Environment check', 'loaded_environment' => $environment, 'loaded_env_file' => $envFile, 'libretranslate_url_loaded' => $_ENV['LIBRETRANSLATE_URL'] ?? 'NOT SET' ]; file_put_contents( '/var/www/html/bot/logs/translate_proxy.log', json_encode($logEnvData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n\n", FILE_APPEND ); // Obtener la URL de LibreTranslate desde las variables de entorno $libreTranslateUrl = $_ENV['LIBRETRANSLATE_URL'] ?? ''; if (empty($libreTranslateUrl)) { http_response_code(500); echo json_encode(["error" => "La variable LIBRETRANSLATE_URL no está configurada."]); exit; } // Asegurarse de que la URL termine con / $libreTranslateUrl = rtrim($libreTranslateUrl, '/') . '/'; // Función para hacer solicitudes a la API de LibreTranslate function make_request($url, $method = 'GET', $data = null) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); if ($method === 'POST' && $data) { $payload = json_encode($data); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Content-Length: ' . strlen($payload) ]); } $response = curl_exec($ch); $err = curl_error($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($err) { return ["error" => "cURL Error: " . $err]; } if ($http_code >= 400) { return ["error" => "La API de LibreTranslate devolvió un error: " . $http_code, "response" => json_decode($response, true)]; } return json_decode($response, true); } // Obtener el método de la solicitud $method = $_SERVER['REQUEST_METHOD']; // Inicializar variables $jsonData = []; $action = ''; // Obtener el contenido JSON del cuerpo de la solicitud $input = file_get_contents('php://input'); if (!empty($input)) { $jsonData = json_decode($input, true) ?? []; } // Determinar la acción basada en la petición $action = ''; // Si es una petición GET, buscar el parámetro action if ($method === 'GET' && isset($_GET['action'])) { $action = $_GET['action']; } // Si es una petición POST, verificar si es una traducción elseif ($method === 'POST') { // Si hay un parámetro 'action' en el JSON, usarlo if (isset($jsonData['action'])) { $action = $jsonData['action']; } // Si no hay 'action' pero hay 'text', 'source' y 'target', asumir que es una traducción elseif (isset($jsonData['text'], $jsonData['source'], $jsonData['target'])) { $action = 'translate'; } } // Para depuración $logData = [ 'timestamp' => date('Y-m-d H:i:s'), 'method' => $method, 'action' => $action, 'get_params' => $_GET, 'post_data' => $_POST, 'json_data' => $jsonData, 'raw_input' => $input ]; file_put_contents( '/var/www/html/bot/logs/translate_proxy.log', json_encode($logData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n\n", FILE_APPEND ); // Aceptar tanto 'languages' como 'get_languages' para compatibilidad if ($action === 'get_languages' || $action === 'languages') { // 1. Get all supported languages from LibreTranslate $libreLanguages = make_request($libreTranslateUrl . '/languages'); if (isset($libreLanguages['error'])) { http_response_code(500); echo json_encode($libreLanguages); exit; } // 2. Get all active languages from the local database try { $stmt = $pdo->query("SELECT * FROM languages WHERE is_active = 1"); $localLanguages = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { http_response_code(500); error_log("Database error in translate_proxy: " . $e->getMessage()); echo json_encode(["error" => "Could not retrieve languages from local database."]); exit; } // 3. Create a map of active local languages with their flags $activeLanguagesMap = []; foreach ($localLanguages as $lang) { $activeLanguagesMap[$lang['code']] = $lang; } // 4. Filter LibreTranslate languages and enrich them with local data $enrichedLanguages = []; foreach ($libreLanguages as $libreLang) { if (isset($activeLanguagesMap[$libreLang['code']])) { $localLang = $activeLanguagesMap[$libreLang['code']]; $enrichedLanguages[] = [ 'code' => $libreLang['code'], 'name' => $localLang['native_name'], // Use native_name for display 'flag_emoji' => $localLang['flag_emoji'] ]; } } // 5. Return the enriched list header('Content-Type: application/json'); echo json_encode($enrichedLanguages); } elseif ($action === 'translate' && $method === 'POST') { // Usar los datos del JSON o de $_POST $text = trim($jsonData['text'] ?? ''); $targetLang = $jsonData['target'] ?? 'en'; $sourceLang = $jsonData['source'] ?? 'es'; $translationData = [ 'q' => $text, 'source' => $sourceLang, 'target' => $targetLang, 'format' => 'text' ]; $translationResult = make_request($libreTranslateUrl . 'translate', 'POST', $translationData); if (isset($translationResult['error'])) { http_response_code(500); } // Registrar la respuesta para depuración file_put_contents('/var/www/html/bot/logs/translate_proxy.log', date('Y-m-d H:i:s') . " - Translation Result: " . print_r($translationResult, true) . "\n", FILE_APPEND ); echo json_encode($translationResult); } else { header("HTTP/1.1 400 Bad Request"); echo json_encode(["error" => "Acción no válida o no especificada. Se recibió: '" . htmlspecialchars($action) . "'"]); }