230 lines
7.7 KiB
PHP
Executable File
230 lines
7.7 KiB
PHP
Executable File
<?php
|
|
// Habilitar reporte de errores para depuración
|
|
error_reporting(E_ALL);
|
|
ini_set('display_errors', 1);
|
|
|
|
// Cargar el autoloader de Composer para las dependencias
|
|
require_once __DIR__ . '/vendor/autoload.php';
|
|
require_once __DIR__ . '/includes/db.php'; // Conexión a la base de datos
|
|
|
|
// Configurar cabeceras CORS
|
|
header('Access-Control-Allow-Origin: *');
|
|
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
|
|
header('Access-Control-Allow-Headers: Content-Type, Authorization');
|
|
header('Content-Type: application/json');
|
|
|
|
// Manejar solicitudes OPTIONS para CORS
|
|
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
|
|
http_response_code(200);
|
|
exit();
|
|
}
|
|
|
|
// Cargar las variables de entorno
|
|
try {
|
|
// Determinar el entorno desde la variable de entorno del servidor
|
|
$environment = $_SERVER['APP_ENVIRONMENT'] ?? 'pruebas'; // Usar 'pruebas' como fallback
|
|
$envFile = '.env.' . $environment;
|
|
|
|
// Verificar si el archivo de entorno existe
|
|
if (!file_exists(__DIR__ . '/' . $envFile)) {
|
|
throw new \Dotenv\Exception\InvalidPathException("El archivo de entorno '{$envFile}' no se encuentra.");
|
|
}
|
|
|
|
// Cargar el archivo de entorno correspondiente
|
|
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__, $envFile);
|
|
$dotenv->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) . "'"]);
|
|
}
|