From f2466fc49e05514498d6dbcfc77d9ecc525197b5 Mon Sep 17 00:00:00 2001 From: nickpons666 Date: Fri, 20 Mar 2026 13:25:01 -0600 Subject: [PATCH] =?UTF-8?q?Mejora:=20Traducci=C3=B3n=20concurrente=20multi?= =?UTF-8?q?ling=C3=BCe=20por=20segmentaci=C3=B3n=20de=20oraciones=20y=20p?= =?UTF-8?q?=C3=A1rrafos=20(#4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- botdiscord/translate.py | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/botdiscord/translate.py b/botdiscord/translate.py index dfd3131..532ad4d 100644 --- a/botdiscord/translate.py +++ b/botdiscord/translate.py @@ -49,28 +49,36 @@ REVERSE_MAPPING = {} FLAG_MAPPING = {} NAME_TO_CODE = {} +_translation_semaphore = asyncio.Semaphore(5) + +async def _translate_segment(session, url, segment, target_code): + if not re.search(r'[a-zA-Z0-9]', segment): + return segment + + payload = {"q": segment, "source": "auto", "target": target_code, "format": "html"} + + async with _translation_semaphore: + try: + async with session.post(url, json=payload, timeout=15) as resp: + if resp.status == 200: + data = await resp.json() + return data.get("translatedText", segment) + return segment + except Exception: + return segment + async def translate_text(text: str, target_lang: str) -> str: url = get_libretranslate_url() - if not url: - return text + if not url: return text target_code = NAME_TO_CODE.get(target_lang, target_lang) - - payload = { - "q": text, - "source": "auto", - "target": target_code, - "format": "html" - } + segments = re.split(r'([.?!]+\s*|\n+)', text) try: async with aiohttp.ClientSession() as session: - async with session.post(url, json=payload, timeout=30) as resp: - if resp.status == 200: - data = await resp.json() - return data.get("translatedText", text) - else: - return text + tasks = [_translate_segment(session, url, seg, target_code) for seg in segments] + translated_segments = await asyncio.gather(*tasks) + return "".join(translated_segments) except Exception: return text