From 747270b43a700d48737c474cf2d0802e635737fb Mon Sep 17 00:00:00 2001 From: penn Date: Sat, 7 Jun 2025 14:24:49 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E2=9C=A8=20Add=20auto-focus=20to=20input?= =?UTF-8?q?=20box=20when=20feedback=20window=20opens?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Automatically focus on the feedback input box when window appears • Improves user experience by allowing immediate text input • Added smart focus detection for both combined and separate modes • Implemented 300ms delay to ensure complete UI initialization • Enhanced debugging and error handling for focus functionality Resolves: Input box requires manual click before typing Feature: Auto-focus enhancement for better UX --- .../gui/window/feedback_window.py | 227 +++++++++++------- 1 file changed, 137 insertions(+), 90 deletions(-) diff --git a/src/mcp_feedback_enhanced/gui/window/feedback_window.py b/src/mcp_feedback_enhanced/gui/window/feedback_window.py index 79e7cab..0018ec2 100644 --- a/src/mcp_feedback_enhanced/gui/window/feedback_window.py +++ b/src/mcp_feedback_enhanced/gui/window/feedback_window.py @@ -33,64 +33,70 @@ class FeedbackWindow(QMainWindow): self.result = None self.i18n = get_i18n_manager() self.mcp_timeout_seconds = timeout_seconds # MCP 傳入的超時時間 - + # 初始化組件 self.config_manager = ConfigManager() - + # 載入保存的語言設定 saved_language = self.config_manager.get_language() if saved_language: self.i18n.set_language(saved_language) - + self.combined_mode = self.config_manager.get_layout_mode() self.layout_orientation = self.config_manager.get_layout_orientation() - + # 設置窗口狀態保存的防抖計時器 self._save_timer = QTimer() self._save_timer.setSingleShot(True) self._save_timer.timeout.connect(self._delayed_save_window_position) self._save_delay = 500 # 500ms 延遲,避免過於頻繁的保存 - + # 設置UI self._setup_ui() self._setup_shortcuts() self._connect_signals() - + debug_log("主窗口初始化完成") # 如果啟用了超時,自動開始倒數計時 self.start_timeout_if_enabled() - + + # 設置定時器在窗口顯示後自動聚焦到輸入框 + self._focus_timer = QTimer() + self._focus_timer.setSingleShot(True) + self._focus_timer.timeout.connect(self._auto_focus_input) + self._focus_timer.start(300) # 延遲300ms確保窗口和UI元素完全加載 + def _setup_ui(self) -> None: """設置用戶介面""" self.setWindowTitle(t('app.title')) self.setMinimumSize(400, 300) # 大幅降低最小窗口大小限制,允許用戶自由調整 self.resize(1200, 900) - + # 智能視窗定位 self._apply_window_positioning() - + # 中央元件 central_widget = QWidget() self.setCentralWidget(central_widget) - + # 主布局 main_layout = QVBoxLayout(central_widget) main_layout.setSpacing(8) main_layout.setContentsMargins(16, 8, 16, 12) - + # 頂部專案目錄信息 self._create_project_header(main_layout) - + # 分頁區域 self._create_tab_area(main_layout) - + # 操作按鈕 self._create_action_buttons(main_layout) - + # 應用深色主題 self._apply_dark_style() - + def _create_project_header(self, layout: QVBoxLayout) -> None: """創建專案目錄頭部信息""" # 創建水平布局來放置專案目錄和倒數計時器 @@ -159,7 +165,7 @@ class FeedbackWindow(QMainWindow): self._update_countdown_visibility() - + def _create_tab_area(self, layout: QVBoxLayout) -> None: """創建分頁區域""" # 創建滾動區域來包裝整個分頁組件 @@ -220,21 +226,21 @@ class FeedbackWindow(QMainWindow): width: 0px; } """) - + self.tab_widget = QTabWidget() self.tab_widget.setMinimumHeight(150) # 降低分頁組件最小高度 # 設置分頁組件的大小策略,確保能觸發滾動 self.tab_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - + # 初始化分頁管理器 self.tab_manager = TabManager( - self.tab_widget, - self.project_dir, - self.summary, + self.tab_widget, + self.project_dir, + self.summary, self.combined_mode, self.layout_orientation ) - + # 創建分頁 self.tab_manager.create_tabs() @@ -243,21 +249,21 @@ class FeedbackWindow(QMainWindow): # 將分頁組件放入滾動區域 scroll_area.setWidget(self.tab_widget) - + layout.addWidget(scroll_area, 1) - + def _create_action_buttons(self, layout: QVBoxLayout) -> None: """創建操作按鈕""" button_layout = QHBoxLayout() button_layout.addStretch() - + # 取消按鈕 self.cancel_button = QPushButton(t('buttons.cancel')) self.cancel_button.clicked.connect(self._cancel_feedback) self.cancel_button.setFixedSize(130, 40) apply_widget_styles(self.cancel_button, "secondary_button") button_layout.addWidget(self.cancel_button) - + # 提交按鈕 self.submit_button = QPushButton(t('buttons.submit')) self.submit_button.clicked.connect(self._submit_feedback) @@ -265,19 +271,19 @@ class FeedbackWindow(QMainWindow): self.submit_button.setDefault(True) apply_widget_styles(self.submit_button, "success_button") button_layout.addWidget(self.submit_button) - + layout.addLayout(button_layout) - + def _setup_shortcuts(self) -> None: """設置快捷鍵""" # Ctrl+Enter (主鍵盤) 提交回饋 submit_shortcut_main = QShortcut(QKeySequence("Ctrl+Return"), self) submit_shortcut_main.activated.connect(self._submit_feedback) - + # Ctrl+Enter (數字鍵盤) 提交回饋 submit_shortcut_keypad = QShortcut(QKeySequence(Qt.Modifier.CTRL | Qt.Key.Key_Enter), self) submit_shortcut_keypad.activated.connect(self._submit_feedback) - + # macOS 支援 Cmd+Return (主鍵盤) submit_shortcut_mac_main = QShortcut(QKeySequence("Meta+Return"), self) submit_shortcut_mac_main.activated.connect(self._submit_feedback) @@ -285,19 +291,19 @@ class FeedbackWindow(QMainWindow): # macOS 支援 Cmd+Enter (數字鍵盤) submit_shortcut_mac_keypad = QShortcut(QKeySequence(Qt.Modifier.META | Qt.Key.Key_Enter), self) submit_shortcut_mac_keypad.activated.connect(self._submit_feedback) - + # Escape 取消回饋 cancel_shortcut = QShortcut(QKeySequence(Qt.Key_Escape), self) cancel_shortcut.activated.connect(self._cancel_feedback) - + def _connect_signals(self) -> None: """連接信號""" # 連接語言變更信號 self.language_changed.connect(self._refresh_ui_texts) - + # 連接分頁管理器的信號 self.tab_manager.connect_signals(self) - + def _apply_dark_style(self) -> None: """應用深色主題""" self.setStyleSheet(""" @@ -378,40 +384,40 @@ class FeedbackWindow(QMainWindow): border-color: #005a9e; } """) - + def _on_layout_change_requested(self, combined_mode: bool, orientation: str) -> None: """處理佈局變更請求(模式和方向同時變更)""" try: # 保存當前內容 current_data = self.tab_manager.get_feedback_data() - + # 記住當前分頁索引 current_tab_index = self.tab_widget.currentIndex() - + # 保存新設置 self.combined_mode = combined_mode self.layout_orientation = orientation self.config_manager.set_layout_mode(combined_mode) self.config_manager.set_layout_orientation(orientation) - + # 重新創建分頁 self.tab_manager.set_layout_mode(combined_mode) self.tab_manager.set_layout_orientation(orientation) self.tab_manager.create_tabs() - + # 恢復內容 self.tab_manager.restore_content( current_data["interactive_feedback"], current_data["command_logs"], current_data["images"] ) - + # 重新連接信號 self.tab_manager.connect_signals(self) - + # 刷新UI文字 self._refresh_ui_texts() - + # 恢復到設定頁面(通常是倒數第二個分頁) if self.combined_mode: # 合併模式:回饋、命令、設置、關於 @@ -419,107 +425,107 @@ class FeedbackWindow(QMainWindow): else: # 分離模式:回饋、摘要、命令、設置、關於 settings_tab_index = 3 - + # 確保索引在有效範圍內 if settings_tab_index < self.tab_widget.count(): self.tab_widget.setCurrentIndex(settings_tab_index) - + mode_text = "合併模式" if combined_mode else "分離模式" orientation_text = "(水平布局)" if orientation == "horizontal" else "(垂直布局)" if combined_mode: mode_text += orientation_text debug_log(f"佈局已切換到: {mode_text}") - + except Exception as e: debug_log(f"佈局變更失敗: {e}") QMessageBox.warning(self, t('errors.title'), t('errors.interfaceReloadError', error=str(e))) - - + + def _on_reset_settings_requested(self) -> None: """處理重置設定請求""" try: # 重置配置管理器的所有設定 self.config_manager.reset_settings() - + # 重置應用程式狀態 self.combined_mode = False # 重置為分離模式 self.layout_orientation = 'vertical' # 重置為垂直布局 - + # 重新設置語言為預設 self.i18n.set_language('zh-TW') - + # 保存當前內容 current_data = self.tab_manager.get_feedback_data() - + # 重新創建分頁 self.tab_manager.set_layout_mode(self.combined_mode) self.tab_manager.set_layout_orientation(self.layout_orientation) self.tab_manager.create_tabs() - + # 恢復內容 self.tab_manager.restore_content( current_data["interactive_feedback"], current_data["command_logs"], current_data["images"] ) - + # 重新連接信號 self.tab_manager.connect_signals(self) - + # 重新載入設定分頁的狀態 if self.tab_manager.settings_tab: self.tab_manager.settings_tab.reload_settings_from_config() - + # 刷新UI文字 self._refresh_ui_texts() - + # 重新應用視窗定位(使用重置後的設定) self._apply_window_positioning() - + # 切換到設定分頁顯示重置結果 settings_tab_index = 3 # 分離模式下設定分頁是第4個(索引3) if settings_tab_index < self.tab_widget.count(): self.tab_widget.setCurrentIndex(settings_tab_index) - + # 顯示成功訊息 QMessageBox.information( - self, + self, t('settings.reset.successTitle'), t('settings.reset.successMessage'), QMessageBox.Ok ) - + debug_log("設定重置成功") - + except Exception as e: debug_log(f"重置設定失敗: {e}") QMessageBox.critical( - self, + self, t('errors.title'), t('settings.reset.error', error=str(e)), QMessageBox.Ok ) - + def _submit_feedback(self) -> None: """提交回饋""" # 獲取所有回饋數據 data = self.tab_manager.get_feedback_data() - + self.result = data debug_log(f"回饋提交: 文字長度={len(data['interactive_feedback'])}, " f"命令日誌長度={len(data['command_logs'])}, " f"圖片數量={len(data['images'])}") - + # 關閉窗口 self.close() - + def _cancel_feedback(self) -> None: """取消回饋收集""" debug_log("取消回饋收集") self.result = "" self.close() - + def force_close(self) -> None: """強制關閉視窗(用於超時處理)""" debug_log("強制關閉視窗(超時)") @@ -644,7 +650,7 @@ class FeedbackWindow(QMainWindow): # 倒數計時器只在啟用超時時顯示 self.countdown_label.setVisible(self.timeout_enabled) self.countdown_display.setVisible(self.timeout_enabled) - + def _refresh_ui_texts(self) -> None: """刷新界面文字""" self.setWindowTitle(t('app.title')) @@ -660,11 +666,11 @@ class FeedbackWindow(QMainWindow): # 更新分頁文字 self.tab_manager.update_tab_texts() - + def _apply_window_positioning(self) -> None: """根據用戶設置應用視窗定位策略""" always_center = self.config_manager.get_always_center_window() - + if always_center: # 總是中心顯示模式:使用保存的大小(如果有的話),然後置中 self._restore_window_size_only() @@ -678,22 +684,22 @@ class FeedbackWindow(QMainWindow): else: # 沒有保存的位置,移到中心 self._move_to_primary_screen_center() - + def _is_window_visible(self) -> bool: """檢查視窗是否在任何螢幕的可見範圍內""" from PySide6.QtWidgets import QApplication - + window_rect = self.frameGeometry() - + for screen in QApplication.screens(): if screen.availableGeometry().intersects(window_rect): return True return False - + def _move_to_primary_screen_center(self) -> None: """將視窗移到主螢幕中心""" from PySide6.QtWidgets import QApplication - + screen = QApplication.primaryScreen() if screen: screen_geometry = screen.availableGeometry() @@ -702,7 +708,7 @@ class FeedbackWindow(QMainWindow): window_geometry.moveCenter(center_point) self.move(window_geometry.topLeft()) debug_log("視窗已移到主螢幕中心") - + def _restore_window_size_only(self) -> bool: """只恢復視窗大小(不恢復位置)""" try: @@ -714,7 +720,7 @@ class FeedbackWindow(QMainWindow): except Exception as e: debug_log(f"恢復視窗大小失敗: {e}") return False - + def _restore_last_position(self) -> bool: """嘗試恢復上次保存的視窗位置和大小""" try: @@ -727,18 +733,18 @@ class FeedbackWindow(QMainWindow): except Exception as e: debug_log(f"恢復視窗位置失敗: {e}") return False - + def _save_window_position(self) -> None: """保存當前視窗位置和大小""" try: always_center = self.config_manager.get_always_center_window() - + # 獲取當前幾何信息 current_geometry = { 'width': self.width(), 'height': self.height() } - + if not always_center: # 智能定位模式:同時保存位置 current_geometry['x'] = self.x() @@ -747,45 +753,86 @@ class FeedbackWindow(QMainWindow): else: # 總是中心顯示模式:只保存大小,不保存位置 debug_log(f"已保存視窗大小: {current_geometry['width']}x{current_geometry['height']} (總是中心顯示模式)") - + # 獲取現有配置,只更新需要的部分 saved_geometry = self.config_manager.get_window_geometry() or {} saved_geometry.update(current_geometry) - + self.config_manager.set_window_geometry(saved_geometry) - + except Exception as e: debug_log(f"保存視窗狀態失敗: {e}") - + def resizeEvent(self, event) -> None: """窗口大小變化事件""" super().resizeEvent(event) # 窗口大小變化時始終保存(無論是否設置為中心顯示) if hasattr(self, 'config_manager'): self._schedule_save_window_position() - + def moveEvent(self, event) -> None: """窗口位置變化事件""" super().moveEvent(event) # 窗口位置變化只在智能定位模式下保存 if hasattr(self, 'config_manager') and not self.config_manager.get_always_center_window(): self._schedule_save_window_position() - + def _schedule_save_window_position(self) -> None: """調度窗口位置保存(防抖機制)""" if hasattr(self, '_save_timer'): self._save_timer.start(self._save_delay) - + def _delayed_save_window_position(self) -> None: """延遲保存窗口位置(防抖機制的實際執行)""" self._save_window_position() - + + def _auto_focus_input(self) -> None: + """自動聚焦到輸入框""" + try: + # 確保窗口已經顯示並激活 + self.raise_() + self.activateWindow() + + # 獲取回饋輸入框(修正邏輯) + feedback_input = None + + # 檢查是否有tab_manager + if not hasattr(self, 'tab_manager'): + debug_log("tab_manager 不存在") + return + + # 檢查 feedback_tab(無論是合併模式還是分離模式) + if hasattr(self.tab_manager, 'feedback_tab') and self.tab_manager.feedback_tab: + if hasattr(self.tab_manager.feedback_tab, 'feedback_input'): + feedback_input = self.tab_manager.feedback_tab.feedback_input + debug_log("找到feedback_tab中的輸入框") + else: + debug_log("feedback_tab存在但沒有feedback_input屬性") + else: + debug_log("沒有找到feedback_tab") + + # 設置焦點到輸入框 + if feedback_input: + feedback_input.setFocus() + feedback_input.raise_() # 確保輸入框可見 + debug_log("已自動聚焦到輸入框") + else: + debug_log("未找到回饋輸入框,無法自動聚焦") + # 打印調試信息 + if hasattr(self, 'tab_manager'): + debug_log(f"tab_manager 屬性: {dir(self.tab_manager)}") + + except Exception as e: + debug_log(f"自動聚焦失敗: {e}") + import traceback + debug_log(f"詳細錯誤: {traceback.format_exc()}") + def closeEvent(self, event) -> None: """窗口關閉事件""" # 最終保存視窗狀態(大小始終保存,位置根據設置決定) self._save_window_position() - + # 清理分頁管理器 self.tab_manager.cleanup() event.accept() - debug_log("主窗口已關閉") \ No newline at end of file + debug_log("主窗口已關閉") From 75cc0dbe8af28ef596ff82dc67bfa24231c05489 Mon Sep 17 00:00:00 2001 From: penn Date: Sat, 7 Jun 2025 17:10:57 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E2=9C=A8=20Enhance=20auto-focus=20feature?= =?UTF-8?q?=20with=20settings=20configuration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Added configurable auto-focus option in settings window • Auto-focus now defaults to enabled but can be toggled off • Added configuration management for auto_focus_enabled setting • Enhanced FeedbackWindow to respect auto-focus preference • Added UI controls in SettingsTab with modern switch component • Implemented proper configuration save/load with debug logging • Added i18n support for auto-focus setting in all languages: - English: 'Auto-focus input box when window opens' - 繁體中文: '窗口打開時自動聚焦到輸入框' - 简体中文: '窗口打开时自动聚焦到输入框' This enhancement makes the auto-focus feature more user-friendly by allowing users to choose their preferred input behavior. --- .../gui/locales/en/translations.json | 631 +++++++++--------- .../gui/locales/zh-CN/translations.json | 619 ++++++++--------- .../gui/locales/zh-TW/translations.json | 623 ++++++++--------- .../gui/tabs/settings_tab.py | 160 +++-- .../gui/window/config_manager.py | 59 +- .../gui/window/feedback_window.py | 13 +- 6 files changed, 1069 insertions(+), 1036 deletions(-) diff --git a/src/mcp_feedback_enhanced/gui/locales/en/translations.json b/src/mcp_feedback_enhanced/gui/locales/en/translations.json index a1e8819..1602c19 100644 --- a/src/mcp_feedback_enhanced/gui/locales/en/translations.json +++ b/src/mcp_feedback_enhanced/gui/locales/en/translations.json @@ -1,321 +1,322 @@ { - "meta": { - "language": "en", - "displayName": "English", - "author": "Minidoracat", - "version": "1.0.0", - "lastUpdate": "2025-01-31" - }, - "app": { - "title": "Interactive Feedback Collection", - "projectDirectory": "Project Directory", - "language": "Language", - "settings": "Settings", - "confirmCancel": "Confirm Cancel", - "confirmCancelMessage": "Are you sure you want to cancel feedback? All input content will be lost.", - "layoutChangeTitle": "Interface Layout Change", - "layoutChangeMessage": "Layout mode has been changed and requires reloading the interface to take effect.\nReload now?" - }, - "tabs": { - "summary": "📋 AI Summary", - "feedback": "💬 Feedback", - "command": "⚡ Command", - "language": "⚙️ Settings", - "images": "🖼️ Images", - "about": "ℹ️ About" - }, - "about": { - "appInfo": "Application Information", - "version": "Version", - "description": "A powerful MCP server that provides human-in-the-loop interactive feedback functionality for AI-assisted development tools. Supports dual interfaces (Qt GUI and Web UI) with rich features including image upload, command execution, and multi-language support.", - "projectLinks": "Project Links", - "githubProject": "GitHub Project", - "visitGithub": "Visit GitHub", - "contact": "Contact & Support", - "discordSupport": "Discord Support", - "joinDiscord": "Join Discord", - "contactDescription": "For technical support, issue reports, or feature suggestions, feel free to contact us through Discord community or GitHub Issues.", - "thanks": "Thanks & Contributions", - "thanksText": "Special thanks to the original author Fábio Ferreira (@fabiomlferreira) for creating the original interactive-feedback-mcp project.\n\nThis enhanced version is developed and maintained by Minidoracat, who has significantly expanded the project with GUI interface, image support, multi-language capabilities, and many other improvements.\n\nAlso thanks to sanshao85's mcp-feedback-collector project for UI design inspiration.\n\nOpen source collaboration makes technology better!" - }, - "feedback": { - "title": "Your Feedback", - "description": "Please describe your thoughts, suggestions, or modifications needed for the AI's work.", - "placeholder": "Please enter your feedback, suggestions, or questions here...\n\n💡 Tips:\n• Press Ctrl+Enter (numpad supported) to submit quickly\n• Press Ctrl+V to paste images from clipboard", - "emptyTitle": "Feedback Content Empty", - "emptyMessage": "Please enter feedback content before submitting. You can describe your thoughts, suggestions, or areas that need modification.", - "outputPlaceholder": "Command output will appear here..." - }, - "summary": { - "title": "AI Work Summary", - "description": "Below is the work content that AI has just completed for you. Please review and provide feedback.", - "testDescription": "Below is the message content replied by AI. Please review and provide feedback." - }, - "command": { - "title": "Command Execution", - "description": "You can execute commands to verify results or gather more information.", - "placeholder": "Enter command to execute...", - "output": "Command Output", - "outputPlaceholder": "Command output will appear here...", - "run": "▶️ Run", - "terminate": "⏹️ Stop" - }, - "images": { - "title": "🖼️ Image Attachments (Optional)", - "select": "Select Files", - "paste": "Clipboard", - "clear": "Clear", - "status": "{count} images selected", - "statusWithSize": "{count} images selected (Total {size})", - "dragHint": "🎯 Drag images here or press Ctrl+V/Cmd+V to paste from clipboard (PNG, JPG, JPEG, GIF, BMP, WebP)", - "deleteConfirm": "Are you sure you want to remove image \"{filename}\"?", - "deleteTitle": "Confirm Delete", - "sizeWarning": "Image file size cannot exceed 1MB", - "formatError": "Unsupported image format", - "paste_images": "📋 Paste from Clipboard", - "paste_failed": "Paste failed, no image in clipboard", - "paste_no_image": "No image in clipboard to paste", - "paste_image_from_textarea": "Image intelligently pasted from text area to image area", - "images_clear": "Clear all images", - "settings": { - "title": "Image Settings", - "sizeLimit": "Image Size Limit", - "sizeLimitOptions": { - "unlimited": "Unlimited", - "1mb": "1MB", - "3mb": "3MB", - "5mb": "5MB" - }, - "base64Detail": "Base64 Compatibility Mode", - "base64DetailHelp": "When enabled, includes complete Base64 image data in text to improve compatibility with AI models ", - "base64Warning": "⚠️ Increases transmission size", - "compatibilityHint": "💡 Images not recognized correctly?", - "enableBase64Hint": "Try enabling Base64 compatibility mode" + "meta": { + "language": "en", + "displayName": "English", + "author": "Minidoracat", + "version": "1.0.0", + "lastUpdate": "2025-01-31" + }, + "app": { + "title": "Interactive Feedback Collection", + "projectDirectory": "Project Directory", + "language": "Language", + "settings": "Settings", + "confirmCancel": "Confirm Cancel", + "confirmCancelMessage": "Are you sure you want to cancel feedback? All input content will be lost.", + "layoutChangeTitle": "Interface Layout Change", + "layoutChangeMessage": "Layout mode has been changed and requires reloading the interface to take effect.\nReload now?" + }, + "tabs": { + "summary": "📋 AI Summary", + "feedback": "💬 Feedback", + "command": "⚡ Command", + "language": "⚙️ Settings", + "images": "🖼️ Images", + "about": "ℹ️ About" + }, + "about": { + "appInfo": "Application Information", + "version": "Version", + "description": "A powerful MCP server that provides human-in-the-loop interactive feedback functionality for AI-assisted development tools. Supports dual interfaces (Qt GUI and Web UI) with rich features including image upload, command execution, and multi-language support.", + "projectLinks": "Project Links", + "githubProject": "GitHub Project", + "visitGithub": "Visit GitHub", + "contact": "Contact & Support", + "discordSupport": "Discord Support", + "joinDiscord": "Join Discord", + "contactDescription": "For technical support, issue reports, or feature suggestions, feel free to contact us through Discord community or GitHub Issues.", + "thanks": "Thanks & Contributions", + "thanksText": "Special thanks to the original author Fábio Ferreira (@fabiomlferreira) for creating the original interactive-feedback-mcp project.\n\nThis enhanced version is developed and maintained by Minidoracat, who has significantly expanded the project with GUI interface, image support, multi-language capabilities, and many other improvements.\n\nAlso thanks to sanshao85's mcp-feedback-collector project for UI design inspiration.\n\nOpen source collaboration makes technology better!" + }, + "feedback": { + "title": "Your Feedback", + "description": "Please describe your thoughts, suggestions, or modifications needed for the AI's work.", + "placeholder": "Please enter your feedback, suggestions, or questions here...\n\n💡 Tips:\n• Press Ctrl+Enter (numpad supported) to submit quickly\n• Press Ctrl+V to paste images from clipboard", + "emptyTitle": "Feedback Content Empty", + "emptyMessage": "Please enter feedback content before submitting. You can describe your thoughts, suggestions, or areas that need modification.", + "outputPlaceholder": "Command output will appear here..." + }, + "summary": { + "title": "AI Work Summary", + "description": "Below is the work content that AI has just completed for you. Please review and provide feedback.", + "testDescription": "Below is the message content replied by AI. Please review and provide feedback." + }, + "command": { + "title": "Command Execution", + "description": "You can execute commands to verify results or gather more information.", + "placeholder": "Enter command to execute...", + "output": "Command Output", + "outputPlaceholder": "Command output will appear here...", + "run": "▶️ Run", + "terminate": "⏹️ Stop" + }, + "images": { + "title": "🖼️ Image Attachments (Optional)", + "select": "Select Files", + "paste": "Clipboard", + "clear": "Clear", + "status": "{count} images selected", + "statusWithSize": "{count} images selected (Total {size})", + "dragHint": "🎯 Drag images here or press Ctrl+V/Cmd+V to paste from clipboard (PNG, JPG, JPEG, GIF, BMP, WebP)", + "deleteConfirm": "Are you sure you want to remove image \"{filename}\"?", + "deleteTitle": "Confirm Delete", + "sizeWarning": "Image file size cannot exceed 1MB", + "formatError": "Unsupported image format", + "paste_images": "📋 Paste from Clipboard", + "paste_failed": "Paste failed, no image in clipboard", + "paste_no_image": "No image in clipboard to paste", + "paste_image_from_textarea": "Image intelligently pasted from text area to image area", + "images_clear": "Clear all images", + "settings": { + "title": "Image Settings", + "sizeLimit": "Image Size Limit", + "sizeLimitOptions": { + "unlimited": "Unlimited", + "1mb": "1MB", + "3mb": "3MB", + "5mb": "5MB" + }, + "base64Detail": "Base64 Compatibility Mode", + "base64DetailHelp": "When enabled, includes complete Base64 image data in text to improve compatibility with AI models ", + "base64Warning": "⚠️ Increases transmission size", + "compatibilityHint": "💡 Images not recognized correctly?", + "enableBase64Hint": "Try enabling Base64 compatibility mode" + }, + "sizeLimitExceeded": "Image {filename} size is {size}, exceeds {limit} limit!", + "sizeLimitExceededAdvice": "Please compress the image using image editing software, or adjust the image size limit setting." }, - "sizeLimitExceeded": "Image {filename} size is {size}, exceeds {limit} limit!", - "sizeLimitExceededAdvice": "Please compress the image using image editing software, or adjust the image size limit setting." - }, - "language": { - "settings": "Language Settings", - "selector": "🌐 Language Selection", - "description": "Choose your preferred interface language. Language changes take effect immediately." - }, - "settings": { - "title": "Application Settings", "language": { - "title": "Language Settings", - "selector": "🌐 Language Selection" + "settings": "Language Settings", + "selector": "🌐 Language Selection", + "description": "Choose your preferred interface language. Language changes take effect immediately." }, - "layout": { - "title": "Interface Layout", - "separateMode": "Separate Mode", - "separateModeDescription": "AI summary and feedback are in separate tabs", - "combinedVertical": "Combined Mode (Vertical Layout)", - "combinedVerticalDescription": "AI summary on top, feedback input below, both on the same page", - "combinedHorizontal": "Combined Mode (Horizontal Layout)", - "combinedHorizontalDescription": "AI summary on left, feedback input on right, expanding summary viewing area" - }, - "window": { - "title": "Window Positioning", - "alwaysCenter": "Always show window at primary screen center" - }, - "reset": { - "title": "Reset Settings", - "button": "Reset Settings", - "confirmTitle": "Confirm Reset Settings", - "confirmMessage": "Are you sure you want to reset all settings? This will clear all saved preferences and restore to default state.", - "successTitle": "Reset Successful", - "successMessage": "All settings have been successfully reset to default values.", - "errorTitle": "Reset Failed", - "errorMessage": "Error occurred while resetting settings: {error}" - } - }, - "timeout": { - "enable": "Auto Close", - "enableTooltip": "When enabled, the interface will automatically close after the specified time", - "duration": { - "label": "Timeout Duration", - "description": "Set the auto-close time (30 seconds - 2 hours)" - }, - "seconds": "seconds", - "remaining": "Time Remaining", - "expired": "Time Expired", - "autoCloseMessage": "Interface will automatically close in {seconds} seconds", "settings": { - "title": "Timeout Settings", - "description": "When enabled, the interface will automatically close after the specified time. The countdown timer will be displayed in the header area." + "title": "Application Settings", + "language": { + "title": "Language Settings", + "selector": "🌐 Language Selection" + }, + "layout": { + "title": "Interface Layout", + "separateMode": "Separate Mode", + "separateModeDescription": "AI summary and feedback are in separate tabs", + "combinedVertical": "Combined Mode (Vertical Layout)", + "combinedVerticalDescription": "AI summary on top, feedback input below, both on the same page", + "combinedHorizontal": "Combined Mode (Horizontal Layout)", + "combinedHorizontalDescription": "AI summary on left, feedback input on right, expanding summary viewing area" + }, + "window": { + "title": "Window Positioning", + "alwaysCenter": "Always show window at primary screen center", + "autoFocus": "Auto-focus input box when window opens" + }, + "reset": { + "title": "Reset Settings", + "button": "Reset Settings", + "confirmTitle": "Confirm Reset Settings", + "confirmMessage": "Are you sure you want to reset all settings? This will clear all saved preferences and restore to default state.", + "successTitle": "Reset Successful", + "successMessage": "All settings have been successfully reset to default values.", + "errorTitle": "Reset Failed", + "errorMessage": "Error occurred while resetting settings: {error}" + } + }, + "timeout": { + "enable": "Auto Close", + "enableTooltip": "When enabled, the interface will automatically close after the specified time", + "duration": { + "label": "Timeout Duration", + "description": "Set the auto-close time (30 seconds - 2 hours)" + }, + "seconds": "seconds", + "remaining": "Time Remaining", + "expired": "Time Expired", + "autoCloseMessage": "Interface will automatically close in {seconds} seconds", + "settings": { + "title": "Timeout Settings", + "description": "When enabled, the interface will automatically close after the specified time. The countdown timer will be displayed in the header area." + } + }, + "buttons": { + "submit": "Submit Feedback", + "cancel": "Cancel", + "close": "Close", + "clear": "Clear", + "submitFeedback": "✅ Submit Feedback", + "selectFiles": "📁 Select Files", + "pasteClipboard": "📋 Clipboard", + "clearAll": "✕ Clear", + "runCommand": "▶️ Run" + }, + "status": { + "feedbackSubmitted": "Feedback submitted successfully!", + "feedbackCancelled": "Feedback cancelled.", + "timeoutMessage": "Feedback timeout", + "errorOccurred": "Error occurred", + "loading": "Loading...", + "connecting": "Connecting...", + "connected": "Connected", + "disconnected": "Disconnected", + "uploading": "Uploading...", + "uploadSuccess": "Upload successful", + "uploadFailed": "Upload failed", + "commandRunning": "Command running...", + "commandFinished": "Command finished", + "pasteSuccess": "Image pasted from clipboard", + "pasteFailed": "Failed to get image from clipboard", + "invalidFileType": "Unsupported file type", + "fileTooLarge": "File too large (max 1MB)" + }, + "errors": { + "title": "Error", + "warning": "Warning", + "info": "Information", + "interfaceReloadError": "Error occurred while reloading interface: {error}", + "imageSaveEmpty": "Saved image file is empty! Location: {path}", + "imageSaveFailed": "Image save failed!", + "clipboardSaveFailed": "Failed to save clipboard image!", + "noValidImage": "No valid image in clipboard!", + "noImageContent": "No image content in clipboard!", + "emptyFile": "Image {filename} is an empty file!", + "loadImageFailed": "Failed to load image {filename}:\n{error}", + "dragInvalidFiles": "Please drag valid image files!", + "confirmClearAll": "Are you sure you want to clear all {count} images?", + "confirmClearTitle": "Confirm Clear", + "fileSizeExceeded": "Image {filename} size is {size}MB, exceeding 1MB limit!\nRecommend using image editing software to compress before uploading.", + "dataSizeExceeded": "Image {filename} data size exceeds 1MB limit!" + }, + "languageSelector": "🌐 Language", + "languageNames": { + "zhTw": "繁體中文", + "en": "English", + "zhCn": "简体中文" + }, + "test": { + "qtGuiSummary": "🎯 Image Preview and Window Adjustment Test\n\nThis is a test session to verify the following features:\n\n✅ Test Items:\n1. Image upload and preview functionality\n2. Image X delete button in top-right corner\n3. Free window resizing\n4. Flexible splitter adjustment\n5. Dynamic layout of all areas\n6. Smart Ctrl+V image paste functionality\n\n📋 Test Steps:\n1. Try uploading some images (drag & drop, file selection, clipboard)\n2. Check if image preview displays correctly\n3. Click the X button in the top-right corner of images to delete them\n4. Try resizing the window, check if it can be freely adjusted\n5. Drag the splitter to adjust area sizes\n6. Press Ctrl+V in the text box to test smart paste functionality\n7. Provide any feedback or issues found\n\nPlease test these features and provide feedback!", + "webUiSummary": "Test Web UI Functionality\n\n🎯 **Test Items:**\n- Web UI server startup and operation\n- WebSocket real-time communication\n- Feedback submission functionality\n- Image upload and preview\n- Command execution functionality\n- Smart Ctrl+V image paste\n- Multi-language interface switching\n\n📋 **Test Steps:**\n1. Test image upload (drag & drop, file selection, clipboard)\n2. Press Ctrl+V in text box to test smart paste\n3. Try switching languages (Traditional Chinese/Simplified Chinese/English)\n4. Test command execution functionality\n5. Submit feedback and images\n\nPlease test these features and provide feedback!", + "messages": { + "webModuleLoaded": "✅ Using new web module", + "webModuleLoadFailed": "⚠️ Unable to import Web UI module: {error}", + "startingWebServer": "🚀 Starting Web server...", + "serverStartError": "Server startup error: {error}", + "webServerStartSuccess": "✅ Web server started successfully", + "serverRunningAt": "🌐 Server running at: http://{host}:{port}", + "cannotConnectToPort": "❌ Cannot connect to server port {port}", + "webServerStartFailed": "❌ Web server startup failed: {error}", + "serverNotStarted": "❌ Server failed to start properly", + "testSessionCreated": "✅ Test session created successfully (ID: {sessionId}...)", + "testUrl": "🔗 Test URL: {url}", + "testingBrowserLaunch": "🌐 Testing browser launch functionality...", + "wslEnvironmentDetected": "✅ WSL environment detected, using WSL-specific browser launch", + "nonWslEnvironment": "ℹ️ Non-WSL environment, using standard browser launch", + "browserLaunchSuccess": "✅ Browser launch successful: {url}", + "browserLaunchFailed": "⚠️ Browser launch failed: {error}", + "browserLaunchNote": "💡 This might be normal, please manually open the above URL in browser", + "sessionCreationFailed": "❌ Session creation failed: {error}", + "allTestsPassed": "🎉 All tests passed! Web UI ready", + "notes": "📝 Notes:", + "webUiAutoEnabled": " - Web UI will auto-enable in SSH remote environments", + "localEnvironmentGui": " - Local environment will continue using Qt GUI", + "realtimeCommandSupport": " - Supports real-time command execution and WebSocket communication", + "modernDarkTheme": " - Provides modern dark theme interface", + "smartCtrlVPaste": " - Supports smart Ctrl+V image paste functionality", + "testingEnvironmentDetection": "🔍 Testing environment detection functionality", + "wslDetection": "WSL environment detection: {result}", + "remoteDetection": "Remote environment detection: {result}", + "guiAvailability": "GUI availability: {result}", + "yes": "Yes", + "no": "No", + "wslEnvironmentWebUi": "✅ WSL environment detected, will use Web UI with Windows browser launch support", + "remoteEnvironmentWebUi": "✅ Will use Web UI (suitable for remote development environment)", + "localEnvironmentQtGui": "✅ Will use Qt GUI (local environment)", + "environmentDetectionFailed": "❌ Environment detection failed: {error}", + "testingMcpIntegration": "🔧 Testing MCP integration functionality", + "mcpToolFunctionAvailable": "✅ MCP tool function available", + "timeoutParameterSupported": "✅ Supports timeout parameter", + "environmentBasedWebUiSupported": "✅ Supports environment variable-based Web UI selection", + "readyForAiAssistantCalls": "✅ Ready to accept calls from AI assistant", + "mcpIntegrationTestFailed": "❌ MCP integration test failed: {error}", + "testingParameterFunctionality": "🆕 Testing parameter functionality", + "timeoutParameterExists": "✅ timeout parameter exists, default value: {default}", + "timeoutParameterMissing": "❌ timeout parameter does not exist", + "forceWebDetected": "✅ FORCE_WEB environment variable detected: {value}", + "forceWebNotSet": "ℹ️ FORCE_WEB environment variable not set (will use default logic)", + "parameterFunctionalityNormal": "✅ Parameter functionality normal", + "parameterTestFailed": "❌ Parameter test failed: {error}", + "testingEnvironmentWebUiMode": "🌐 Testing environment variable-controlled Web UI mode", + "currentEnvironment": "Current environment - WSL: {wsl}, Remote: {remote}, GUI available: {gui}", + "forceWebVariable": "FORCE_WEB environment variable: {value}", + "notSet": "Not set", + "forceWebEnabled": "✅ FORCE_WEB enabled, will force use Web UI", + "wslEnvironmentWebUiBrowser": "✅ WSL environment, will use Web UI with Windows browser launch support", + "localGuiEnvironmentQtGui": "ℹ️ Local GUI environment, will use Qt GUI", + "forceWebTestHint": "💡 Can set FORCE_WEB=true to force use Web UI for testing", + "autoWebUiRemoteOrNoGui": "ℹ️ Will automatically use Web UI (remote environment or GUI unavailable)", + "environmentVariableTestFailed": "❌ Environment variable test failed: {error}", + "webUiInteractiveTestMode": "🌐 Web UI Interactive Test Mode", + "serverAddress": "Server address: {url}", + "operationGuide": "📖 Operation Guide:", + "openServerInBrowser": " 1. Open the above server address in browser", + "tryFollowingFeatures": " 2. Try the following features:", + "clickShowCommandBlock": " - Click 'Show Command Block' button", + "inputCommandAndExecute": " - Input command like 'echo Hello World' and execute", + "inputTextInFeedbackArea": " - Input text in feedback area", + "useCtrlEnterSubmit": " - Use Ctrl+Enter to submit feedback", + "testWebSocketRealtime": " 3. Test WebSocket real-time communication functionality", + "testPagePersistence": " 4. Test page persistence (page doesn't close after feedback submission)", + "controlOptions": "⌨️ Control Options:", + "pressEnterContinue": " - Press Enter to continue running", + "inputQuitToStop": " - Input 'q' or 'quit' to stop server", + "stoppingServer": "🛑 Stopping server...", + "serverContinuesRunning": "🔄 Server continues running at: {url}", + "browserShouldStillAccess": " Browser should still be able to access normally", + "unknownCommand": "❓ Unknown command. Press Enter to continue running, or input 'q' to exit", + "interruptSignalReceived": "🛑 Interrupt signal received, stopping server...", + "webUiTestComplete": "✅ Web UI test complete", + "allTestsComplete": "🎊 All tests complete! Ready to use MCP Feedback Enhanced", + "usageInstructions": "📖 Usage Instructions:", + "configureMcpServer": " 1. Configure this MCP server in Cursor/Cline", + "aiAssistantAutoCall": " 2. AI assistant will automatically call interactive_feedback tool", + "autoSelectGuiOrWebUi": " 3. Automatically select GUI or Web UI based on environment", + "provideFeedbackContinue": " 4. Provide feedback and continue workflow", + "webUiNewFeatures": "✨ Web UI New Features:", + "sshRemoteSupport": " - Supports SSH remote development environment", + "modernDarkThemeInterface": " - Modern dark theme interface", + "webSocketRealtime": " - WebSocket real-time communication", + "autoBrowserLaunch": " - Automatic browser launch", + "commandExecutionRealtime": " - Command execution and real-time output", + "testCompleteSystemReady": "✅ Test complete - System ready!", + "canTestInBrowserNow": "💡 You can test in browser now: {url}", + "serverWillContinueRunning": " (Server will continue running for a short time)", + "someTestsFailed": "❌ Some tests failed, please check error messages", + "testingWebUi": "🧪 Testing MCP Feedback Enhanced Web UI", + "syncingLanguageSettings": "🔄 Syncing language settings...", + "currentLanguage": "📝 Current language: {language}", + "webUiModuleImportSuccess": "✅ Web UI module imported successfully", + "webUiModuleImportFailed": "❌ Web UI module import failed: {error}", + "webUiManagerCreateSuccess": "✅ WebUIManager created successfully", + "webUiManagerCreateFailed": "❌ WebUIManager creation failed: {error}", + "noLanguageInSettings": "⚠️ No language setting in ui_settings.json", + "settingsFileNotExists": "⚠️ ui_settings.json file does not exist, using default language", + "loadLanguageSettingsFailed": "⚠️ Failed to load language settings: {error}", + "loadingLanguageFromSettings": "🔄 Loading language setting from ui_settings.json: {language}", + "syncingLanguage": "🔄 Syncing language setting: {from} -> {to}", + "guiLanguageSynced": "✅ GUI language synced to: {language}", + "languageAlreadySynced": "✅ Language setting already synced: {language}", + "webUiTest": "MCP Feedback Enhanced - Web UI Test", + "languageSetFailed": "⚠️ Language setting failed, using default language: {language}", + "foundAvailablePort": "🔍 Found available port: {port}", + "findPortFailed": "❌ Failed to find available port: {error}" + } } - }, - "buttons": { - "submit": "Submit Feedback", - "cancel": "Cancel", - "close": "Close", - "clear": "Clear", - "submitFeedback": "✅ Submit Feedback", - "selectFiles": "📁 Select Files", - "pasteClipboard": "📋 Clipboard", - "clearAll": "✕ Clear", - "runCommand": "▶️ Run" - }, - "status": { - "feedbackSubmitted": "Feedback submitted successfully!", - "feedbackCancelled": "Feedback cancelled.", - "timeoutMessage": "Feedback timeout", - "errorOccurred": "Error occurred", - "loading": "Loading...", - "connecting": "Connecting...", - "connected": "Connected", - "disconnected": "Disconnected", - "uploading": "Uploading...", - "uploadSuccess": "Upload successful", - "uploadFailed": "Upload failed", - "commandRunning": "Command running...", - "commandFinished": "Command finished", - "pasteSuccess": "Image pasted from clipboard", - "pasteFailed": "Failed to get image from clipboard", - "invalidFileType": "Unsupported file type", - "fileTooLarge": "File too large (max 1MB)" - }, - "errors": { - "title": "Error", - "warning": "Warning", - "info": "Information", - "interfaceReloadError": "Error occurred while reloading interface: {error}", - "imageSaveEmpty": "Saved image file is empty! Location: {path}", - "imageSaveFailed": "Image save failed!", - "clipboardSaveFailed": "Failed to save clipboard image!", - "noValidImage": "No valid image in clipboard!", - "noImageContent": "No image content in clipboard!", - "emptyFile": "Image {filename} is an empty file!", - "loadImageFailed": "Failed to load image {filename}:\n{error}", - "dragInvalidFiles": "Please drag valid image files!", - "confirmClearAll": "Are you sure you want to clear all {count} images?", - "confirmClearTitle": "Confirm Clear", - "fileSizeExceeded": "Image {filename} size is {size}MB, exceeding 1MB limit!\nRecommend using image editing software to compress before uploading.", - "dataSizeExceeded": "Image {filename} data size exceeds 1MB limit!" - }, - "languageSelector": "🌐 Language", - "languageNames": { - "zhTw": "繁體中文", - "en": "English", - "zhCn": "简体中文" - }, - "test": { - "qtGuiSummary": "🎯 Image Preview and Window Adjustment Test\n\nThis is a test session to verify the following features:\n\n✅ Test Items:\n1. Image upload and preview functionality\n2. Image X delete button in top-right corner\n3. Free window resizing\n4. Flexible splitter adjustment\n5. Dynamic layout of all areas\n6. Smart Ctrl+V image paste functionality\n\n📋 Test Steps:\n1. Try uploading some images (drag & drop, file selection, clipboard)\n2. Check if image preview displays correctly\n3. Click the X button in the top-right corner of images to delete them\n4. Try resizing the window, check if it can be freely adjusted\n5. Drag the splitter to adjust area sizes\n6. Press Ctrl+V in the text box to test smart paste functionality\n7. Provide any feedback or issues found\n\nPlease test these features and provide feedback!", - "webUiSummary": "Test Web UI Functionality\n\n🎯 **Test Items:**\n- Web UI server startup and operation\n- WebSocket real-time communication\n- Feedback submission functionality\n- Image upload and preview\n- Command execution functionality\n- Smart Ctrl+V image paste\n- Multi-language interface switching\n\n📋 **Test Steps:**\n1. Test image upload (drag & drop, file selection, clipboard)\n2. Press Ctrl+V in text box to test smart paste\n3. Try switching languages (Traditional Chinese/Simplified Chinese/English)\n4. Test command execution functionality\n5. Submit feedback and images\n\nPlease test these features and provide feedback!", - "messages": { - "webModuleLoaded": "✅ Using new web module", - "webModuleLoadFailed": "⚠️ Unable to import Web UI module: {error}", - "startingWebServer": "🚀 Starting Web server...", - "serverStartError": "Server startup error: {error}", - "webServerStartSuccess": "✅ Web server started successfully", - "serverRunningAt": "🌐 Server running at: http://{host}:{port}", - "cannotConnectToPort": "❌ Cannot connect to server port {port}", - "webServerStartFailed": "❌ Web server startup failed: {error}", - "serverNotStarted": "❌ Server failed to start properly", - "testSessionCreated": "✅ Test session created successfully (ID: {sessionId}...)", - "testUrl": "🔗 Test URL: {url}", - "testingBrowserLaunch": "🌐 Testing browser launch functionality...", - "wslEnvironmentDetected": "✅ WSL environment detected, using WSL-specific browser launch", - "nonWslEnvironment": "ℹ️ Non-WSL environment, using standard browser launch", - "browserLaunchSuccess": "✅ Browser launch successful: {url}", - "browserLaunchFailed": "⚠️ Browser launch failed: {error}", - "browserLaunchNote": "💡 This might be normal, please manually open the above URL in browser", - "sessionCreationFailed": "❌ Session creation failed: {error}", - "allTestsPassed": "🎉 All tests passed! Web UI ready", - "notes": "📝 Notes:", - "webUiAutoEnabled": " - Web UI will auto-enable in SSH remote environments", - "localEnvironmentGui": " - Local environment will continue using Qt GUI", - "realtimeCommandSupport": " - Supports real-time command execution and WebSocket communication", - "modernDarkTheme": " - Provides modern dark theme interface", - "smartCtrlVPaste": " - Supports smart Ctrl+V image paste functionality", - "testingEnvironmentDetection": "🔍 Testing environment detection functionality", - "wslDetection": "WSL environment detection: {result}", - "remoteDetection": "Remote environment detection: {result}", - "guiAvailability": "GUI availability: {result}", - "yes": "Yes", - "no": "No", - "wslEnvironmentWebUi": "✅ WSL environment detected, will use Web UI with Windows browser launch support", - "remoteEnvironmentWebUi": "✅ Will use Web UI (suitable for remote development environment)", - "localEnvironmentQtGui": "✅ Will use Qt GUI (local environment)", - "environmentDetectionFailed": "❌ Environment detection failed: {error}", - "testingMcpIntegration": "🔧 Testing MCP integration functionality", - "mcpToolFunctionAvailable": "✅ MCP tool function available", - "timeoutParameterSupported": "✅ Supports timeout parameter", - "environmentBasedWebUiSupported": "✅ Supports environment variable-based Web UI selection", - "readyForAiAssistantCalls": "✅ Ready to accept calls from AI assistant", - "mcpIntegrationTestFailed": "❌ MCP integration test failed: {error}", - "testingParameterFunctionality": "🆕 Testing parameter functionality", - "timeoutParameterExists": "✅ timeout parameter exists, default value: {default}", - "timeoutParameterMissing": "❌ timeout parameter does not exist", - "forceWebDetected": "✅ FORCE_WEB environment variable detected: {value}", - "forceWebNotSet": "ℹ️ FORCE_WEB environment variable not set (will use default logic)", - "parameterFunctionalityNormal": "✅ Parameter functionality normal", - "parameterTestFailed": "❌ Parameter test failed: {error}", - "testingEnvironmentWebUiMode": "🌐 Testing environment variable-controlled Web UI mode", - "currentEnvironment": "Current environment - WSL: {wsl}, Remote: {remote}, GUI available: {gui}", - "forceWebVariable": "FORCE_WEB environment variable: {value}", - "notSet": "Not set", - "forceWebEnabled": "✅ FORCE_WEB enabled, will force use Web UI", - "wslEnvironmentWebUiBrowser": "✅ WSL environment, will use Web UI with Windows browser launch support", - "localGuiEnvironmentQtGui": "ℹ️ Local GUI environment, will use Qt GUI", - "forceWebTestHint": "💡 Can set FORCE_WEB=true to force use Web UI for testing", - "autoWebUiRemoteOrNoGui": "ℹ️ Will automatically use Web UI (remote environment or GUI unavailable)", - "environmentVariableTestFailed": "❌ Environment variable test failed: {error}", - "webUiInteractiveTestMode": "🌐 Web UI Interactive Test Mode", - "serverAddress": "Server address: {url}", - "operationGuide": "📖 Operation Guide:", - "openServerInBrowser": " 1. Open the above server address in browser", - "tryFollowingFeatures": " 2. Try the following features:", - "clickShowCommandBlock": " - Click 'Show Command Block' button", - "inputCommandAndExecute": " - Input command like 'echo Hello World' and execute", - "inputTextInFeedbackArea": " - Input text in feedback area", - "useCtrlEnterSubmit": " - Use Ctrl+Enter to submit feedback", - "testWebSocketRealtime": " 3. Test WebSocket real-time communication functionality", - "testPagePersistence": " 4. Test page persistence (page doesn't close after feedback submission)", - "controlOptions": "⌨️ Control Options:", - "pressEnterContinue": " - Press Enter to continue running", - "inputQuitToStop": " - Input 'q' or 'quit' to stop server", - "stoppingServer": "🛑 Stopping server...", - "serverContinuesRunning": "🔄 Server continues running at: {url}", - "browserShouldStillAccess": " Browser should still be able to access normally", - "unknownCommand": "❓ Unknown command. Press Enter to continue running, or input 'q' to exit", - "interruptSignalReceived": "🛑 Interrupt signal received, stopping server...", - "webUiTestComplete": "✅ Web UI test complete", - "allTestsComplete": "🎊 All tests complete! Ready to use MCP Feedback Enhanced", - "usageInstructions": "📖 Usage Instructions:", - "configureMcpServer": " 1. Configure this MCP server in Cursor/Cline", - "aiAssistantAutoCall": " 2. AI assistant will automatically call interactive_feedback tool", - "autoSelectGuiOrWebUi": " 3. Automatically select GUI or Web UI based on environment", - "provideFeedbackContinue": " 4. Provide feedback and continue workflow", - "webUiNewFeatures": "✨ Web UI New Features:", - "sshRemoteSupport": " - Supports SSH remote development environment", - "modernDarkThemeInterface": " - Modern dark theme interface", - "webSocketRealtime": " - WebSocket real-time communication", - "autoBrowserLaunch": " - Automatic browser launch", - "commandExecutionRealtime": " - Command execution and real-time output", - "testCompleteSystemReady": "✅ Test complete - System ready!", - "canTestInBrowserNow": "💡 You can test in browser now: {url}", - "serverWillContinueRunning": " (Server will continue running for a short time)", - "someTestsFailed": "❌ Some tests failed, please check error messages", - "testingWebUi": "🧪 Testing MCP Feedback Enhanced Web UI", - "syncingLanguageSettings": "🔄 Syncing language settings...", - "currentLanguage": "📝 Current language: {language}", - "webUiModuleImportSuccess": "✅ Web UI module imported successfully", - "webUiModuleImportFailed": "❌ Web UI module import failed: {error}", - "webUiManagerCreateSuccess": "✅ WebUIManager created successfully", - "webUiManagerCreateFailed": "❌ WebUIManager creation failed: {error}", - "noLanguageInSettings": "⚠️ No language setting in ui_settings.json", - "settingsFileNotExists": "⚠️ ui_settings.json file does not exist, using default language", - "loadLanguageSettingsFailed": "⚠️ Failed to load language settings: {error}", - "loadingLanguageFromSettings": "🔄 Loading language setting from ui_settings.json: {language}", - "syncingLanguage": "🔄 Syncing language setting: {from} -> {to}", - "guiLanguageSynced": "✅ GUI language synced to: {language}", - "languageAlreadySynced": "✅ Language setting already synced: {language}", - "webUiTest": "MCP Feedback Enhanced - Web UI Test", - "languageSetFailed": "⚠️ Language setting failed, using default language: {language}", - "foundAvailablePort": "🔍 Found available port: {port}", - "findPortFailed": "❌ Failed to find available port: {error}" - } - } -} \ No newline at end of file +} diff --git a/src/mcp_feedback_enhanced/gui/locales/zh-CN/translations.json b/src/mcp_feedback_enhanced/gui/locales/zh-CN/translations.json index 2f30086..8460e7e 100644 --- a/src/mcp_feedback_enhanced/gui/locales/zh-CN/translations.json +++ b/src/mcp_feedback_enhanced/gui/locales/zh-CN/translations.json @@ -1,316 +1,317 @@ { - "meta": { - "language": "zh-CN", - "displayName": "简体中文", - "author": "Minidoracat", - "version": "1.0.0", - "lastUpdate": "2025-01-31" - }, - "app": { - "title": "交互式反馈收集", - "projectDirectory": "项目目录", - "language": "语言", - "settings": "设置", - "confirmCancel": "确认取消", - "confirmCancelMessage": "确定要取消反馈吗?所有输入的内容将会丢失。", - "layoutChangeTitle": "界面布局变更", - "layoutChangeMessage": "布局模式已变更,需要重新加载界面才能生效。\n是否现在重新加载?" - }, - "tabs": { - "summary": "📋 AI 摘要", - "feedback": "💬 反馈", - "command": "⚡ 命令", - "language": "⚙️ 设置", - "images": "🖼️ 图片", - "about": "ℹ️ 关于" - }, - "feedback": { - "title": "您的反馈", - "description": "请描述您对 AI 工作结果的想法、建议或需要修改的地方。", - "placeholder": "请在这里输入您的反馈、建议或问题...\n\n💡 小提示:\n• 按 Ctrl+Enter(支持数字键盘)可快速提交反馈\n• 按 Ctrl+V 可直接粘贴剪贴板图片", - "emptyTitle": "反馈内容为空", - "emptyMessage": "请先输入反馈内容再提交。您可以描述想法、建议或需要修改的地方。" - }, - "summary": { - "title": "AI 工作摘要", - "description": "以下是 AI 刚才为您完成的工作内容,请检视并提供反馈。", - "testDescription": "以下是 AI 回复的消息内容,请检视并提供反馈。" - }, - "command": { - "title": "命令执行", - "description": "您可以执行命令来验证结果或收集更多信息。", - "placeholder": "输入要执行的命令...", - "output": "命令输出", - "outputPlaceholder": "命令输出将在这里显示...", - "run": "▶️ 执行", - "terminate": "⏹️ 停止" - }, - "images": { - "title": "🖼️ 图片附件(可选)", - "select": "选择文件", - "paste": "剪贴板", - "clear": "清除", - "status": "已选择 {count} 张图片", - "statusWithSize": "已选择 {count} 张图片 (总计 {size})", - "dragHint": "🎯 拖拽图片到这里 或 按 Ctrl+V/Cmd+V 粘贴剪贴板图片 (PNG、JPG、JPEG、GIF、BMP、WebP)", - "deleteConfirm": "确定要移除图片 \"{filename}\" 吗?", - "deleteTitle": "确认删除", - "sizeWarning": "图片文件大小不能超过 1MB", - "formatError": "不支持的图片格式", - "paste_images": "📋 从剪贴板粘贴", - "paste_failed": "粘贴失败,剪贴板中没有图片", - "paste_no_image": "剪贴板中没有图片可粘贴", - "paste_image_from_textarea": "已将图片从文本框智能贴到图片区域", - "images_clear": "清除所有图片", + "meta": { + "language": "zh-CN", + "displayName": "简体中文", + "author": "Minidoracat", + "version": "1.0.0", + "lastUpdate": "2025-01-31" + }, + "app": { + "title": "交互式反馈收集", + "projectDirectory": "项目目录", + "language": "语言", + "settings": "设置", + "confirmCancel": "确认取消", + "confirmCancelMessage": "确定要取消反馈吗?所有输入的内容将会丢失。", + "layoutChangeTitle": "界面布局变更", + "layoutChangeMessage": "布局模式已变更,需要重新加载界面才能生效。\n是否现在重新加载?" + }, + "tabs": { + "summary": "📋 AI 摘要", + "feedback": "💬 反馈", + "command": "⚡ 命令", + "language": "⚙️ 设置", + "images": "🖼️ 图片", + "about": "ℹ️ 关于" + }, + "feedback": { + "title": "您的反馈", + "description": "请描述您对 AI 工作结果的想法、建议或需要修改的地方。", + "placeholder": "请在这里输入您的反馈、建议或问题...\n\n💡 小提示:\n• 按 Ctrl+Enter(支持数字键盘)可快速提交反馈\n• 按 Ctrl+V 可直接粘贴剪贴板图片", + "emptyTitle": "反馈内容为空", + "emptyMessage": "请先输入反馈内容再提交。您可以描述想法、建议或需要修改的地方。" + }, + "summary": { + "title": "AI 工作摘要", + "description": "以下是 AI 刚才为您完成的工作内容,请检视并提供反馈。", + "testDescription": "以下是 AI 回复的消息内容,请检视并提供反馈。" + }, + "command": { + "title": "命令执行", + "description": "您可以执行命令来验证结果或收集更多信息。", + "placeholder": "输入要执行的命令...", + "output": "命令输出", + "outputPlaceholder": "命令输出将在这里显示...", + "run": "▶️ 执行", + "terminate": "⏹️ 停止" + }, + "images": { + "title": "🖼️ 图片附件(可选)", + "select": "选择文件", + "paste": "剪贴板", + "clear": "清除", + "status": "已选择 {count} 张图片", + "statusWithSize": "已选择 {count} 张图片 (总计 {size})", + "dragHint": "🎯 拖拽图片到这里 或 按 Ctrl+V/Cmd+V 粘贴剪贴板图片 (PNG、JPG、JPEG、GIF、BMP、WebP)", + "deleteConfirm": "确定要移除图片 \"{filename}\" 吗?", + "deleteTitle": "确认删除", + "sizeWarning": "图片文件大小不能超过 1MB", + "formatError": "不支持的图片格式", + "paste_images": "📋 从剪贴板粘贴", + "paste_failed": "粘贴失败,剪贴板中没有图片", + "paste_no_image": "剪贴板中没有图片可粘贴", + "paste_image_from_textarea": "已将图片从文本框智能贴到图片区域", + "images_clear": "清除所有图片", + "settings": { + "title": "图片设置", + "sizeLimit": "图片大小限制", + "sizeLimitOptions": { + "unlimited": "无限制", + "1mb": "1MB", + "3mb": "3MB", + "5mb": "5MB" + }, + "base64Detail": "Base64 兼容模式", + "base64DetailHelp": "启用后会在文本中包含完整的 Base64 图片数据,提升部分 AI 模型的兼容性", + "base64Warning": "⚠️ 会增加传输量", + "compatibilityHint": "💡 图片无法正确识别?", + "enableBase64Hint": "尝试启用 Base64 兼容模式" + }, + "sizeLimitExceeded": "图片 {filename} 大小为 {size},超过 {limit} 限制!", + "sizeLimitExceededAdvice": "建议使用图片编辑软件压缩后再上传,或调整图片大小限制设置。" + }, "settings": { - "title": "图片设置", - "sizeLimit": "图片大小限制", - "sizeLimitOptions": { - "unlimited": "无限制", - "1mb": "1MB", - "3mb": "3MB", - "5mb": "5MB" - }, - "base64Detail": "Base64 兼容模式", - "base64DetailHelp": "启用后会在文本中包含完整的 Base64 图片数据,提升部分 AI 模型的兼容性", - "base64Warning": "⚠️ 会增加传输量", - "compatibilityHint": "💡 图片无法正确识别?", - "enableBase64Hint": "尝试启用 Base64 兼容模式" + "title": "应用设置", + "language": { + "title": "语言设置", + "selector": "🌐 语言选择" + }, + "layout": { + "title": "界面布局", + "separateMode": "分离模式", + "separateModeDescription": "AI 摘要和反馈分别在不同页签", + "combinedVertical": "合并模式(垂直布局)", + "combinedVerticalDescription": "AI 摘要在上,反馈输入在下,摘要和反馈在同一页面", + "combinedHorizontal": "合并模式(水平布局)", + "combinedHorizontalDescription": "AI 摘要在左,反馈输入在右,增大摘要可视区域" + }, + "window": { + "title": "窗口定位", + "alwaysCenter": "总是在主屏幕中心显示窗口", + "autoFocus": "窗口打开时自动聚焦到输入框" + }, + "reset": { + "title": "重置设置", + "button": "重置设置", + "confirmTitle": "确认重置设置", + "confirmMessage": "确定要重置所有设置吗?这将清除所有已保存的偏好设置并恢复到默认状态。", + "successTitle": "重置成功", + "successMessage": "所有设置已成功重置为默认值。", + "errorTitle": "重置失败", + "errorMessage": "重置设置时发生错误:{error}" + } }, - "sizeLimitExceeded": "图片 {filename} 大小为 {size},超过 {limit} 限制!", - "sizeLimitExceededAdvice": "建议使用图片编辑软件压缩后再上传,或调整图片大小限制设置。" - }, - "settings": { - "title": "应用设置", - "language": { - "title": "语言设置", - "selector": "🌐 语言选择" + "timeout": { + "enable": "自动关闭", + "enableTooltip": "启用后将在指定时间后自动关闭界面", + "duration": { + "label": "超时时间", + "description": "设置自动关闭的时间(30秒 - 2小时)" + }, + "seconds": "秒", + "remaining": "剩余时间", + "expired": "时间已到", + "autoCloseMessage": "界面将在 {seconds} 秒后自动关闭", + "settings": { + "title": "超时设置", + "description": "启用后,界面将在指定时间后自动关闭。倒数计时器会显示在顶部区域。" + } }, - "layout": { - "title": "界面布局", - "separateMode": "分离模式", - "separateModeDescription": "AI 摘要和反馈分别在不同页签", - "combinedVertical": "合并模式(垂直布局)", - "combinedVerticalDescription": "AI 摘要在上,反馈输入在下,摘要和反馈在同一页面", - "combinedHorizontal": "合并模式(水平布局)", - "combinedHorizontalDescription": "AI 摘要在左,反馈输入在右,增大摘要可视区域" + "buttons": { + "submit": "提交反馈", + "cancel": "取消", + "close": "关闭", + "clear": "清除", + "submitFeedback": "✅ 提交反馈", + "selectFiles": "📁 选择文件", + "pasteClipboard": "📋 剪贴板", + "clearAll": "✕ 清除", + "runCommand": "▶️ 执行" }, - "window": { - "title": "窗口定位", - "alwaysCenter": "总是在主屏幕中心显示窗口" + "status": { + "feedbackSubmitted": "反馈已成功提交!", + "feedbackCancelled": "已取消反馈。", + "timeoutMessage": "等待反馈超时", + "errorOccurred": "发生错误", + "loading": "加载中...", + "connecting": "连接中...", + "connected": "已连接", + "disconnected": "连接中断", + "uploading": "上传中...", + "uploadSuccess": "上传成功", + "uploadFailed": "上传失败", + "commandRunning": "命令执行中...", + "commandFinished": "命令执行完成", + "pasteSuccess": "已从剪贴板粘贴图片", + "pasteFailed": "无法从剪贴板获取图片", + "invalidFileType": "不支持的文件类型", + "fileTooLarge": "文件过大(最大 1MB)" }, - "reset": { - "title": "重置设置", - "button": "重置设置", - "confirmTitle": "确认重置设置", - "confirmMessage": "确定要重置所有设置吗?这将清除所有已保存的偏好设置并恢复到默认状态。", - "successTitle": "重置成功", - "successMessage": "所有设置已成功重置为默认值。", - "errorTitle": "重置失败", - "errorMessage": "重置设置时发生错误:{error}" + "errors": { + "title": "错误", + "warning": "警告", + "info": "提示", + "interfaceReloadError": "重新加载界面时发生错误: {error}", + "imageSaveEmpty": "保存的图片文件为空!位置: {path}", + "imageSaveFailed": "图片保存失败!", + "clipboardSaveFailed": "无法保存剪贴板图片!", + "noValidImage": "剪贴板中没有有效的图片!", + "noImageContent": "剪贴板中没有图片内容!", + "emptyFile": "图片 {filename} 是空文件!", + "loadImageFailed": "无法加载图片 {filename}:\n{error}", + "dragInvalidFiles": "请拖拽有效的图片文件!", + "confirmClearAll": "确定要清除所有 {count} 张图片吗?", + "confirmClearTitle": "确认清除", + "fileSizeExceeded": "图片 {filename} 大小为 {size}MB,超过 1MB 限制!\n建议使用图片编辑软件压缩后再上传。", + "dataSizeExceeded": "图片 {filename} 数据大小超过 1MB 限制!" + }, + "aiSummary": "AI 工作摘要", + "languageSelector": "🌐 语言选择", + "languageNames": { + "zhTw": "繁體中文", + "en": "English", + "zhCn": "简体中文" + }, + "test": { + "qtGuiSummary": "🎯 图片预览和窗口调整测试\n\n这是一个测试会话,用于验证以下功能:\n\n✅ 功能测试项目:\n1. 图片上传和预览功能\n2. 图片右上角X删除按钮\n3. 窗口自由调整大小\n4. 分割器的灵活调整\n5. 各区域的动态布局\n6. 智能 Ctrl+V 图片粘贴功能\n\n📋 测试步骤:\n1. 尝试上传一些图片(拖拽、文件选择、剪贴板)\n2. 检查图片预览是否正常显示\n3. 点击图片右上角的X按钮删除图片\n4. 尝试调整窗口大小,检查是否可以自由调整\n5. 拖动分割器调整各区域大小\n6. 在文本框内按 Ctrl+V 测试智能粘贴功能\n7. 提供任何回馈或发现的问题\n\n请测试这些功能并提供回馈!", + "webUiSummary": "测试 Web UI 功能\n\n🎯 **功能测试项目:**\n- Web UI 服务器启动和运行\n- WebSocket 即时通讯\n- 回馈提交功能\n- 图片上传和预览\n- 命令执行功能\n- 智能 Ctrl+V 图片粘贴\n- 多语言界面切换\n\n📋 **测试步骤:**\n1. 测试图片上传(拖拽、选择文件、剪贴板)\n2. 在文本框内按 Ctrl+V 测试智能粘贴\n3. 尝试切换语言(繁中/简中/英文)\n4. 测试命令执行功能\n5. 提交回馈和图片\n\n请测试这些功能并提供回馈!", + "messages": { + "webModuleLoaded": "✅ 使用新的 web 模块", + "webModuleLoadFailed": "⚠️ 无法导入 Web UI 模块: {error}", + "startingWebServer": "🚀 启动 Web 服务器...", + "serverStartError": "服务器启动错误: {error}", + "webServerStartSuccess": "✅ Web 服务器启动成功", + "serverRunningAt": "🌐 服务器运行在: http://{host}:{port}", + "cannotConnectToPort": "❌ 无法连接到服务器端口 {port}", + "webServerStartFailed": "❌ Web 服务器启动失败: {error}", + "serverNotStarted": "❌ 服务器未能正常启动", + "testSessionCreated": "✅ 测试会话创建成功 (ID: {sessionId}...)", + "testUrl": "🔗 测试 URL: {url}", + "testingBrowserLaunch": "🌐 测试浏览器启动功能...", + "wslEnvironmentDetected": "✅ 检测到 WSL 环境,使用 WSL 专用浏览器启动", + "nonWslEnvironment": "ℹ️ 非 WSL 环境,使用标准浏览器启动", + "browserLaunchSuccess": "✅ 浏览器启动成功: {url}", + "browserLaunchFailed": "⚠️ 浏览器启动失败: {error}", + "browserLaunchNote": "💡 这可能是正常的,请手动在浏览器中开启上述 URL", + "sessionCreationFailed": "❌ 会话创建失败: {error}", + "allTestsPassed": "🎉 所有测试通过!Web UI 准备就绪", + "notes": "📝 注意事项:", + "webUiAutoEnabled": " - Web UI 会在 SSH remote 环境下自动启用", + "localEnvironmentGui": " - 本地环境会继续使用 Qt GUI", + "realtimeCommandSupport": " - 支持即时命令执行和 WebSocket 通讯", + "modernDarkTheme": " - 提供现代化的深色主题界面", + "smartCtrlVPaste": " - 支持智能 Ctrl+V 图片贴上功能", + "testingEnvironmentDetection": "🔍 测试环境检测功能", + "wslDetection": "WSL 环境检测: {result}", + "remoteDetection": "远端环境检测: {result}", + "guiAvailability": "GUI 可用性: {result}", + "yes": "是", + "no": "否", + "wslEnvironmentWebUi": "✅ 检测到 WSL 环境,将使用 Web UI 并支持 Windows 浏览器启动", + "remoteEnvironmentWebUi": "✅ 将使用 Web UI (适合远端开发环境)", + "localEnvironmentQtGui": "✅ 将使用 Qt GUI (本地环境)", + "environmentDetectionFailed": "❌ 环境检测失败: {error}", + "testingMcpIntegration": "🔧 测试 MCP 整合功能", + "mcpToolFunctionAvailable": "✅ MCP 工具函数可用", + "timeoutParameterSupported": "✅ 支持 timeout 参数", + "environmentBasedWebUiSupported": "✅ 支持基于环境变数的 Web UI 选择", + "readyForAiAssistantCalls": "✅ 准备接受来自 AI 助手的调用", + "mcpIntegrationTestFailed": "❌ MCP 整合测试失败: {error}", + "testingParameterFunctionality": "🆕 测试参数功能", + "timeoutParameterExists": "✅ timeout 参数存在,预设值: {default}", + "timeoutParameterMissing": "❌ timeout 参数不存在", + "forceWebDetected": "✅ 检测到 FORCE_WEB 环境变数: {value}", + "forceWebNotSet": "ℹ️ FORCE_WEB 环境变数未设定(将使用预设逻辑)", + "parameterFunctionalityNormal": "✅ 参数功能正常", + "parameterTestFailed": "❌ 参数测试失败: {error}", + "testingEnvironmentWebUiMode": "🌐 测试环境变数控制 Web UI 模式", + "currentEnvironment": "当前环境 - WSL: {wsl}, 远端: {remote}, GUI 可用: {gui}", + "forceWebVariable": "FORCE_WEB 环境变数: {value}", + "notSet": "未设定", + "forceWebEnabled": "✅ FORCE_WEB 已启用,将强制使用 Web UI", + "wslEnvironmentWebUiBrowser": "✅ WSL 环境,将使用 Web UI 并支持 Windows 浏览器启动", + "localGuiEnvironmentQtGui": "ℹ️ 本地 GUI 环境,将使用 Qt GUI", + "forceWebTestHint": "💡 可设定 FORCE_WEB=true 强制使用 Web UI 进行测试", + "autoWebUiRemoteOrNoGui": "ℹ️ 将自动使用 Web UI(远端环境或 GUI 不可用)", + "environmentVariableTestFailed": "❌ 环境变数测试失败: {error}", + "webUiInteractiveTestMode": "🌐 Web UI 互动测试模式", + "serverAddress": "服务器地址: {url}", + "operationGuide": "📖 操作指南:", + "openServerInBrowser": " 1. 在浏览器中开启上面的服务器地址", + "tryFollowingFeatures": " 2. 尝试以下功能:", + "clickShowCommandBlock": " - 点击 '显示命令区块' 按钮", + "inputCommandAndExecute": " - 输入命令如 'echo Hello World' 并执行", + "inputTextInFeedbackArea": " - 在回馈区域输入文字", + "useCtrlEnterSubmit": " - 使用 Ctrl+Enter 提交回馈", + "testWebSocketRealtime": " 3. 测试 WebSocket 即时通讯功能", + "testPagePersistence": " 4. 测试页面持久性(提交反馈后页面不关闭)", + "controlOptions": "⌨️ 控制选项:", + "pressEnterContinue": " - 按 Enter 继续运行", + "inputQuitToStop": " - 输入 'q' 或 'quit' 停止服务器", + "stoppingServer": "🛑 停止服务器...", + "serverContinuesRunning": "🔄 服务器持续运行在: {url}", + "browserShouldStillAccess": " 浏览器应该仍可正常访问", + "unknownCommand": "❓ 未知命令。按 Enter 继续运行,或输入 'q' 退出", + "interruptSignalReceived": "🛑 收到中断信号,停止服务器...", + "webUiTestComplete": "✅ Web UI 测试完成", + "allTestsComplete": "🎊 所有测试完成!准备使用 MCP Feedback Enhanced", + "usageInstructions": "📖 使用方法:", + "configureMcpServer": " 1. 在 Cursor/Cline 中配置此 MCP 服务器", + "aiAssistantAutoCall": " 2. AI 助手会自动调用 interactive_feedback 工具", + "autoSelectGuiOrWebUi": " 3. 根据环境自动选择 GUI 或 Web UI", + "provideFeedbackContinue": " 4. 提供回馈后继续工作流程", + "webUiNewFeatures": "✨ Web UI 新功能:", + "sshRemoteSupport": " - 支持 SSH remote 开发环境", + "modernDarkThemeInterface": " - 现代化深色主题界面", + "webSocketRealtime": " - WebSocket 即时通讯", + "autoBrowserLaunch": " - 自动浏览器启动", + "commandExecutionRealtime": " - 命令执行和即时输出", + "testCompleteSystemReady": "✅ 测试完成 - 系统已准备就绪!", + "canTestInBrowserNow": "💡 您可以现在就在浏览器中测试: {url}", + "serverWillContinueRunning": " (服务器会继续运行一小段时间)", + "someTestsFailed": "❌ 部分测试失败,请检查错误信息", + "testingWebUi": "🧪 测试 MCP Feedback Enhanced Web UI", + "syncingLanguageSettings": "🔄 同步语言设置...", + "currentLanguage": "📝 当前使用语言: {language}", + "webUiModuleImportSuccess": "✅ Web UI 模块导入成功", + "webUiModuleImportFailed": "❌ Web UI 模块导入失败: {error}", + "webUiManagerCreateSuccess": "✅ WebUIManager 创建成功", + "webUiManagerCreateFailed": "❌ WebUIManager 创建失败: {error}", + "noLanguageInSettings": "⚠️ ui_settings.json 中没有语言设置", + "settingsFileNotExists": "⚠️ ui_settings.json 文件不存在,使用默认语言", + "loadLanguageSettingsFailed": "⚠️ 加载语言设置失败: {error}", + "loadingLanguageFromSettings": "🔄 从 ui_settings.json 加载语言设置: {language}", + "syncingLanguage": "🔄 同步语言设置: {from} -> {to}", + "guiLanguageSynced": "✅ GUI 语言已同步到: {language}", + "languageAlreadySynced": "✅ 语言设置已同步: {language}", + "webUiTest": "MCP Feedback Enhanced - Web UI 测试", + "languageSetFailed": "⚠️ 语言设置失败,使用默认语言: {language}", + "foundAvailablePort": "🔍 找到可用端口: {port}", + "findPortFailed": "❌ 寻找可用端口失败: {error}" + } + }, + "about": { + "appInfo": "应用程序信息", + "version": "版本", + "description": "一个强大的 MCP 服务器,为 AI 辅助开发工具提供人在回路的交互反馈功能。支持 Qt GUI 和 Web UI 双界面,并具备图片上传、命令执行、多语言等丰富功能。", + "projectLinks": "项目链接", + "githubProject": "GitHub 项目", + "visitGithub": "访问 GitHub", + "contact": "联系与支持", + "discordSupport": "Discord 支持", + "joinDiscord": "加入 Discord", + "contactDescription": "如需技术支持、问题反馈或功能建议,欢迎通过 Discord 社群或 GitHub Issues 与我们联系。", + "thanks": "致谢与贡献", + "thanksText": "感谢原作者 Fábio Ferreira (@fabiomlferreira) 创建了原始的 interactive-feedback-mcp 项目。\n\n本增强版本由 Minidoracat 开发和维护,大幅扩展了项目功能,新增了 GUI 界面、图片支持、多语言能力以及许多其他改进功能。\n\n同时感谢 sanshao85 的 mcp-feedback-collector 项目提供的 UI 设计灵感。\n\n开源协作让技术变得更美好!" } - }, - "timeout": { - "enable": "自动关闭", - "enableTooltip": "启用后将在指定时间后自动关闭界面", - "duration": { - "label": "超时时间", - "description": "设置自动关闭的时间(30秒 - 2小时)" - }, - "seconds": "秒", - "remaining": "剩余时间", - "expired": "时间已到", - "autoCloseMessage": "界面将在 {seconds} 秒后自动关闭", - "settings": { - "title": "超时设置", - "description": "启用后,界面将在指定时间后自动关闭。倒数计时器会显示在顶部区域。" - } - }, - "buttons": { - "submit": "提交反馈", - "cancel": "取消", - "close": "关闭", - "clear": "清除", - "submitFeedback": "✅ 提交反馈", - "selectFiles": "📁 选择文件", - "pasteClipboard": "📋 剪贴板", - "clearAll": "✕ 清除", - "runCommand": "▶️ 执行" - }, - "status": { - "feedbackSubmitted": "反馈已成功提交!", - "feedbackCancelled": "已取消反馈。", - "timeoutMessage": "等待反馈超时", - "errorOccurred": "发生错误", - "loading": "加载中...", - "connecting": "连接中...", - "connected": "已连接", - "disconnected": "连接中断", - "uploading": "上传中...", - "uploadSuccess": "上传成功", - "uploadFailed": "上传失败", - "commandRunning": "命令执行中...", - "commandFinished": "命令执行完成", - "pasteSuccess": "已从剪贴板粘贴图片", - "pasteFailed": "无法从剪贴板获取图片", - "invalidFileType": "不支持的文件类型", - "fileTooLarge": "文件过大(最大 1MB)" - }, - "errors": { - "title": "错误", - "warning": "警告", - "info": "提示", - "interfaceReloadError": "重新加载界面时发生错误: {error}", - "imageSaveEmpty": "保存的图片文件为空!位置: {path}", - "imageSaveFailed": "图片保存失败!", - "clipboardSaveFailed": "无法保存剪贴板图片!", - "noValidImage": "剪贴板中没有有效的图片!", - "noImageContent": "剪贴板中没有图片内容!", - "emptyFile": "图片 {filename} 是空文件!", - "loadImageFailed": "无法加载图片 {filename}:\n{error}", - "dragInvalidFiles": "请拖拽有效的图片文件!", - "confirmClearAll": "确定要清除所有 {count} 张图片吗?", - "confirmClearTitle": "确认清除", - "fileSizeExceeded": "图片 {filename} 大小为 {size}MB,超过 1MB 限制!\n建议使用图片编辑软件压缩后再上传。", - "dataSizeExceeded": "图片 {filename} 数据大小超过 1MB 限制!" - }, - "aiSummary": "AI 工作摘要", - "languageSelector": "🌐 语言选择", - "languageNames": { - "zhTw": "繁體中文", - "en": "English", - "zhCn": "简体中文" - }, - "test": { - "qtGuiSummary": "🎯 图片预览和窗口调整测试\n\n这是一个测试会话,用于验证以下功能:\n\n✅ 功能测试项目:\n1. 图片上传和预览功能\n2. 图片右上角X删除按钮\n3. 窗口自由调整大小\n4. 分割器的灵活调整\n5. 各区域的动态布局\n6. 智能 Ctrl+V 图片粘贴功能\n\n📋 测试步骤:\n1. 尝试上传一些图片(拖拽、文件选择、剪贴板)\n2. 检查图片预览是否正常显示\n3. 点击图片右上角的X按钮删除图片\n4. 尝试调整窗口大小,检查是否可以自由调整\n5. 拖动分割器调整各区域大小\n6. 在文本框内按 Ctrl+V 测试智能粘贴功能\n7. 提供任何回馈或发现的问题\n\n请测试这些功能并提供回馈!", - "webUiSummary": "测试 Web UI 功能\n\n🎯 **功能测试项目:**\n- Web UI 服务器启动和运行\n- WebSocket 即时通讯\n- 回馈提交功能\n- 图片上传和预览\n- 命令执行功能\n- 智能 Ctrl+V 图片粘贴\n- 多语言界面切换\n\n📋 **测试步骤:**\n1. 测试图片上传(拖拽、选择文件、剪贴板)\n2. 在文本框内按 Ctrl+V 测试智能粘贴\n3. 尝试切换语言(繁中/简中/英文)\n4. 测试命令执行功能\n5. 提交回馈和图片\n\n请测试这些功能并提供回馈!", - "messages": { - "webModuleLoaded": "✅ 使用新的 web 模块", - "webModuleLoadFailed": "⚠️ 无法导入 Web UI 模块: {error}", - "startingWebServer": "🚀 启动 Web 服务器...", - "serverStartError": "服务器启动错误: {error}", - "webServerStartSuccess": "✅ Web 服务器启动成功", - "serverRunningAt": "🌐 服务器运行在: http://{host}:{port}", - "cannotConnectToPort": "❌ 无法连接到服务器端口 {port}", - "webServerStartFailed": "❌ Web 服务器启动失败: {error}", - "serverNotStarted": "❌ 服务器未能正常启动", - "testSessionCreated": "✅ 测试会话创建成功 (ID: {sessionId}...)", - "testUrl": "🔗 测试 URL: {url}", - "testingBrowserLaunch": "🌐 测试浏览器启动功能...", - "wslEnvironmentDetected": "✅ 检测到 WSL 环境,使用 WSL 专用浏览器启动", - "nonWslEnvironment": "ℹ️ 非 WSL 环境,使用标准浏览器启动", - "browserLaunchSuccess": "✅ 浏览器启动成功: {url}", - "browserLaunchFailed": "⚠️ 浏览器启动失败: {error}", - "browserLaunchNote": "💡 这可能是正常的,请手动在浏览器中开启上述 URL", - "sessionCreationFailed": "❌ 会话创建失败: {error}", - "allTestsPassed": "🎉 所有测试通过!Web UI 准备就绪", - "notes": "📝 注意事项:", - "webUiAutoEnabled": " - Web UI 会在 SSH remote 环境下自动启用", - "localEnvironmentGui": " - 本地环境会继续使用 Qt GUI", - "realtimeCommandSupport": " - 支持即时命令执行和 WebSocket 通讯", - "modernDarkTheme": " - 提供现代化的深色主题界面", - "smartCtrlVPaste": " - 支持智能 Ctrl+V 图片贴上功能", - "testingEnvironmentDetection": "🔍 测试环境检测功能", - "wslDetection": "WSL 环境检测: {result}", - "remoteDetection": "远端环境检测: {result}", - "guiAvailability": "GUI 可用性: {result}", - "yes": "是", - "no": "否", - "wslEnvironmentWebUi": "✅ 检测到 WSL 环境,将使用 Web UI 并支持 Windows 浏览器启动", - "remoteEnvironmentWebUi": "✅ 将使用 Web UI (适合远端开发环境)", - "localEnvironmentQtGui": "✅ 将使用 Qt GUI (本地环境)", - "environmentDetectionFailed": "❌ 环境检测失败: {error}", - "testingMcpIntegration": "🔧 测试 MCP 整合功能", - "mcpToolFunctionAvailable": "✅ MCP 工具函数可用", - "timeoutParameterSupported": "✅ 支持 timeout 参数", - "environmentBasedWebUiSupported": "✅ 支持基于环境变数的 Web UI 选择", - "readyForAiAssistantCalls": "✅ 准备接受来自 AI 助手的调用", - "mcpIntegrationTestFailed": "❌ MCP 整合测试失败: {error}", - "testingParameterFunctionality": "🆕 测试参数功能", - "timeoutParameterExists": "✅ timeout 参数存在,预设值: {default}", - "timeoutParameterMissing": "❌ timeout 参数不存在", - "forceWebDetected": "✅ 检测到 FORCE_WEB 环境变数: {value}", - "forceWebNotSet": "ℹ️ FORCE_WEB 环境变数未设定(将使用预设逻辑)", - "parameterFunctionalityNormal": "✅ 参数功能正常", - "parameterTestFailed": "❌ 参数测试失败: {error}", - "testingEnvironmentWebUiMode": "🌐 测试环境变数控制 Web UI 模式", - "currentEnvironment": "当前环境 - WSL: {wsl}, 远端: {remote}, GUI 可用: {gui}", - "forceWebVariable": "FORCE_WEB 环境变数: {value}", - "notSet": "未设定", - "forceWebEnabled": "✅ FORCE_WEB 已启用,将强制使用 Web UI", - "wslEnvironmentWebUiBrowser": "✅ WSL 环境,将使用 Web UI 并支持 Windows 浏览器启动", - "localGuiEnvironmentQtGui": "ℹ️ 本地 GUI 环境,将使用 Qt GUI", - "forceWebTestHint": "💡 可设定 FORCE_WEB=true 强制使用 Web UI 进行测试", - "autoWebUiRemoteOrNoGui": "ℹ️ 将自动使用 Web UI(远端环境或 GUI 不可用)", - "environmentVariableTestFailed": "❌ 环境变数测试失败: {error}", - "webUiInteractiveTestMode": "🌐 Web UI 互动测试模式", - "serverAddress": "服务器地址: {url}", - "operationGuide": "📖 操作指南:", - "openServerInBrowser": " 1. 在浏览器中开启上面的服务器地址", - "tryFollowingFeatures": " 2. 尝试以下功能:", - "clickShowCommandBlock": " - 点击 '显示命令区块' 按钮", - "inputCommandAndExecute": " - 输入命令如 'echo Hello World' 并执行", - "inputTextInFeedbackArea": " - 在回馈区域输入文字", - "useCtrlEnterSubmit": " - 使用 Ctrl+Enter 提交回馈", - "testWebSocketRealtime": " 3. 测试 WebSocket 即时通讯功能", - "testPagePersistence": " 4. 测试页面持久性(提交反馈后页面不关闭)", - "controlOptions": "⌨️ 控制选项:", - "pressEnterContinue": " - 按 Enter 继续运行", - "inputQuitToStop": " - 输入 'q' 或 'quit' 停止服务器", - "stoppingServer": "🛑 停止服务器...", - "serverContinuesRunning": "🔄 服务器持续运行在: {url}", - "browserShouldStillAccess": " 浏览器应该仍可正常访问", - "unknownCommand": "❓ 未知命令。按 Enter 继续运行,或输入 'q' 退出", - "interruptSignalReceived": "🛑 收到中断信号,停止服务器...", - "webUiTestComplete": "✅ Web UI 测试完成", - "allTestsComplete": "🎊 所有测试完成!准备使用 MCP Feedback Enhanced", - "usageInstructions": "📖 使用方法:", - "configureMcpServer": " 1. 在 Cursor/Cline 中配置此 MCP 服务器", - "aiAssistantAutoCall": " 2. AI 助手会自动调用 interactive_feedback 工具", - "autoSelectGuiOrWebUi": " 3. 根据环境自动选择 GUI 或 Web UI", - "provideFeedbackContinue": " 4. 提供回馈后继续工作流程", - "webUiNewFeatures": "✨ Web UI 新功能:", - "sshRemoteSupport": " - 支持 SSH remote 开发环境", - "modernDarkThemeInterface": " - 现代化深色主题界面", - "webSocketRealtime": " - WebSocket 即时通讯", - "autoBrowserLaunch": " - 自动浏览器启动", - "commandExecutionRealtime": " - 命令执行和即时输出", - "testCompleteSystemReady": "✅ 测试完成 - 系统已准备就绪!", - "canTestInBrowserNow": "💡 您可以现在就在浏览器中测试: {url}", - "serverWillContinueRunning": " (服务器会继续运行一小段时间)", - "someTestsFailed": "❌ 部分测试失败,请检查错误信息", - "testingWebUi": "🧪 测试 MCP Feedback Enhanced Web UI", - "syncingLanguageSettings": "🔄 同步语言设置...", - "currentLanguage": "📝 当前使用语言: {language}", - "webUiModuleImportSuccess": "✅ Web UI 模块导入成功", - "webUiModuleImportFailed": "❌ Web UI 模块导入失败: {error}", - "webUiManagerCreateSuccess": "✅ WebUIManager 创建成功", - "webUiManagerCreateFailed": "❌ WebUIManager 创建失败: {error}", - "noLanguageInSettings": "⚠️ ui_settings.json 中没有语言设置", - "settingsFileNotExists": "⚠️ ui_settings.json 文件不存在,使用默认语言", - "loadLanguageSettingsFailed": "⚠️ 加载语言设置失败: {error}", - "loadingLanguageFromSettings": "🔄 从 ui_settings.json 加载语言设置: {language}", - "syncingLanguage": "🔄 同步语言设置: {from} -> {to}", - "guiLanguageSynced": "✅ GUI 语言已同步到: {language}", - "languageAlreadySynced": "✅ 语言设置已同步: {language}", - "webUiTest": "MCP Feedback Enhanced - Web UI 测试", - "languageSetFailed": "⚠️ 语言设置失败,使用默认语言: {language}", - "foundAvailablePort": "🔍 找到可用端口: {port}", - "findPortFailed": "❌ 寻找可用端口失败: {error}" - } - }, - "about": { - "appInfo": "应用程序信息", - "version": "版本", - "description": "一个强大的 MCP 服务器,为 AI 辅助开发工具提供人在回路的交互反馈功能。支持 Qt GUI 和 Web UI 双界面,并具备图片上传、命令执行、多语言等丰富功能。", - "projectLinks": "项目链接", - "githubProject": "GitHub 项目", - "visitGithub": "访问 GitHub", - "contact": "联系与支持", - "discordSupport": "Discord 支持", - "joinDiscord": "加入 Discord", - "contactDescription": "如需技术支持、问题反馈或功能建议,欢迎通过 Discord 社群或 GitHub Issues 与我们联系。", - "thanks": "致谢与贡献", - "thanksText": "感谢原作者 Fábio Ferreira (@fabiomlferreira) 创建了原始的 interactive-feedback-mcp 项目。\n\n本增强版本由 Minidoracat 开发和维护,大幅扩展了项目功能,新增了 GUI 界面、图片支持、多语言能力以及许多其他改进功能。\n\n同时感谢 sanshao85 的 mcp-feedback-collector 项目提供的 UI 设计灵感。\n\n开源协作让技术变得更美好!" - } -} \ No newline at end of file +} diff --git a/src/mcp_feedback_enhanced/gui/locales/zh-TW/translations.json b/src/mcp_feedback_enhanced/gui/locales/zh-TW/translations.json index d134d75..3a10543 100644 --- a/src/mcp_feedback_enhanced/gui/locales/zh-TW/translations.json +++ b/src/mcp_feedback_enhanced/gui/locales/zh-TW/translations.json @@ -1,316 +1,317 @@ { - "meta": { - "language": "zh-TW", - "displayName": "繁體中文", - "author": "Minidoracat", - "version": "1.0.0", - "lastUpdate": "2025-01-31" - }, - "app": { - "title": "互動式回饋收集", - "projectDirectory": "專案目錄", - "language": "語言", - "settings": "設定", - "confirmCancel": "確認取消", - "confirmCancelMessage": "確定要取消回饋嗎?所有輸入的內容將會遺失。", - "layoutChangeTitle": "界面佈局變更", - "layoutChangeMessage": "佈局模式已變更,需要重新載入界面才能生效。\n是否現在重新載入?" - }, - "tabs": { - "summary": "📋 AI 摘要", - "feedback": "💬 回饋", - "command": "⚡ 命令", - "language": "⚙️ 設置", - "images": "🖼️ 圖片", - "about": "ℹ️ 關於" - }, - "about": { - "appInfo": "應用程式資訊", - "version": "版本", - "description": "一個強大的 MCP 伺服器,為 AI 輔助開發工具提供人在回路的互動回饋功能。支援 Qt GUI 和 Web UI 雙介面,並具備圖片上傳、命令執行、多語言等豐富功能。", - "projectLinks": "專案連結", - "githubProject": "GitHub 專案", - "visitGithub": "訪問 GitHub", - "contact": "聯繫與支援", - "discordSupport": "Discord 支援", - "joinDiscord": "加入 Discord", - "contactDescription": "如需技術支援、問題回報或功能建議,歡迎透過 Discord 社群或 GitHub Issues 與我們聯繫。", - "thanks": "致謝與貢獻", - "thanksText": "感謝原作者 Fábio Ferreira (@fabiomlferreira) 創建了原始的 interactive-feedback-mcp 專案。\n\n本增強版本由 Minidoracat 開發和維護,大幅擴展了專案功能,新增了 GUI 介面、圖片支援、多語言能力以及許多其他改進功能。\n\n同時感謝 sanshao85 的 mcp-feedback-collector 專案提供的 UI 設計靈感。\n\n開源協作讓技術變得更美好!" - }, - "feedback": { - "title": "您的回饋", - "description": "請描述您對 AI 工作結果的想法、建議或需要修改的地方。", - "placeholder": "請在這裡輸入您的回饋、建議或問題...\n\n💡 小提示:\n• 按 Ctrl+Enter(支援數字鍵盤)可快速提交回饋\n• 按 Ctrl+V 可直接貼上剪貼簿圖片", - "emptyTitle": "回饋內容為空", - "emptyMessage": "請先輸入回饋內容再提交。您可以描述想法、建議或需要修改的地方。", - "input": "您的回饋" - }, - "summary": { - "title": "AI 工作摘要", - "description": "以下是 AI 剛才為您完成的工作內容,請檢視並提供回饋。", - "testDescription": "以下是 AI 回復的訊息內容,請檢視並提供回饋。" - }, - "command": { - "title": "命令執行", - "description": "您可以執行命令來驗證結果或收集更多資訊。", - "input": "命令", - "placeholder": "輸入要執行的命令...", - "output": "命令輸出", - "outputPlaceholder": "命令輸出將顯示在這裡...", - "run": "▶️ 執行", - "terminate": "⏹️ 終止" - }, - "images": { - "title": "🖼️ 圖片附件(可選)", - "select": "選擇文件", - "paste": "剪貼板", - "clear": "清除", - "status": "已選擇 {count} 張圖片", - "statusWithSize": "已選擇 {count} 張圖片 (總計 {size})", - "dragHint": "🎯 拖拽圖片到這裡 或 按 Ctrl+V/Cmd+V 貼上剪貼簿圖片 (PNG、JPG、JPEG、GIF、BMP、WebP)", - "deleteConfirm": "確定要移除圖片 \"{filename}\" 嗎?", - "deleteTitle": "確認刪除", - "sizeWarning": "圖片文件大小不能超過 1MB", - "formatError": "不支援的圖片格式", - "paste_images": "📋 從剪貼簿貼上", - "paste_failed": "貼上失敗,剪貼簿中沒有圖片", - "paste_no_image": "剪貼簿中沒有圖片可貼上", - "paste_image_from_textarea": "已將圖片從文字框智能貼到圖片區域", - "images_clear": "清除所有圖片", + "meta": { + "language": "zh-TW", + "displayName": "繁體中文", + "author": "Minidoracat", + "version": "1.0.0", + "lastUpdate": "2025-01-31" + }, + "app": { + "title": "互動式回饋收集", + "projectDirectory": "專案目錄", + "language": "語言", + "settings": "設定", + "confirmCancel": "確認取消", + "confirmCancelMessage": "確定要取消回饋嗎?所有輸入的內容將會遺失。", + "layoutChangeTitle": "界面佈局變更", + "layoutChangeMessage": "佈局模式已變更,需要重新載入界面才能生效。\n是否現在重新載入?" + }, + "tabs": { + "summary": "📋 AI 摘要", + "feedback": "💬 回饋", + "command": "⚡ 命令", + "language": "⚙️ 設置", + "images": "🖼️ 圖片", + "about": "ℹ️ 關於" + }, + "about": { + "appInfo": "應用程式資訊", + "version": "版本", + "description": "一個強大的 MCP 伺服器,為 AI 輔助開發工具提供人在回路的互動回饋功能。支援 Qt GUI 和 Web UI 雙介面,並具備圖片上傳、命令執行、多語言等豐富功能。", + "projectLinks": "專案連結", + "githubProject": "GitHub 專案", + "visitGithub": "訪問 GitHub", + "contact": "聯繫與支援", + "discordSupport": "Discord 支援", + "joinDiscord": "加入 Discord", + "contactDescription": "如需技術支援、問題回報或功能建議,歡迎透過 Discord 社群或 GitHub Issues 與我們聯繫。", + "thanks": "致謝與貢獻", + "thanksText": "感謝原作者 Fábio Ferreira (@fabiomlferreira) 創建了原始的 interactive-feedback-mcp 專案。\n\n本增強版本由 Minidoracat 開發和維護,大幅擴展了專案功能,新增了 GUI 介面、圖片支援、多語言能力以及許多其他改進功能。\n\n同時感謝 sanshao85 的 mcp-feedback-collector 專案提供的 UI 設計靈感。\n\n開源協作讓技術變得更美好!" + }, + "feedback": { + "title": "您的回饋", + "description": "請描述您對 AI 工作結果的想法、建議或需要修改的地方。", + "placeholder": "請在這裡輸入您的回饋、建議或問題...\n\n💡 小提示:\n• 按 Ctrl+Enter(支援數字鍵盤)可快速提交回饋\n• 按 Ctrl+V 可直接貼上剪貼簿圖片", + "emptyTitle": "回饋內容為空", + "emptyMessage": "請先輸入回饋內容再提交。您可以描述想法、建議或需要修改的地方。", + "input": "您的回饋" + }, + "summary": { + "title": "AI 工作摘要", + "description": "以下是 AI 剛才為您完成的工作內容,請檢視並提供回饋。", + "testDescription": "以下是 AI 回復的訊息內容,請檢視並提供回饋。" + }, + "command": { + "title": "命令執行", + "description": "您可以執行命令來驗證結果或收集更多資訊。", + "input": "命令", + "placeholder": "輸入要執行的命令...", + "output": "命令輸出", + "outputPlaceholder": "命令輸出將顯示在這裡...", + "run": "▶️ 執行", + "terminate": "⏹️ 終止" + }, + "images": { + "title": "🖼️ 圖片附件(可選)", + "select": "選擇文件", + "paste": "剪貼板", + "clear": "清除", + "status": "已選擇 {count} 張圖片", + "statusWithSize": "已選擇 {count} 張圖片 (總計 {size})", + "dragHint": "🎯 拖拽圖片到這裡 或 按 Ctrl+V/Cmd+V 貼上剪貼簿圖片 (PNG、JPG、JPEG、GIF、BMP、WebP)", + "deleteConfirm": "確定要移除圖片 \"{filename}\" 嗎?", + "deleteTitle": "確認刪除", + "sizeWarning": "圖片文件大小不能超過 1MB", + "formatError": "不支援的圖片格式", + "paste_images": "📋 從剪貼簿貼上", + "paste_failed": "貼上失敗,剪貼簿中沒有圖片", + "paste_no_image": "剪貼簿中沒有圖片可貼上", + "paste_image_from_textarea": "已將圖片從文字框智能貼到圖片區域", + "images_clear": "清除所有圖片", + "settings": { + "title": "圖片設定", + "sizeLimit": "圖片大小限制", + "sizeLimitOptions": { + "unlimited": "無限制", + "1mb": "1MB", + "3mb": "3MB", + "5mb": "5MB" + }, + "base64Detail": "Base64 相容模式", + "base64DetailHelp": "啟用後會在文字中包含完整的 Base64 圖片資料,提升部分 AI 模型的相容性", + "base64Warning": "⚠️ 會增加傳輸量", + "compatibilityHint": "💡 圖片無法正確識別?", + "enableBase64Hint": "嘗試啟用 Base64 相容模式" + }, + "sizeLimitExceeded": "圖片 {filename} 大小為 {size},超過 {limit} 限制!", + "sizeLimitExceededAdvice": "建議使用圖片編輯軟體壓縮後再上傳,或調整圖片大小限制設定。" + }, + "timeout": { + "enable": "自動關閉", + "enableTooltip": "啟用後將在指定時間後自動關閉介面", + "duration": { + "label": "超時時間", + "description": "設置自動關閉的時間(30秒 - 2小時)" + }, + "seconds": "秒", + "remaining": "剩餘時間", + "expired": "時間已到", + "autoCloseMessage": "介面將在 {seconds} 秒後自動關閉", + "settings": { + "title": "超時設置", + "description": "啟用後,介面將在指定時間後自動關閉。倒數計時器會顯示在頂部區域。" + } + }, "settings": { - "title": "圖片設定", - "sizeLimit": "圖片大小限制", - "sizeLimitOptions": { - "unlimited": "無限制", - "1mb": "1MB", - "3mb": "3MB", - "5mb": "5MB" - }, - "base64Detail": "Base64 相容模式", - "base64DetailHelp": "啟用後會在文字中包含完整的 Base64 圖片資料,提升部分 AI 模型的相容性", - "base64Warning": "⚠️ 會增加傳輸量", - "compatibilityHint": "💡 圖片無法正確識別?", - "enableBase64Hint": "嘗試啟用 Base64 相容模式" + "title": "應用設置", + "language": { + "title": "語言設置", + "selector": "🌐 語言選擇" + }, + "layout": { + "title": "界面佈局", + "separateMode": "分離模式", + "separateModeDescription": "AI 摘要和回饋分別在不同頁籤", + "combinedVertical": "合併模式(垂直布局)", + "combinedVerticalDescription": "AI 摘要在上,回饋輸入在下,摘要和回饋在同一頁面", + "combinedHorizontal": "合併模式(水平布局)", + "combinedHorizontalDescription": "AI 摘要在左,回饋輸入在右,增大摘要可視區域" + }, + "window": { + "title": "視窗定位", + "alwaysCenter": "總是在主螢幕中心顯示視窗", + "autoFocus": "窗口打開時自動聚焦到輸入框" + }, + "reset": { + "title": "重置設定", + "button": "重置設定", + "confirmTitle": "確認重置設定", + "confirmMessage": "確定要重置所有設定嗎?這將清除所有已保存的偏好設定並恢復到預設狀態。", + "successTitle": "重置成功", + "successMessage": "所有設定已成功重置為預設值。", + "errorTitle": "重置失敗", + "errorMessage": "重置設定時發生錯誤:{error}" + } }, - "sizeLimitExceeded": "圖片 {filename} 大小為 {size},超過 {limit} 限制!", - "sizeLimitExceededAdvice": "建議使用圖片編輯軟體壓縮後再上傳,或調整圖片大小限制設定。" - }, - "timeout": { - "enable": "自動關閉", - "enableTooltip": "啟用後將在指定時間後自動關閉介面", - "duration": { - "label": "超時時間", - "description": "設置自動關閉的時間(30秒 - 2小時)" + "buttons": { + "submit": "提交回饋", + "cancel": "取消", + "close": "關閉", + "clear": "清除", + "submitFeedback": "✅ 提交回饋", + "selectFiles": "📁 選擇文件", + "pasteClipboard": "📋 剪貼板", + "clearAll": "✕ 清除", + "runCommand": "▶️ 執行" }, - "seconds": "秒", - "remaining": "剩餘時間", - "expired": "時間已到", - "autoCloseMessage": "介面將在 {seconds} 秒後自動關閉", - "settings": { - "title": "超時設置", - "description": "啟用後,介面將在指定時間後自動關閉。倒數計時器會顯示在頂部區域。" + "status": { + "feedbackSubmitted": "回饋已成功提交!", + "feedbackCancelled": "已取消回饋。", + "timeoutMessage": "等待回饋超時", + "errorOccurred": "發生錯誤", + "loading": "載入中...", + "connecting": "連接中...", + "connected": "已連接", + "disconnected": "連接中斷", + "uploading": "上傳中...", + "uploadSuccess": "上傳成功", + "uploadFailed": "上傳失敗", + "commandRunning": "命令執行中...", + "commandFinished": "命令執行完成", + "pasteSuccess": "已從剪貼板貼上圖片", + "pasteFailed": "無法從剪貼板獲取圖片", + "invalidFileType": "不支援的文件類型", + "fileTooLarge": "文件過大(最大 1MB)" + }, + "errors": { + "title": "錯誤", + "warning": "警告", + "info": "提示", + "interfaceReloadError": "重新載入界面時發生錯誤: {error}", + "imageSaveEmpty": "保存的圖片文件為空!位置: {path}", + "imageSaveFailed": "圖片保存失敗!", + "clipboardSaveFailed": "無法保存剪貼板圖片!", + "noValidImage": "剪貼板中沒有有效的圖片!", + "noImageContent": "剪貼板中沒有圖片內容!", + "emptyFile": "圖片 {filename} 是空文件!", + "loadImageFailed": "無法載入圖片 {filename}:\n{error}", + "dragInvalidFiles": "請拖拽有效的圖片文件!", + "confirmClearAll": "確定要清除所有 {count} 張圖片嗎?", + "confirmClearTitle": "確認清除", + "fileSizeExceeded": "圖片 {filename} 大小為 {size}MB,超過 1MB 限制!\n建議使用圖片編輯軟體壓縮後再上傳。", + "dataSizeExceeded": "圖片 {filename} 數據大小超過 1MB 限制!" + }, + "languageNames": { + "zhTw": "繁體中文", + "en": "English", + "zhCn": "简体中文" + }, + "test": { + "qtGuiSummary": "🎯 圖片預覽和視窗調整測試\n\n這是一個測試會話,用於驗證以下功能:\n\n✅ 功能測試項目:\n1. 圖片上傳和預覽功能\n2. 圖片右上角X刪除按鈕\n3. 視窗自由調整大小\n4. 分割器的靈活調整\n5. 各區域的動態佈局\n6. 智能 Ctrl+V 圖片貼上功能\n\n📋 測試步驟:\n1. 嘗試上傳一些圖片(拖拽、文件選擇、剪貼板)\n2. 檢查圖片預覽是否正常顯示\n3. 點擊圖片右上角的X按鈕刪除圖片\n4. 嘗試調整視窗大小,檢查是否可以自由調整\n5. 拖動分割器調整各區域大小\n6. 在文字框內按 Ctrl+V 測試智能貼上功能\n7. 提供任何回饋或發現的問題\n\n請測試這些功能並提供回饋!", + "webUiSummary": "測試 Web UI 功能\n\n🎯 **功能測試項目:**\n- Web UI 服務器啟動和運行\n- WebSocket 即時通訊\n- 回饋提交功能\n- 圖片上傳和預覽\n- 命令執行功能\n- 智能 Ctrl+V 圖片貼上\n- 多語言介面切換\n\n📋 **測試步驟:**\n1. 測試圖片上傳(拖拽、選擇檔案、剪貼簿)\n2. 在文字框內按 Ctrl+V 測試智能貼上\n3. 嘗試切換語言(繁中/簡中/英文)\n4. 測試命令執行功能\n5. 提交回饋和圖片\n\n請測試這些功能並提供回饋!", + "messages": { + "webModuleLoaded": "✅ 使用新的 web 模組", + "webModuleLoadFailed": "⚠️ 無法導入 Web UI 模組: {error}", + "startingWebServer": "🚀 啟動 Web 服務器...", + "serverStartError": "服務器啟動錯誤: {error}", + "webServerStartSuccess": "✅ Web 服務器啟動成功", + "serverRunningAt": "🌐 服務器運行在: http://{host}:{port}", + "cannotConnectToPort": "❌ 無法連接到服務器端口 {port}", + "webServerStartFailed": "❌ Web 服務器啟動失敗: {error}", + "serverNotStarted": "❌ 服務器未能正常啟動", + "testSessionCreated": "✅ 測試會話創建成功 (ID: {sessionId}...)", + "testUrl": "🔗 測試 URL: {url}", + "testingBrowserLaunch": "🌐 測試瀏覽器啟動功能...", + "wslEnvironmentDetected": "✅ 檢測到 WSL 環境,使用 WSL 專用瀏覽器啟動", + "nonWslEnvironment": "ℹ️ 非 WSL 環境,使用標準瀏覽器啟動", + "browserLaunchSuccess": "✅ 瀏覽器啟動成功: {url}", + "browserLaunchFailed": "⚠️ 瀏覽器啟動失敗: {error}", + "browserLaunchNote": "💡 這可能是正常的,請手動在瀏覽器中開啟上述 URL", + "sessionCreationFailed": "❌ 會話創建失敗: {error}", + "allTestsPassed": "🎉 所有測試通過!Web UI 準備就緒", + "notes": "📝 注意事項:", + "webUiAutoEnabled": " - Web UI 會在 SSH remote 環境下自動啟用", + "localEnvironmentGui": " - 本地環境會繼續使用 Qt GUI", + "realtimeCommandSupport": " - 支援即時命令執行和 WebSocket 通訊", + "modernDarkTheme": " - 提供現代化的深色主題界面", + "smartCtrlVPaste": " - 支援智能 Ctrl+V 圖片貼上功能", + "testingEnvironmentDetection": "🔍 測試環境檢測功能", + "wslDetection": "WSL 環境檢測: {result}", + "remoteDetection": "遠端環境檢測: {result}", + "guiAvailability": "GUI 可用性: {result}", + "yes": "是", + "no": "否", + "wslEnvironmentWebUi": "✅ 檢測到 WSL 環境,將使用 Web UI 並支援 Windows 瀏覽器啟動", + "remoteEnvironmentWebUi": "✅ 將使用 Web UI (適合遠端開發環境)", + "localEnvironmentQtGui": "✅ 將使用 Qt GUI (本地環境)", + "environmentDetectionFailed": "❌ 環境檢測失敗: {error}", + "testingMcpIntegration": "🔧 測試 MCP 整合功能", + "mcpToolFunctionAvailable": "✅ MCP 工具函數可用", + "timeoutParameterSupported": "✅ 支援 timeout 參數", + "environmentBasedWebUiSupported": "✅ 支援基於環境變數的 Web UI 選擇", + "readyForAiAssistantCalls": "✅ 準備接受來自 AI 助手的調用", + "mcpIntegrationTestFailed": "❌ MCP 整合測試失敗: {error}", + "testingParameterFunctionality": "🆕 測試參數功能", + "timeoutParameterExists": "✅ timeout 參數存在,預設值: {default}", + "timeoutParameterMissing": "❌ timeout 參數不存在", + "forceWebDetected": "✅ 檢測到 FORCE_WEB 環境變數: {value}", + "forceWebNotSet": "ℹ️ FORCE_WEB 環境變數未設定(將使用預設邏輯)", + "parameterFunctionalityNormal": "✅ 參數功能正常", + "parameterTestFailed": "❌ 參數測試失敗: {error}", + "testingEnvironmentWebUiMode": "🌐 測試環境變數控制 Web UI 模式", + "currentEnvironment": "當前環境 - WSL: {wsl}, 遠端: {remote}, GUI 可用: {gui}", + "forceWebVariable": "FORCE_WEB 環境變數: {value}", + "notSet": "未設定", + "forceWebEnabled": "✅ FORCE_WEB 已啟用,將強制使用 Web UI", + "wslEnvironmentWebUiBrowser": "✅ WSL 環境,將使用 Web UI 並支援 Windows 瀏覽器啟動", + "localGuiEnvironmentQtGui": "ℹ️ 本地 GUI 環境,將使用 Qt GUI", + "forceWebTestHint": "💡 可設定 FORCE_WEB=true 強制使用 Web UI 進行測試", + "autoWebUiRemoteOrNoGui": "ℹ️ 將自動使用 Web UI(遠端環境或 GUI 不可用)", + "environmentVariableTestFailed": "❌ 環境變數測試失敗: {error}", + "webUiInteractiveTestMode": "🌐 Web UI 互動測試模式", + "serverAddress": "服務器地址: {url}", + "operationGuide": "📖 操作指南:", + "openServerInBrowser": " 1. 在瀏覽器中開啟上面的服務器地址", + "tryFollowingFeatures": " 2. 嘗試以下功能:", + "clickShowCommandBlock": " - 點擊 '顯示命令區塊' 按鈕", + "inputCommandAndExecute": " - 輸入命令如 'echo Hello World' 並執行", + "inputTextInFeedbackArea": " - 在回饋區域輸入文字", + "useCtrlEnterSubmit": " - 使用 Ctrl+Enter 提交回饋", + "testWebSocketRealtime": " 3. 測試 WebSocket 即時通訊功能", + "testPagePersistence": " 4. 測試頁面持久性(提交反饋後頁面不關閉)", + "controlOptions": "⌨️ 控制選項:", + "pressEnterContinue": " - 按 Enter 繼續運行", + "inputQuitToStop": " - 輸入 'q' 或 'quit' 停止服務器", + "stoppingServer": "🛑 停止服務器...", + "serverContinuesRunning": "🔄 服務器持續運行在: {url}", + "browserShouldStillAccess": " 瀏覽器應該仍可正常訪問", + "unknownCommand": "❓ 未知命令。按 Enter 繼續運行,或輸入 'q' 退出", + "interruptSignalReceived": "🛑 收到中斷信號,停止服務器...", + "webUiTestComplete": "✅ Web UI 測試完成", + "allTestsComplete": "🎊 所有測試完成!準備使用 MCP Feedback Enhanced", + "usageInstructions": "📖 使用方法:", + "configureMcpServer": " 1. 在 Cursor/Cline 中配置此 MCP 服務器", + "aiAssistantAutoCall": " 2. AI 助手會自動調用 interactive_feedback 工具", + "autoSelectGuiOrWebUi": " 3. 根據環境自動選擇 GUI 或 Web UI", + "provideFeedbackContinue": " 4. 提供回饋後繼續工作流程", + "webUiNewFeatures": "✨ Web UI 新功能:", + "sshRemoteSupport": " - 支援 SSH remote 開發環境", + "modernDarkThemeInterface": " - 現代化深色主題界面", + "webSocketRealtime": " - WebSocket 即時通訊", + "autoBrowserLaunch": " - 自動瀏覽器啟動", + "commandExecutionRealtime": " - 命令執行和即時輸出", + "testCompleteSystemReady": "✅ 測試完成 - 系統已準備就緒!", + "canTestInBrowserNow": "💡 您可以現在就在瀏覽器中測試: {url}", + "serverWillContinueRunning": " (服務器會繼續運行一小段時間)", + "someTestsFailed": "❌ 部分測試失敗,請檢查錯誤信息", + "testingWebUi": "🧪 測試 MCP Feedback Enhanced Web UI", + "syncingLanguageSettings": "🔄 同步語言設定...", + "currentLanguage": "📝 當前使用語言: {language}", + "webUiModuleImportSuccess": "✅ Web UI 模組匯入成功", + "webUiModuleImportFailed": "❌ Web UI 模組匯入失敗: {error}", + "webUiManagerCreateSuccess": "✅ WebUIManager 創建成功", + "webUiManagerCreateFailed": "❌ WebUIManager 創建失敗: {error}", + "noLanguageInSettings": "⚠️ ui_settings.json 中沒有語言設定", + "settingsFileNotExists": "⚠️ ui_settings.json 文件不存在,使用默認語言", + "loadLanguageSettingsFailed": "⚠️ 載入語言設定失敗: {error}", + "loadingLanguageFromSettings": "🔄 從 ui_settings.json 載入語言設定: {language}", + "syncingLanguage": "🔄 同步語言設定: {from} -> {to}", + "guiLanguageSynced": "✅ GUI 語言已同步到: {language}", + "languageAlreadySynced": "✅ 語言設定已同步: {language}", + "webUiTest": "MCP Feedback Enhanced - Web UI 測試", + "languageSetFailed": "⚠️ 語言設定失敗,使用默認語言: {language}", + "foundAvailablePort": "🔍 找到可用端口: {port}", + "findPortFailed": "❌ 尋找可用端口失敗: {error}" + } } - }, - "settings": { - "title": "應用設置", - "language": { - "title": "語言設置", - "selector": "🌐 語言選擇" - }, - "layout": { - "title": "界面佈局", - "separateMode": "分離模式", - "separateModeDescription": "AI 摘要和回饋分別在不同頁籤", - "combinedVertical": "合併模式(垂直布局)", - "combinedVerticalDescription": "AI 摘要在上,回饋輸入在下,摘要和回饋在同一頁面", - "combinedHorizontal": "合併模式(水平布局)", - "combinedHorizontalDescription": "AI 摘要在左,回饋輸入在右,增大摘要可視區域" - }, - "window": { - "title": "視窗定位", - "alwaysCenter": "總是在主螢幕中心顯示視窗" - }, - "reset": { - "title": "重置設定", - "button": "重置設定", - "confirmTitle": "確認重置設定", - "confirmMessage": "確定要重置所有設定嗎?這將清除所有已保存的偏好設定並恢復到預設狀態。", - "successTitle": "重置成功", - "successMessage": "所有設定已成功重置為預設值。", - "errorTitle": "重置失敗", - "errorMessage": "重置設定時發生錯誤:{error}" - } - }, - "buttons": { - "submit": "提交回饋", - "cancel": "取消", - "close": "關閉", - "clear": "清除", - "submitFeedback": "✅ 提交回饋", - "selectFiles": "📁 選擇文件", - "pasteClipboard": "📋 剪貼板", - "clearAll": "✕ 清除", - "runCommand": "▶️ 執行" - }, - "status": { - "feedbackSubmitted": "回饋已成功提交!", - "feedbackCancelled": "已取消回饋。", - "timeoutMessage": "等待回饋超時", - "errorOccurred": "發生錯誤", - "loading": "載入中...", - "connecting": "連接中...", - "connected": "已連接", - "disconnected": "連接中斷", - "uploading": "上傳中...", - "uploadSuccess": "上傳成功", - "uploadFailed": "上傳失敗", - "commandRunning": "命令執行中...", - "commandFinished": "命令執行完成", - "pasteSuccess": "已從剪貼板貼上圖片", - "pasteFailed": "無法從剪貼板獲取圖片", - "invalidFileType": "不支援的文件類型", - "fileTooLarge": "文件過大(最大 1MB)" - }, - "errors": { - "title": "錯誤", - "warning": "警告", - "info": "提示", - "interfaceReloadError": "重新載入界面時發生錯誤: {error}", - "imageSaveEmpty": "保存的圖片文件為空!位置: {path}", - "imageSaveFailed": "圖片保存失敗!", - "clipboardSaveFailed": "無法保存剪貼板圖片!", - "noValidImage": "剪貼板中沒有有效的圖片!", - "noImageContent": "剪貼板中沒有圖片內容!", - "emptyFile": "圖片 {filename} 是空文件!", - "loadImageFailed": "無法載入圖片 {filename}:\n{error}", - "dragInvalidFiles": "請拖拽有效的圖片文件!", - "confirmClearAll": "確定要清除所有 {count} 張圖片嗎?", - "confirmClearTitle": "確認清除", - "fileSizeExceeded": "圖片 {filename} 大小為 {size}MB,超過 1MB 限制!\n建議使用圖片編輯軟體壓縮後再上傳。", - "dataSizeExceeded": "圖片 {filename} 數據大小超過 1MB 限制!" - }, - "languageNames": { - "zhTw": "繁體中文", - "en": "English", - "zhCn": "简体中文" - }, - "test": { - "qtGuiSummary": "🎯 圖片預覽和視窗調整測試\n\n這是一個測試會話,用於驗證以下功能:\n\n✅ 功能測試項目:\n1. 圖片上傳和預覽功能\n2. 圖片右上角X刪除按鈕\n3. 視窗自由調整大小\n4. 分割器的靈活調整\n5. 各區域的動態佈局\n6. 智能 Ctrl+V 圖片貼上功能\n\n📋 測試步驟:\n1. 嘗試上傳一些圖片(拖拽、文件選擇、剪貼板)\n2. 檢查圖片預覽是否正常顯示\n3. 點擊圖片右上角的X按鈕刪除圖片\n4. 嘗試調整視窗大小,檢查是否可以自由調整\n5. 拖動分割器調整各區域大小\n6. 在文字框內按 Ctrl+V 測試智能貼上功能\n7. 提供任何回饋或發現的問題\n\n請測試這些功能並提供回饋!", - "webUiSummary": "測試 Web UI 功能\n\n🎯 **功能測試項目:**\n- Web UI 服務器啟動和運行\n- WebSocket 即時通訊\n- 回饋提交功能\n- 圖片上傳和預覽\n- 命令執行功能\n- 智能 Ctrl+V 圖片貼上\n- 多語言介面切換\n\n📋 **測試步驟:**\n1. 測試圖片上傳(拖拽、選擇檔案、剪貼簿)\n2. 在文字框內按 Ctrl+V 測試智能貼上\n3. 嘗試切換語言(繁中/簡中/英文)\n4. 測試命令執行功能\n5. 提交回饋和圖片\n\n請測試這些功能並提供回饋!", - "messages": { - "webModuleLoaded": "✅ 使用新的 web 模組", - "webModuleLoadFailed": "⚠️ 無法導入 Web UI 模組: {error}", - "startingWebServer": "🚀 啟動 Web 服務器...", - "serverStartError": "服務器啟動錯誤: {error}", - "webServerStartSuccess": "✅ Web 服務器啟動成功", - "serverRunningAt": "🌐 服務器運行在: http://{host}:{port}", - "cannotConnectToPort": "❌ 無法連接到服務器端口 {port}", - "webServerStartFailed": "❌ Web 服務器啟動失敗: {error}", - "serverNotStarted": "❌ 服務器未能正常啟動", - "testSessionCreated": "✅ 測試會話創建成功 (ID: {sessionId}...)", - "testUrl": "🔗 測試 URL: {url}", - "testingBrowserLaunch": "🌐 測試瀏覽器啟動功能...", - "wslEnvironmentDetected": "✅ 檢測到 WSL 環境,使用 WSL 專用瀏覽器啟動", - "nonWslEnvironment": "ℹ️ 非 WSL 環境,使用標準瀏覽器啟動", - "browserLaunchSuccess": "✅ 瀏覽器啟動成功: {url}", - "browserLaunchFailed": "⚠️ 瀏覽器啟動失敗: {error}", - "browserLaunchNote": "💡 這可能是正常的,請手動在瀏覽器中開啟上述 URL", - "sessionCreationFailed": "❌ 會話創建失敗: {error}", - "allTestsPassed": "🎉 所有測試通過!Web UI 準備就緒", - "notes": "📝 注意事項:", - "webUiAutoEnabled": " - Web UI 會在 SSH remote 環境下自動啟用", - "localEnvironmentGui": " - 本地環境會繼續使用 Qt GUI", - "realtimeCommandSupport": " - 支援即時命令執行和 WebSocket 通訊", - "modernDarkTheme": " - 提供現代化的深色主題界面", - "smartCtrlVPaste": " - 支援智能 Ctrl+V 圖片貼上功能", - "testingEnvironmentDetection": "🔍 測試環境檢測功能", - "wslDetection": "WSL 環境檢測: {result}", - "remoteDetection": "遠端環境檢測: {result}", - "guiAvailability": "GUI 可用性: {result}", - "yes": "是", - "no": "否", - "wslEnvironmentWebUi": "✅ 檢測到 WSL 環境,將使用 Web UI 並支援 Windows 瀏覽器啟動", - "remoteEnvironmentWebUi": "✅ 將使用 Web UI (適合遠端開發環境)", - "localEnvironmentQtGui": "✅ 將使用 Qt GUI (本地環境)", - "environmentDetectionFailed": "❌ 環境檢測失敗: {error}", - "testingMcpIntegration": "🔧 測試 MCP 整合功能", - "mcpToolFunctionAvailable": "✅ MCP 工具函數可用", - "timeoutParameterSupported": "✅ 支援 timeout 參數", - "environmentBasedWebUiSupported": "✅ 支援基於環境變數的 Web UI 選擇", - "readyForAiAssistantCalls": "✅ 準備接受來自 AI 助手的調用", - "mcpIntegrationTestFailed": "❌ MCP 整合測試失敗: {error}", - "testingParameterFunctionality": "🆕 測試參數功能", - "timeoutParameterExists": "✅ timeout 參數存在,預設值: {default}", - "timeoutParameterMissing": "❌ timeout 參數不存在", - "forceWebDetected": "✅ 檢測到 FORCE_WEB 環境變數: {value}", - "forceWebNotSet": "ℹ️ FORCE_WEB 環境變數未設定(將使用預設邏輯)", - "parameterFunctionalityNormal": "✅ 參數功能正常", - "parameterTestFailed": "❌ 參數測試失敗: {error}", - "testingEnvironmentWebUiMode": "🌐 測試環境變數控制 Web UI 模式", - "currentEnvironment": "當前環境 - WSL: {wsl}, 遠端: {remote}, GUI 可用: {gui}", - "forceWebVariable": "FORCE_WEB 環境變數: {value}", - "notSet": "未設定", - "forceWebEnabled": "✅ FORCE_WEB 已啟用,將強制使用 Web UI", - "wslEnvironmentWebUiBrowser": "✅ WSL 環境,將使用 Web UI 並支援 Windows 瀏覽器啟動", - "localGuiEnvironmentQtGui": "ℹ️ 本地 GUI 環境,將使用 Qt GUI", - "forceWebTestHint": "💡 可設定 FORCE_WEB=true 強制使用 Web UI 進行測試", - "autoWebUiRemoteOrNoGui": "ℹ️ 將自動使用 Web UI(遠端環境或 GUI 不可用)", - "environmentVariableTestFailed": "❌ 環境變數測試失敗: {error}", - "webUiInteractiveTestMode": "🌐 Web UI 互動測試模式", - "serverAddress": "服務器地址: {url}", - "operationGuide": "📖 操作指南:", - "openServerInBrowser": " 1. 在瀏覽器中開啟上面的服務器地址", - "tryFollowingFeatures": " 2. 嘗試以下功能:", - "clickShowCommandBlock": " - 點擊 '顯示命令區塊' 按鈕", - "inputCommandAndExecute": " - 輸入命令如 'echo Hello World' 並執行", - "inputTextInFeedbackArea": " - 在回饋區域輸入文字", - "useCtrlEnterSubmit": " - 使用 Ctrl+Enter 提交回饋", - "testWebSocketRealtime": " 3. 測試 WebSocket 即時通訊功能", - "testPagePersistence": " 4. 測試頁面持久性(提交反饋後頁面不關閉)", - "controlOptions": "⌨️ 控制選項:", - "pressEnterContinue": " - 按 Enter 繼續運行", - "inputQuitToStop": " - 輸入 'q' 或 'quit' 停止服務器", - "stoppingServer": "🛑 停止服務器...", - "serverContinuesRunning": "🔄 服務器持續運行在: {url}", - "browserShouldStillAccess": " 瀏覽器應該仍可正常訪問", - "unknownCommand": "❓ 未知命令。按 Enter 繼續運行,或輸入 'q' 退出", - "interruptSignalReceived": "🛑 收到中斷信號,停止服務器...", - "webUiTestComplete": "✅ Web UI 測試完成", - "allTestsComplete": "🎊 所有測試完成!準備使用 MCP Feedback Enhanced", - "usageInstructions": "📖 使用方法:", - "configureMcpServer": " 1. 在 Cursor/Cline 中配置此 MCP 服務器", - "aiAssistantAutoCall": " 2. AI 助手會自動調用 interactive_feedback 工具", - "autoSelectGuiOrWebUi": " 3. 根據環境自動選擇 GUI 或 Web UI", - "provideFeedbackContinue": " 4. 提供回饋後繼續工作流程", - "webUiNewFeatures": "✨ Web UI 新功能:", - "sshRemoteSupport": " - 支援 SSH remote 開發環境", - "modernDarkThemeInterface": " - 現代化深色主題界面", - "webSocketRealtime": " - WebSocket 即時通訊", - "autoBrowserLaunch": " - 自動瀏覽器啟動", - "commandExecutionRealtime": " - 命令執行和即時輸出", - "testCompleteSystemReady": "✅ 測試完成 - 系統已準備就緒!", - "canTestInBrowserNow": "💡 您可以現在就在瀏覽器中測試: {url}", - "serverWillContinueRunning": " (服務器會繼續運行一小段時間)", - "someTestsFailed": "❌ 部分測試失敗,請檢查錯誤信息", - "testingWebUi": "🧪 測試 MCP Feedback Enhanced Web UI", - "syncingLanguageSettings": "🔄 同步語言設定...", - "currentLanguage": "📝 當前使用語言: {language}", - "webUiModuleImportSuccess": "✅ Web UI 模組匯入成功", - "webUiModuleImportFailed": "❌ Web UI 模組匯入失敗: {error}", - "webUiManagerCreateSuccess": "✅ WebUIManager 創建成功", - "webUiManagerCreateFailed": "❌ WebUIManager 創建失敗: {error}", - "noLanguageInSettings": "⚠️ ui_settings.json 中沒有語言設定", - "settingsFileNotExists": "⚠️ ui_settings.json 文件不存在,使用默認語言", - "loadLanguageSettingsFailed": "⚠️ 載入語言設定失敗: {error}", - "loadingLanguageFromSettings": "🔄 從 ui_settings.json 載入語言設定: {language}", - "syncingLanguage": "🔄 同步語言設定: {from} -> {to}", - "guiLanguageSynced": "✅ GUI 語言已同步到: {language}", - "languageAlreadySynced": "✅ 語言設定已同步: {language}", - "webUiTest": "MCP Feedback Enhanced - Web UI 測試", - "languageSetFailed": "⚠️ 語言設定失敗,使用默認語言: {language}", - "foundAvailablePort": "🔍 找到可用端口: {port}", - "findPortFailed": "❌ 尋找可用端口失敗: {error}" - } - } -} \ No newline at end of file +} diff --git a/src/mcp_feedback_enhanced/gui/tabs/settings_tab.py b/src/mcp_feedback_enhanced/gui/tabs/settings_tab.py index 94f5147..d1f3ecb 100644 --- a/src/mcp_feedback_enhanced/gui/tabs/settings_tab.py +++ b/src/mcp_feedback_enhanced/gui/tabs/settings_tab.py @@ -27,65 +27,65 @@ class SettingsTab(QWidget): layout_change_requested = Signal(bool, str) # 佈局變更請求信號 (combined_mode, orientation) reset_requested = Signal() # 重置設定請求信號 timeout_settings_changed = Signal(bool, int) # 超時設置變更信號 (enabled, duration) - + def __init__(self, combined_mode: bool, config_manager, parent=None): super().__init__(parent) self.combined_mode = combined_mode self.config_manager = config_manager self.layout_orientation = self.config_manager.get_layout_orientation() self.i18n = get_i18n_manager() - + # 保存需要更新的UI元素引用 self.ui_elements = {} - + # 設置全域字體為微軟正黑體 self._setup_font() self._setup_ui() - + # 在UI設置完成後,確保正確設置初始狀態 self._set_initial_layout_state() - + def _setup_font(self) -> None: """設置全域字體""" font = QFont("Microsoft JhengHei", 9) # 微軟正黑體,調整為 9pt self.setFont(font) - + # 設置整個控件的樣式表,確保中文字體正確 self.setStyleSheet(""" QWidget { font-family: "Microsoft JhengHei", "微軟正黑體", sans-serif; } """) - + def _setup_ui(self) -> None: """設置用戶介面""" # 主容器 main_layout = QHBoxLayout(self) main_layout.setContentsMargins(0, 0, 0, 0) main_layout.setSpacing(0) - + # 左側內容區域 content_widget = QWidget() content_widget.setMaximumWidth(600) content_layout = QVBoxLayout(content_widget) content_layout.setContentsMargins(20, 20, 20, 20) content_layout.setSpacing(16) - + # === 語言設置 === self._create_language_section(content_layout) - + # 添加分隔線 self._add_separator(content_layout) - + # === 界面佈局 === self._create_layout_section(content_layout) - + # 添加分隔線 self._add_separator(content_layout) - + # === 視窗設置 === self._create_window_section(content_layout) - + # 添加分隔線 self._add_separator(content_layout) @@ -97,17 +97,17 @@ class SettingsTab(QWidget): # === 重置設定 === self._create_reset_section(content_layout) - + # 添加彈性空間 content_layout.addStretch() - + # 添加到主布局 main_layout.addWidget(content_widget) main_layout.addStretch() # 右側彈性空間 - + # 設定初始狀態 self._set_initial_layout_state() - + def _add_separator(self, layout: QVBoxLayout) -> None: """添加分隔線""" separator = QFrame() @@ -122,7 +122,7 @@ class SettingsTab(QWidget): } """) layout.addWidget(separator) - + def _create_section_header(self, title: str, emoji: str = "") -> QLabel: """創建區塊標題""" text = f"{emoji} {title}" if emoji else title @@ -138,7 +138,7 @@ class SettingsTab(QWidget): } """) return label - + def _create_description(self, text: str) -> QLabel: """創建說明文字""" label = QLabel(text) @@ -153,18 +153,18 @@ class SettingsTab(QWidget): """) label.setWordWrap(True) return label - + def _create_language_section(self, layout: QVBoxLayout) -> None: """創建語言設置區域""" header = self._create_section_header(t('settings.language.title'), "🌐") layout.addWidget(header) # 保存引用以便更新 self.ui_elements['language_header'] = header - + # 語言選擇器容器 lang_container = QHBoxLayout() lang_container.setContentsMargins(0, 0, 0, 0) - + self.language_selector = QComboBox() self.language_selector.setMinimumHeight(28) self.language_selector.setMaximumWidth(140) @@ -197,29 +197,29 @@ class SettingsTab(QWidget): min-width: 120px; } """) - + # 填充語言選項 self._populate_language_selector() self.language_selector.currentIndexChanged.connect(self._on_language_changed) - + lang_container.addWidget(self.language_selector) lang_container.addStretch() layout.addLayout(lang_container) - + def _create_layout_section(self, layout: QVBoxLayout) -> None: """創建界面佈局區域""" header = self._create_section_header(t('settings.layout.title'), "📐") layout.addWidget(header) # 保存引用以便更新 self.ui_elements['layout_header'] = header - + # 選項容器 options_layout = QVBoxLayout() options_layout.setSpacing(2) - + # 創建按鈕組 self.layout_button_group = QButtonGroup() - + # 分離模式 self.separate_mode_radio = QRadioButton(t('settings.layout.separateMode')) self.separate_mode_radio.setStyleSheet(""" @@ -251,7 +251,7 @@ class SettingsTab(QWidget): """) self.layout_button_group.addButton(self.separate_mode_radio, 0) options_layout.addWidget(self.separate_mode_radio) - + separate_hint = QLabel(f" {t('settings.layout.separateModeDescription')}") separate_hint.setStyleSheet(""" QLabel { @@ -265,53 +265,59 @@ class SettingsTab(QWidget): options_layout.addWidget(separate_hint) # 保存引用以便更新 self.ui_elements['separate_hint'] = separate_hint - + # 合併模式(垂直) self.combined_vertical_radio = QRadioButton(t('settings.layout.combinedVertical')) self.combined_vertical_radio.setStyleSheet(self.separate_mode_radio.styleSheet()) self.layout_button_group.addButton(self.combined_vertical_radio, 1) options_layout.addWidget(self.combined_vertical_radio) - + vertical_hint = QLabel(f" {t('settings.layout.combinedVerticalDescription')}") vertical_hint.setStyleSheet(separate_hint.styleSheet()) options_layout.addWidget(vertical_hint) # 保存引用以便更新 self.ui_elements['vertical_hint'] = vertical_hint - + # 合併模式(水平) self.combined_horizontal_radio = QRadioButton(t('settings.layout.combinedHorizontal')) self.combined_horizontal_radio.setStyleSheet(self.separate_mode_radio.styleSheet()) self.layout_button_group.addButton(self.combined_horizontal_radio, 2) options_layout.addWidget(self.combined_horizontal_radio) - + horizontal_hint = QLabel(f" {t('settings.layout.combinedHorizontalDescription')}") horizontal_hint.setStyleSheet(separate_hint.styleSheet()) options_layout.addWidget(horizontal_hint) # 保存引用以便更新 self.ui_elements['horizontal_hint'] = horizontal_hint - + layout.addLayout(options_layout) - + # 連接佈局變更信號 self.layout_button_group.buttonToggled.connect(self._on_layout_changed) - + def _create_window_section(self, layout: QVBoxLayout) -> None: """創建視窗設置區域""" header = self._create_section_header(t('settings.window.title'), "🖥️") layout.addWidget(header) # 保存引用以便更新 self.ui_elements['window_header'] = header - + # 選項容器 options_layout = QVBoxLayout() options_layout.setSpacing(8) - + # 使用現代化的 Switch 組件 self.always_center_switch = SwitchWithLabel(t('settings.window.alwaysCenter')) self.always_center_switch.setChecked(self.config_manager.get_always_center_window()) self.always_center_switch.toggled.connect(self._on_always_center_changed) options_layout.addWidget(self.always_center_switch) - + + # 自動聚焦開關 + self.auto_focus_switch = SwitchWithLabel(t('settings.window.autoFocus')) + self.auto_focus_switch.setChecked(self.config_manager.get_auto_focus_enabled()) + self.auto_focus_switch.toggled.connect(self._on_auto_focus_changed) + options_layout.addWidget(self.auto_focus_switch) + layout.addLayout(options_layout) def _create_timeout_section(self, layout: QVBoxLayout) -> None: @@ -376,10 +382,10 @@ class SettingsTab(QWidget): layout.addWidget(header) # 保存引用以便更新 self.ui_elements['reset_header'] = header - + reset_container = QHBoxLayout() reset_container.setContentsMargins(0, 0, 0, 0) - + self.reset_button = QPushButton(t('settings.reset.button')) self.reset_button.setMinimumHeight(32) self.reset_button.setMaximumWidth(110) @@ -402,7 +408,7 @@ class SettingsTab(QWidget): } """) self.reset_button.clicked.connect(self._on_reset_settings) - + reset_container.addWidget(self.reset_button) reset_container.addStretch() layout.addLayout(reset_container) @@ -414,28 +420,28 @@ class SettingsTab(QWidget): ('zh-CN', '简体中文'), ('en', 'English') ] - + current_language = self.i18n.get_current_language() - + # 暫時斷開信號連接以避免觸發變更事件 self.language_selector.blockSignals(True) - + # 先清空現有選項 self.language_selector.clear() - + for i, (code, name) in enumerate(languages): self.language_selector.addItem(name, code) if code == current_language: self.language_selector.setCurrentIndex(i) - + # 重新連接信號 self.language_selector.blockSignals(False) - + def _on_language_changed(self, index: int) -> None: """語言變更事件處理""" if index < 0: return - + language_code = self.language_selector.itemData(index) if language_code and language_code != self.i18n.get_current_language(): # 先保存語言設定 @@ -444,14 +450,14 @@ class SettingsTab(QWidget): self.i18n.set_language(language_code) # 發出信號 self.language_changed.emit() - + def _on_layout_changed(self, button, checked: bool) -> None: """佈局變更事件處理""" if not checked: return - + button_id = self.layout_button_group.id(button) - + if button_id == 0: # 分離模式 new_combined_mode = False new_orientation = 'vertical' @@ -463,7 +469,7 @@ class SettingsTab(QWidget): new_orientation = 'horizontal' else: return - + # 檢查是否真的有變更 if new_combined_mode != self.combined_mode or new_orientation != self.layout_orientation: # 批量保存配置(避免多次寫入文件) @@ -471,20 +477,26 @@ class SettingsTab(QWidget): 'combined_mode': new_combined_mode, 'layout_orientation': new_orientation }) - + # 更新內部狀態 self.combined_mode = new_combined_mode self.layout_orientation = new_orientation - + # 發出佈局變更請求信號 self.layout_change_requested.emit(new_combined_mode, new_orientation) - + def _on_always_center_changed(self, checked: bool) -> None: """視窗定位選項變更事件處理""" # 立即保存設定 self.config_manager.set_always_center_window(checked) debug_log(f"視窗定位設置已保存: {checked}") # 調試輸出 + def _on_auto_focus_changed(self, checked: bool) -> None: + """自動聚焦選項變更事件處理""" + # 立即保存設定 + self.config_manager.set_auto_focus_enabled(checked) + debug_log(f"自動聚焦設置已保存: {checked}") # 調試輸出 + def _on_timeout_enabled_changed(self, enabled: bool) -> None: """超時啟用狀態變更事件處理""" # 立即保存設定 @@ -514,10 +526,10 @@ class SettingsTab(QWidget): QMessageBox.Yes | QMessageBox.No, QMessageBox.No ) - + if reply == QMessageBox.Yes: self.reset_requested.emit() - + def update_texts(self) -> None: """更新界面文字(不重新創建界面)""" # 更新區塊標題 @@ -546,10 +558,12 @@ class SettingsTab(QWidget): # 更新按鈕文字 if hasattr(self, 'reset_button'): self.reset_button.setText(t('settings.reset.button')) - + # 更新切換開關文字 if hasattr(self, 'always_center_switch'): self.always_center_switch.setText(t('settings.window.alwaysCenter')) + if hasattr(self, 'auto_focus_switch'): + self.auto_focus_switch.setText(t('settings.window.autoFocus')) if hasattr(self, 'timeout_enabled_switch'): self.timeout_enabled_switch.setText(t('timeout.enable')) @@ -558,7 +572,7 @@ class SettingsTab(QWidget): self.ui_elements['timeout_duration_label'].setText(t('timeout.duration.label')) if hasattr(self, 'timeout_duration_spinbox'): self.timeout_duration_spinbox.setSuffix(" " + t('timeout.seconds')) - + # 更新單選按鈕文字 if hasattr(self, 'separate_mode_radio'): self.separate_mode_radio.setText(t('settings.layout.separateMode')) @@ -566,25 +580,29 @@ class SettingsTab(QWidget): self.combined_vertical_radio.setText(t('settings.layout.combinedVertical')) if hasattr(self, 'combined_horizontal_radio'): self.combined_horizontal_radio.setText(t('settings.layout.combinedHorizontal')) - + # 注意:不要重新填充語言選擇器,避免重複選項問題 - + def reload_settings_from_config(self) -> None: """從配置重新載入設定狀態""" # 重新載入語言設定 if hasattr(self, 'language_selector'): self._populate_language_selector() - + # 重新載入佈局設定 self.combined_mode = self.config_manager.get_layout_mode() self.layout_orientation = self.config_manager.get_layout_orientation() self._set_initial_layout_state() - + # 重新載入視窗設定 if hasattr(self, 'always_center_switch'): always_center = self.config_manager.get_always_center_window() self.always_center_switch.setChecked(always_center) debug_log(f"重新載入視窗定位設置: {always_center}") # 調試輸出 + if hasattr(self, 'auto_focus_switch'): + auto_focus = self.config_manager.get_auto_focus_enabled() + self.auto_focus_switch.setChecked(auto_focus) + debug_log(f"重新載入自動聚焦設置: {auto_focus}") # 調試輸出 # 重新載入超時設定 if hasattr(self, 'timeout_enabled_switch'): @@ -595,29 +613,29 @@ class SettingsTab(QWidget): timeout_duration = self.config_manager.get_timeout_duration() self.timeout_duration_spinbox.setValue(timeout_duration) debug_log(f"重新載入超時時間設置: {timeout_duration}") # 調試輸出 - + def set_layout_mode(self, combined_mode: bool) -> None: """設置佈局模式""" self.combined_mode = combined_mode self._set_initial_layout_state() - + def set_layout_orientation(self, orientation: str) -> None: """設置佈局方向""" self.layout_orientation = orientation self._set_initial_layout_state() - + def _set_initial_layout_state(self) -> None: """設置初始佈局狀態""" if hasattr(self, 'separate_mode_radio'): # 暫時斷開信號連接以避免觸發變更事件 self.layout_button_group.blockSignals(True) - + if not self.combined_mode: self.separate_mode_radio.setChecked(True) elif self.layout_orientation == 'vertical': self.combined_vertical_radio.setChecked(True) else: self.combined_horizontal_radio.setChecked(True) - + # 重新連接信號 - self.layout_button_group.blockSignals(False) \ No newline at end of file + self.layout_button_group.blockSignals(False) diff --git a/src/mcp_feedback_enhanced/gui/window/config_manager.py b/src/mcp_feedback_enhanced/gui/window/config_manager.py index ce73299..ccbc9b7 100644 --- a/src/mcp_feedback_enhanced/gui/window/config_manager.py +++ b/src/mcp_feedback_enhanced/gui/window/config_manager.py @@ -16,18 +16,18 @@ from ...debug import gui_debug_log as debug_log class ConfigManager: """配置管理器""" - + def __init__(self): self._config_file = self._get_config_file_path() self._config_cache = {} self._load_config() - + def _get_config_file_path(self) -> Path: """獲取配置文件路徑""" config_dir = Path.home() / ".config" / "mcp-feedback-enhanced" config_dir.mkdir(parents=True, exist_ok=True) return config_dir / "ui_settings.json" - + def _load_config(self) -> None: """載入配置""" try: @@ -41,7 +41,7 @@ class ConfigManager: except Exception as e: debug_log(f"載入配置失敗: {e}") self._config_cache = {} - + def _save_config(self) -> None: """保存配置""" try: @@ -50,16 +50,16 @@ class ConfigManager: debug_log("配置文件保存成功") except Exception as e: debug_log(f"保存配置失敗: {e}") - + def get(self, key: str, default: Any = None) -> Any: """獲取配置值""" return self._config_cache.get(key, default) - + def set(self, key: str, value: Any) -> None: """設置配置值""" self._config_cache[key] = value self._save_config() - + def update_partial_config(self, updates: Dict[str, Any]) -> None: """批量更新配置項目,只保存指定的設定而不影響其他參數""" try: @@ -68,84 +68,84 @@ class ConfigManager: if self._config_file.exists(): with open(self._config_file, 'r', encoding='utf-8') as f: current_config = json.load(f) - + # 只更新指定的項目 for key, value in updates.items(): current_config[key] = value # 同時更新內存緩存 self._config_cache[key] = value - + # 保存到文件 with open(self._config_file, 'w', encoding='utf-8') as f: json.dump(current_config, f, ensure_ascii=False, indent=2) - + debug_log(f"部分配置已更新: {list(updates.keys())}") - + except Exception as e: debug_log(f"更新部分配置失敗: {e}") - + def get_layout_mode(self) -> bool: """獲取佈局模式(False=分離模式,True=合併模式)""" return self.get('combined_mode', False) - + def set_layout_mode(self, combined_mode: bool) -> None: """設置佈局模式""" self.update_partial_config({'combined_mode': combined_mode}) debug_log(f"佈局模式設置: {'合併模式' if combined_mode else '分離模式'}") - + def get_layout_orientation(self) -> str: """獲取佈局方向(vertical=垂直(上下),horizontal=水平(左右))""" return self.get('layout_orientation', 'vertical') - + def set_layout_orientation(self, orientation: str) -> None: """設置佈局方向""" if orientation not in ['vertical', 'horizontal']: orientation = 'vertical' self.update_partial_config({'layout_orientation': orientation}) debug_log(f"佈局方向設置: {'垂直(上下)' if orientation == 'vertical' else '水平(左右)'}") - + def get_language(self) -> str: """獲取語言設置""" return self.get('language', 'zh-TW') - + def set_language(self, language: str) -> None: """設置語言""" self.update_partial_config({'language': language}) debug_log(f"語言設置: {language}") - + def get_splitter_sizes(self, splitter_name: str) -> list: """獲取分割器尺寸""" sizes = self.get(f'splitter_sizes.{splitter_name}', []) if sizes: debug_log(f"載入分割器 {splitter_name} 尺寸: {sizes}") return sizes - + def set_splitter_sizes(self, splitter_name: str, sizes: list) -> None: """設置分割器尺寸""" self.update_partial_config({f'splitter_sizes.{splitter_name}': sizes}) debug_log(f"保存分割器 {splitter_name} 尺寸: {sizes}") - + def get_window_geometry(self) -> dict: """獲取窗口幾何信息""" geometry = self.get('window_geometry', {}) if geometry: debug_log(f"載入窗口幾何信息: {geometry}") return geometry - + def set_window_geometry(self, geometry: dict) -> None: """設置窗口幾何信息(使用部分更新避免覆蓋其他設定)""" self.update_partial_config({'window_geometry': geometry}) debug_log(f"保存窗口幾何信息: {geometry}") - + def get_always_center_window(self) -> bool: """獲取總是在主螢幕中心顯示視窗的設置""" return self.get('always_center_window', False) - + def set_always_center_window(self, always_center: bool) -> None: """設置總是在主螢幕中心顯示視窗""" self.update_partial_config({'always_center_window': always_center}) debug_log(f"視窗定位設置: {'總是中心顯示' if always_center else '智能定位'}") - + def get_image_size_limit(self) -> int: """獲取圖片大小限制(bytes),0 表示無限制""" return self.get('image_size_limit', 0) @@ -199,6 +199,15 @@ class ConfigManager: }) debug_log(f"超時設置: {'啟用' if enabled else '停用'}, {seconds} 秒") + def get_auto_focus_enabled(self) -> bool: + """獲取是否啟用自動聚焦到輸入框""" + return self.get('auto_focus_enabled', True) # 預設啟用 + + def set_auto_focus_enabled(self, enabled: bool) -> None: + """設置是否啟用自動聚焦到輸入框""" + self.update_partial_config({'auto_focus_enabled': enabled}) + debug_log(f"自動聚焦設置: {'啟用' if enabled else '停用'}") + def reset_settings(self) -> None: """重置所有設定到預設值""" try: @@ -214,4 +223,4 @@ class ConfigManager: except Exception as e: debug_log(f"重置設定失敗: {e}") - raise \ No newline at end of file + raise diff --git a/src/mcp_feedback_enhanced/gui/window/feedback_window.py b/src/mcp_feedback_enhanced/gui/window/feedback_window.py index 0018ec2..a46aa02 100644 --- a/src/mcp_feedback_enhanced/gui/window/feedback_window.py +++ b/src/mcp_feedback_enhanced/gui/window/feedback_window.py @@ -61,11 +61,14 @@ class FeedbackWindow(QMainWindow): # 如果啟用了超時,自動開始倒數計時 self.start_timeout_if_enabled() - # 設置定時器在窗口顯示後自動聚焦到輸入框 - self._focus_timer = QTimer() - self._focus_timer.setSingleShot(True) - self._focus_timer.timeout.connect(self._auto_focus_input) - self._focus_timer.start(300) # 延遲300ms確保窗口和UI元素完全加載 + # 設置定時器在窗口顯示後自動聚焦到輸入框(如果啟用) + if self.config_manager.get_auto_focus_enabled(): + self._focus_timer = QTimer() + self._focus_timer.setSingleShot(True) + self._focus_timer.timeout.connect(self._auto_focus_input) + self._focus_timer.start(300) # 延遲300ms確保窗口和UI元素完全加載 + else: + debug_log("自動聚焦已停用") def _setup_ui(self) -> None: """設置用戶介面"""