- Agregar columnas telegram_enabled y discord_enabled a supported_languages
- Nueva interfaz en admin/languages.php con checkboxes para Telegram y Discord
- Los bots ahora solo muestran botones de traducción para los idiomas seleccionados por plataforma
- 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
- Dockerfile: PHP 8.3 con Apache, copia todo el código a la imagen
- docker-compose.yml: Sin volúmenes de código, usa env_file
- supervisord.conf: Incluye Apache, Discord bot y colas de procesos
- apache.conf: Configuración de virtualhost con rewrite
- .dockerignore: Excluye archivos innecesarios de la imagen
- Eliminados archivos duplicados de supervisor
- Creada carpeta database/ para init scripts
- Telegram funciona vía webhook (no necesita supervisor)
- Diseño militar/táctico
- Sistema multi-idioma con LibreTranslate
- Tema claro/oscuro
- Navbar horizontal
- Estructura completa del proyecto
- Variables de entorno actualizadas
- Comandos de Telegram y Discord
- Nuevo includes/i18n.php con funciones t() para traducción
- Selector de idioma en navbar y login
- Traducciones aplicadas a: dashboard, login, mensajes programados, crear mensaje, sistema
- Usa idiomas activados desde admin/languages.php
- Caché de traducciones incluido
- Agregar detección de URLs de Discord gifts para evitar botones de traducción
- Enviar imágenes en orden correcto (texto-imagen-texto-imagen) en Discord y Telegram
- Usar APP_URL del .env para las URLs de imágenes
- Agregar funciones sendContentWithOrderedImagesAndButtons en ambos bots
- Agregar validación temprana para ignorar mensajes vacíos en Discord
- Si el mensaje solo contiene attachments (GIF, imagen, etc) sin texto, se ignora
- Evita que se generen botones de traducción para GIFs puros
Cambio en EVENT::MESSAGE_CREATE:
- Verificar if (empty(trim($content))) y retornar antes de procesar
Cambios principales:
- Nuevo archivo: includes/emoji_helper.php
* hasRealContent(): Detecta si hay contenido real (no solo emojis)
* stripEmojisForDetection(): Preserva emojis visuales pero mejora detección de idioma
Telegram (telegram_bot_webhook.php):
- Ignorar stickers puros sin caption
- Ignorar GIFs/animaciones puras sin caption
- Procesar caption si tiene contenido real
- Usar stripEmojisForDetection() para mejor precisión en idioma
Discord (discord_bot.php):
- Ignorar mensajes con solo emojis/espacios
- Usar stripEmojisForDetection() para detección más precisa
- Intentar preservar emojis en la traducción
Comportamiento:
- Solo 👍 = Ignorado
- Hola 👍 = Traducido como 'Hola' (emoji se preserva)
- {sticker_sin_caption} = Ignorado
- {gif_sin_caption} = Ignorado
- {foto_con_caption} = Caption traducido
- Telegram: Procesar caption de fotos y videos con botones de traducción
- Discord: Ignorar mensajes vacíos (solo attachments sin texto)
- Si no hay caption/texto, los bots no procesan nada
- Si hay caption/texto, se traduce normalmente
Cambios:
- telegram/webhook/telegram_bot_webhook.php: Agregar procesamiento de $caption
- discord_bot.php: Agregar validación de texto vacío
- handleTelegramMessage: Ignorar textos vacíos
- handleAutoTranslationWithButtons: Ignorar textos vacíos
- El patrón /\s+/ estaba colapsando TODOS los espacios en blanco incluyendo \n
- Cambiar a /[ \t]+/ para colapsar solo espacios horizontales
- Agregar limpieza de saltos de línea múltiples preservando estructura
- Aplicado en: create_message.php, process_queue.php, discord_bot.php, telegram_bot_webhook.php
Soluciona: 'Hola a todos, El orden de la lista\n\nMiguel\n\nnickpons\n\nLuis'
se traducía como 'Olá a todos, A ordem da listaMiguelnickponsLuis' (sin saltos)
- 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