From 256d346b336f7dda99f410f1b1a142306cd0a6e8 Mon Sep 17 00:00:00 2001 From: nickpons666 Date: Fri, 6 Mar 2026 20:06:50 -0600 Subject: [PATCH] =?UTF-8?q?fix(translate):=20mejorar=20regex=20de=20segmen?= =?UTF-8?q?taci=C3=B3n=20y=20detecci=C3=B3n=20de=20caracteres=20internacio?= =?UTF-8?q?nales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- botdiscord/translate.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/botdiscord/translate.py b/botdiscord/translate.py index 73d1968..c2fb748 100644 --- a/botdiscord/translate.py +++ b/botdiscord/translate.py @@ -57,7 +57,8 @@ from botdiscord.database import get_available_languages, get_bot_languages async def _do_translate_request(session, url, text, target_code): """Función interna para realizar una única petición de traducción.""" - if not text.strip() or not re.search(r'[a-zA-ZáéíóúÁÉÍÓÚñÑ]', text): + # Verificamos si el segmento tiene al menos una letra de cualquier idioma + if not text.strip() or not re.search(r'[a-zA-Z\u00C0-\u017F]', text): return text payload = { @@ -71,11 +72,15 @@ async def _do_translate_request(session, url, text, target_code): async with session.post(url, json=payload, timeout=10) as resp: if resp.status == 200: data = await resp.json() - return data.get("translatedText", text) + translated = data.get("translatedText", text) + # Si el resultado es igual al original, puede ser que el motor fallara, + # devolvemos el texto original tal cual. + return translated else: - return text # Devolvemos el original si falla la API + # En caso de error de API (404, 500, etc) devolvemos el original + return text except Exception: - return text # Devolvemos el original si hay error de conexión + return text async def translate_text(text: str, target_lang: str) -> str: url = get_libretranslate_url() @@ -84,9 +89,14 @@ async def translate_text(text: str, target_lang: str) -> str: target_code = NAME_TO_CODE.get(target_lang, target_lang) - # Segmentación: Dividimos por oraciones (. ! ? \n) pero manteniendo los delimitadores - # El patrón busca los delimitadores y los incluye en la lista resultante - segments = re.split(r'(\. |\! |\? |\n)', text) + # Segmentación mejorada: + # Divide por signos de puntuación (. ! ?) o saltos de línea, + # permitiendo que después haya espacios, comas u otros signos. + # Usamos un grupo de captura para no perder los delimitadores. + segments = re.split(r'([.!?]+\s*|\n+)', text) + + # Filtramos segmentos vacíos que puedan quedar tras el split + segments = [s for s in segments if s] async with aiohttp.ClientSession() as session: tasks = []