Files
sistema_funcionando_lastwar/translate_proxy.php

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