Fix: Botones de traducción - editar mensaje en Telegram y Discord
This commit is contained in:
@@ -356,13 +356,11 @@ function handleAutoTranslationWithButtons(PDO $pdo, Message $message, string $te
|
||||
// Preparar botones
|
||||
$buttons = [];
|
||||
foreach ($activeLanguages as $lang) {
|
||||
if ($lang['language_code'] !== $detectedLang) {
|
||||
$buttons[] = [
|
||||
'label' => $lang['flag_emoji'] . ' ' . strtoupper($lang['language_code']),
|
||||
'custom_id' => 'translate_' . $lang['language_code'] . ':' . $textHash,
|
||||
'style' => 1
|
||||
];
|
||||
}
|
||||
$buttons[] = [
|
||||
'label' => $lang['flag_emoji'] . ' ' . strtoupper($lang['language_code']),
|
||||
'custom_id' => 'translate_' . $lang['language_code'] . ':' . $textHash,
|
||||
'style' => 1
|
||||
];
|
||||
}
|
||||
|
||||
// Enviar mensaje con botones usando MessageBuilder correctamente
|
||||
@@ -508,13 +506,11 @@ function handleTranslateInteraction($interaction, string $customId): void
|
||||
$targetLang = str_replace('translate_', '', $parts[0]);
|
||||
$textHash = $parts[1] ?? '';
|
||||
|
||||
// Obtener texto de la base de datos primero
|
||||
$stmt = $pdo->prepare("SELECT original_text FROM translation_cache WHERE text_hash = ?");
|
||||
$stmt->execute([$textHash]);
|
||||
$row = $stmt->fetch();
|
||||
|
||||
if (!$row || empty($row['original_text'])) {
|
||||
// Enviar error efímero
|
||||
$builder = \Discord\Builders\MessageBuilder::new()
|
||||
->setContent('❌ Error: Texto no encontrado');
|
||||
$interaction->respondWithMessage($builder, true);
|
||||
@@ -523,34 +519,25 @@ function handleTranslateInteraction($interaction, string $customId): void
|
||||
|
||||
$originalText = $row['original_text'];
|
||||
|
||||
// Responder inmediatamente con "Traduciendo..."
|
||||
$loadingBuilder = \Discord\Builders\MessageBuilder::new()
|
||||
->setContent("⏳ Traduciendo a " . strtoupper($targetLang) . "...");
|
||||
$interaction->respondWithMessage($loadingBuilder, true);
|
||||
try {
|
||||
$interaction->acknowledge();
|
||||
} catch (\Exception $e) {
|
||||
error_log("Acknowledge error: " . $e->getMessage());
|
||||
}
|
||||
|
||||
// Ahora traducir (esto puede tardar)
|
||||
// Usar texto sin emojis para detectar idioma y traducir con mayor precisión
|
||||
$textForDetection = stripEmojisForDetection($originalText);
|
||||
$sourceLang = $translator->detectLanguage($textForDetection) ?? 'es';
|
||||
$translated = $translator->translate($textForDetection, $sourceLang, $targetLang);
|
||||
|
||||
if ($translated) {
|
||||
// Limpiar todo el HTML
|
||||
$translated = strip_tags($translated);
|
||||
// Limpiar asteriscos duplicados
|
||||
$translated = preg_replace('/\*+/', '', $translated);
|
||||
// Limpiar comandos con espacios
|
||||
$translated = preg_replace('/\/(\s+)(\w+)/', '/$2', $translated);
|
||||
$translated = preg_replace('/#(\s+)(\w+)/', '#$2', $translated);
|
||||
// Limpiar saltos de línea extras
|
||||
$translated = preg_replace('/\n\s*\n/', "\n", $translated);
|
||||
|
||||
// Actualizar la respuesta con la traducción real
|
||||
// Preservar emojis del original si los hay
|
||||
$displayText = trim($translated);
|
||||
if (strpos($originalText, '👍') !== false || preg_match('/[\x{1F300}-\x{1F9FF}]/u', $originalText)) {
|
||||
// Si el original tenía emojis, intentar identificarlos
|
||||
// Para mensajes simples, los emojis generalmente están al inicio o final
|
||||
$emojiPrefix = '';
|
||||
$emojiSuffix = '';
|
||||
if (preg_match('/^([\x{1F300}-\x{1F9FF}]+)\s*/u', $originalText, $match)) {
|
||||
@@ -562,25 +549,32 @@ function handleTranslateInteraction($interaction, string $customId): void
|
||||
$displayText = $emojiPrefix . $displayText . $emojiSuffix;
|
||||
}
|
||||
|
||||
$finalBuilder = \Discord\Builders\MessageBuilder::new()
|
||||
->setContent("🌐 **Traducción (" . strtoupper($targetLang) . "):**\n\n" . $displayText);
|
||||
$interaction->updateOriginalResponse($finalBuilder);
|
||||
$messageText = "🌐 **Traducción (" . strtoupper($targetLang) . "):**\n\n" . $displayText;
|
||||
|
||||
$buttons = getDiscordTranslationButtons($pdo, $originalText);
|
||||
|
||||
$builder = \Discord\Builders\MessageBuilder::new()
|
||||
->setContent($messageText);
|
||||
|
||||
if (!empty($buttons)) {
|
||||
$actionRow = new \Discord\Builders\Components\ActionRow();
|
||||
foreach ($buttons[0]['components'] as $btn) {
|
||||
$button = \Discord\Builders\Components\Button::new(\Discord\Builders\Components\Button::STYLE_PRIMARY)
|
||||
->setLabel($btn['label'])
|
||||
->setCustomId($btn['custom_id']);
|
||||
$actionRow->addComponent($button);
|
||||
}
|
||||
$builder->addComponent($actionRow);
|
||||
}
|
||||
|
||||
$interaction->message->edit($builder);
|
||||
|
||||
} else {
|
||||
// Actualizar con error
|
||||
$errorBuilder = \Discord\Builders\MessageBuilder::new()
|
||||
->setContent("❌ Error al traducir");
|
||||
$interaction->updateOriginalResponse($errorBuilder);
|
||||
$interaction->message->edit(\Discord\Builders\MessageBuilder::new()->setContent("❌ Error al traducir"));
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
error_log("Discord translate error: " . $e->getMessage());
|
||||
try {
|
||||
$builder = \Discord\Builders\MessageBuilder::new()
|
||||
->setContent('❌ Error en el proceso de traducción');
|
||||
$interaction->respondWithMessage($builder, true);
|
||||
} catch (Exception $inner) {
|
||||
error_log("Error responding to interaction: " . $inner->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user