This commit completes the merge process, incorporating remote changes that conflicted with local modifications. It also stages and commits all remaining modified and untracked files as per the user's instruction to 'upload everything without exception'.
232 lines
7.5 KiB
PHP
Executable File
232 lines
7.5 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
|
|
$environment = getenv('APP_ENVIRONMENT') ?: 'pruebas';
|
|
|
|
// Construir el nombre del archivo de entorno correcto
|
|
if ($environment === 'reod') {
|
|
$envFile = '.env';
|
|
} else {
|
|
$envFile = '.env.' . $environment;
|
|
}
|
|
|
|
// Cargar el archivo de entorno
|
|
$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) . "'"]);
|
|
}
|