Files
Comfy-Studio/comfy_studio/services/translator.py
T

70 lines
2.3 KiB
Python
Raw Normal View History

2026-07-02 14:09:57 +08:00
"""
Сервис перевода текста (бесплатный endpoint Google Translate, без API-ключа).
Перевод выполняется в фоновом QThread, чтобы не блокировать GUI.
"""
import logging
import requests
from PyQt6.QtCore import QThread, pyqtSignal
logger = logging.getLogger(__name__)
TRANSLATE_URL = "https://translate.googleapis.com/translate_a/single"
# Отображаемые названия языков (код -> название)
LANG_NAMES = {
"ru": "Русский",
"en": "English",
"de": "Deutsch",
"fr": "Français",
"es": "Español",
"it": "Italiano",
"pt": "Português",
"pl": "Polski",
"uk": "Українська",
"ja": "日本語",
"zh-CN": "中文",
"ko": "한국어",
}
def translate_text(text: str, target_lang: str, source_lang: str = "auto") -> str:
"""
Переводит текст через публичный endpoint Google Translate.
Бросает исключение при сетевой ошибке или неожиданном ответе.
"""
params = {
"client": "gtx",
"sl": source_lang,
"tl": target_lang,
"dt": "t",
"q": text,
}
response = requests.get(TRANSLATE_URL, params=params, timeout=10)
response.raise_for_status()
data = response.json()
# Ответ: [[["перевод1","оригинал1",...],["перевод2",...],...], ...]
segments = data[0] or []
return "".join(seg[0] for seg in segments if seg and seg[0])
class TranslateWorker(QThread):
"""Фоновый перевод текста."""
finished = pyqtSignal(bool, str) # (success, translated_text_or_error)
def __init__(self, text: str, target_lang: str, parent=None):
super().__init__(parent)
self.text = text
self.target_lang = target_lang
def run(self):
try:
translated = translate_text(self.text, self.target_lang)
self.finished.emit(True, translated)
except requests.exceptions.RequestException as e:
logger.error(f"Сетевая ошибка перевода: {e}")
self.finished.emit(False, str(e))
except Exception as e:
logger.error(f"Ошибка перевода: {e}")
self.finished.emit(False, str(e))