""" Диалог перевода выделенного текста: показывает оригинал и редактируемый перевод; «Применить» / «Отменить». """ from PyQt6.QtWidgets import ( QDialog, QVBoxLayout, QHBoxLayout, QLabel, QTextEdit, QPushButton ) from comfy_studio.core.i18n import tr from comfy_studio.services.translator import TranslateWorker, LANG_NAMES class TranslateDialog(QDialog): """ Запускает фоновый перевод текста и позволяет отредактировать результат. После exec() == Accepted переведённый текст доступен через translated_text(). """ def __init__(self, source_text: str, target_lang: str, parent=None): super().__init__(parent) self.source_text = source_text self.target_lang = target_lang self.worker = None lang_name = LANG_NAMES.get(target_lang, target_lang) self.setWindowTitle(f"{tr('translation_title')} → {lang_name}") self.resize(560, 440) self.init_ui() self._start_translation() def init_ui(self): layout = QVBoxLayout(self) layout.addWidget(QLabel(tr("original_text"))) self.original_edit = QTextEdit() self.original_edit.setPlainText(self.source_text) self.original_edit.setReadOnly(True) self.original_edit.setMaximumHeight(140) layout.addWidget(self.original_edit) layout.addWidget(QLabel(tr("translated_text"))) self.translated_edit = QTextEdit() self.translated_edit.setPlainText(tr("translating")) self.translated_edit.setEnabled(False) layout.addWidget(self.translated_edit) btn_layout = QHBoxLayout() btn_layout.addStretch() self.apply_btn = QPushButton(tr("apply")) self.apply_btn.setEnabled(False) self.apply_btn.clicked.connect(self.accept) self.cancel_btn = QPushButton(tr("cancel")) self.cancel_btn.clicked.connect(self.reject) btn_layout.addWidget(self.apply_btn) btn_layout.addWidget(self.cancel_btn) layout.addLayout(btn_layout) def _start_translation(self): self.worker = TranslateWorker(self.source_text, self.target_lang, self) self.worker.finished.connect(self._on_translation_finished) self.worker.start() def _on_translation_finished(self, success: bool, result: str): if success: self.translated_edit.setPlainText(result) self.translated_edit.setEnabled(True) self.apply_btn.setEnabled(True) self.translated_edit.setFocus() else: self.translated_edit.setPlainText(f"{tr('translation_failed')}:\n{result}") def translated_text(self) -> str: return self.translated_edit.toPlainText() def closeEvent(self, event): if self.worker and self.worker.isRunning(): self.worker.finished.disconnect() self.worker.quit() super().closeEvent(event)