""" Сервис перевода текста (бесплатный 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))