Initial release: Comfy-Studio v1.0.0
Десктопная галерея и менеджер изображений ComfyUI (PyQt6 + SQLite): - мультипапочный мониторинг (watchdog), грид миниатюр, drag-and-drop - теги, избранное, рейтинг, поиск по промтам - парсер метаданных ComfyUI (PNG/WebP/JPEG), редактор workflow/prompt JSON - перевод выделенного текста через контекстное меню (настраиваемые языки) - отправка промта в очередь ComfyUI с внедрением правок и нового seed - полноэкранный просмотр, локализация ru/en, тёмная тема Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
"""
|
||||
Сервис перевода текста (бесплатный 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))
|
||||
Reference in New Issue
Block a user