Commit inicial con archivos existentes
This commit is contained in:
229
translate_proxy.php
Executable file
229
translate_proxy.php
Executable file
@@ -0,0 +1,229 @@
|
||||
<?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) . "'"]);
|
||||
}
|
||||
Reference in New Issue
Block a user