Files
sistema_funcionando_lastwar/translate_proxy.php
nickpons666 7953a56501 Merge: Complete merge of remote changes, including user's requested additions.
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'.
2026-02-08 16:33:43 -06:00

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) . "'"]);
}