Fix: Optimizar respuesta de interacciones de traducción en Discord
- Cambiar de deferReply() a respondWithMessage() para garantizar respuesta en <3s - Responder inmediatamente con mensaje de carga - Actualizar respuesta con traducción completa - Agregar caché de traducciones para evitar llamadas repetidas a LibreTranslate - Caché guardar en archivos temporales con validez de 30 días Soluciona: 'Interacción fallida' en traducción al inglés y otros idiomas
This commit is contained in:
@@ -34,6 +34,15 @@ class Translate
|
||||
}
|
||||
|
||||
try {
|
||||
// Primero intentar obtener del caché
|
||||
$cacheKey = $this->generateCacheKey($text, $sourceLang, $targetLang);
|
||||
$cached = $this->getFromCache($cacheKey);
|
||||
|
||||
if ($cached !== null) {
|
||||
error_log("Translation cache hit for: $sourceLang -> $targetLang");
|
||||
return $cached;
|
||||
}
|
||||
|
||||
$lines = explode("\n", $text);
|
||||
$translatedLines = [];
|
||||
|
||||
@@ -53,7 +62,12 @@ class Translate
|
||||
$translatedLines[] = $response['translatedText'] ?? trim($line);
|
||||
}
|
||||
|
||||
return implode("\n", $translatedLines);
|
||||
$result = implode("\n", $translatedLines);
|
||||
|
||||
// Guardar en caché
|
||||
$this->saveToCache($cacheKey, $result);
|
||||
|
||||
return $result;
|
||||
} catch (\Exception $e) {
|
||||
error_log("Translation error: " . $e->getMessage());
|
||||
return null;
|
||||
@@ -131,4 +145,60 @@ class Translate
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Genera una clave única para el caché de traducciones
|
||||
*/
|
||||
private function generateCacheKey(string $text, string $sourceLang, string $targetLang): string
|
||||
{
|
||||
return md5($text . $sourceLang . $targetLang);
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtiene una traducción del caché
|
||||
*/
|
||||
private function getFromCache(string $cacheKey): ?string
|
||||
{
|
||||
try {
|
||||
$cacheDir = sys_get_temp_dir() . '/discord_translation_cache';
|
||||
if (!is_dir($cacheDir)) {
|
||||
mkdir($cacheDir, 0755, true);
|
||||
}
|
||||
|
||||
$cacheFile = $cacheDir . '/' . $cacheKey . '.txt';
|
||||
|
||||
if (file_exists($cacheFile)) {
|
||||
// Verificar que el caché no sea muy antiguo (máximo 30 días)
|
||||
$fileAge = time() - filemtime($cacheFile);
|
||||
if ($fileAge < (30 * 24 * 60 * 60)) {
|
||||
$content = file_get_contents($cacheFile);
|
||||
if ($content !== false) {
|
||||
return $content;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
error_log("Cache retrieval error: " . $e->getMessage());
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Guarda una traducción en caché
|
||||
*/
|
||||
private function saveToCache(string $cacheKey, string $translation): void
|
||||
{
|
||||
try {
|
||||
$cacheDir = sys_get_temp_dir() . '/discord_translation_cache';
|
||||
if (!is_dir($cacheDir)) {
|
||||
mkdir($cacheDir, 0755, true);
|
||||
}
|
||||
|
||||
$cacheFile = $cacheDir . '/' . $cacheKey . '.txt';
|
||||
file_put_contents($cacheFile, $translation, LOCK_EX);
|
||||
} catch (\Exception $e) {
|
||||
error_log("Cache save error: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user