Fix: Motor de traducción mejorado para mensajes multi-idioma y dinámicos

- Rediseñado translatePartial para manejar mezclas de idiomas (ej: 'Hello a todos')
- Eliminados hardcodes de idiomas ES/PT, ahora es 100% dinámico
- Corregido truncado de texto original en el webhook de Telegram
- Mejorada la deduplicación y preservación de párrafos en traducciones
- Fallback dinámico al primer idioma activo de la base de datos
This commit is contained in:
2026-03-10 18:23:56 -06:00
parent bf960f3fc3
commit 8170931f3d
3 changed files with 266 additions and 37 deletions

View File

@@ -96,6 +96,10 @@ try {
function registerTelegramUser(PDO $pdo, array $user): void
{
// Obtener idioma por defecto de la base de datos (el primero activo)
$stmtDefault = $pdo->query("SELECT language_code FROM supported_languages WHERE is_active = 1 LIMIT 1");
$defaultLang = $stmtDefault->fetchColumn() ?: 'es';
$stmt = $pdo->prepare("
INSERT INTO recipients (platform_id, name, type, platform, language_code, chat_mode)
VALUES (?, ?, 'user', 'telegram', ?, 'bot')
@@ -103,16 +107,15 @@ function registerTelegramUser(PDO $pdo, array $user): void
");
$name = trim(($user['first_name'] ?? '') . ' ' . ($user['last_name'] ?? ''));
$languageCode = $user['language_code'] ?? 'es';
$languageCode = $user['language_code'] ?? $defaultLang;
$stmt->execute([$user['id'], $name, $languageCode]);
}
function handleAutoTranslation(PDO $pdo, Telegram\TelegramSender $sender, src\Translate $translator, int $chatId, string $text): void
{
// Usar texto sin emojis para detección de idioma, pero guardar el original para mostrar
$textForDetection = stripEmojisForDetection($text);
$keyboard = getTelegramTranslationButtons($pdo, $textForDetection ?: $text);
// Usar el texto original completo para generar los botones y guardar en caché
$keyboard = getTelegramTranslationButtons($pdo, $text);
if (!empty($keyboard)) {
$message = "🌐 <b>Traducciones disponibles:</b>\nHaz clic en una bandera para ver la traducción";
@@ -388,13 +391,10 @@ function handleTelegramCallback(PDO $pdo, Telegram\TelegramSender $sender, src\T
}
try {
// Obtener el idioma original (usar texto sin emojis para mayor precisión)
$textForDetection = stripEmojisForDetection($originalText);
$sourceLang = $translator->detectLanguage($textForDetection) ?? 'es';
file_put_contents(__DIR__ . '/../../logs/telegram_debug.log', date('Y-m-d H:i:s') . " - sourceLang: $sourceLang, targetLang: $targetLang, originalText: " . substr($originalText, 0, 50) . "\n", FILE_APPEND);
// Traducir (usar texto sin emojis para evitar interferencias)
$translated = $translator->translate($textForDetection ?: $originalText, $sourceLang, $targetLang);
// Traducción parcial - detecta el idioma de cada segmento y traduce solo lo necesario
$textForTranslation = stripEmojisForDetection($originalText);
$translated = $translator->translatePartial($textForTranslation ?: $originalText, $targetLang);
file_put_contents(__DIR__ . '/../../logs/telegram_debug.log', date('Y-m-d H:i:s') . " - targetLang: $targetLang, originalText: " . substr($originalText, 0, 50) . "\n", FILE_APPEND);
file_put_contents(__DIR__ . '/../../logs/telegram_debug.log', date('Y-m-d H:i:s') . " - translated: $translated\n", FILE_APPEND);
if ($translated) {