mirror of
https://github.com/Minidoracat/mcp-feedback-enhanced.git
synced 2025-07-27 02:22:26 +08:00
✨ 新增 Web UI 語言設定同步功能,優化多語言支持,並更新相關日誌輸出。修正語言選擇器的應用邏輯,確保設定一致性,提升使用體驗。
This commit is contained in:
parent
568e381e55
commit
bb89de33fc
@ -202,6 +202,120 @@
|
||||
},
|
||||
"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!"
|
||||
"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}"
|
||||
}
|
||||
}
|
||||
}
|
@ -183,7 +183,121 @@
|
||||
},
|
||||
"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请测试这些功能并提供回馈!"
|
||||
"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": "应用程序信息",
|
||||
|
@ -197,6 +197,120 @@
|
||||
},
|
||||
"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請測試這些功能並提供回饋!"
|
||||
"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}"
|
||||
}
|
||||
}
|
||||
}
|
@ -27,6 +27,7 @@ import sys
|
||||
import os
|
||||
import socket
|
||||
import threading
|
||||
import json
|
||||
from pathlib import Path
|
||||
from typing import Dict, Any, Optional
|
||||
|
||||
@ -34,7 +35,7 @@ from typing import Dict, Any, Optional
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..'))
|
||||
|
||||
from .debug import debug_log
|
||||
from .i18n import t
|
||||
from .i18n import t, get_i18n_manager
|
||||
|
||||
# 嘗試導入 Web UI 模組
|
||||
try:
|
||||
@ -42,11 +43,52 @@ try:
|
||||
from .web import WebUIManager, launch_web_feedback_ui, get_web_ui_manager
|
||||
from .web.utils.browser import smart_browser_open, is_wsl_environment
|
||||
WEB_UI_AVAILABLE = True
|
||||
debug_log("✅ 使用新的 web 模組")
|
||||
debug_log(t('test.messages.webModuleLoaded'))
|
||||
except ImportError as e:
|
||||
debug_log(f"⚠️ 無法導入 Web UI 模組: {e}")
|
||||
debug_log(t('test.messages.webModuleLoadFailed', error=str(e)))
|
||||
WEB_UI_AVAILABLE = False
|
||||
|
||||
def load_web_ui_language_setting():
|
||||
"""載入 Web UI 的語言設定並同步到 GUI 國際化系統"""
|
||||
try:
|
||||
# 讀取 ui_settings.json 配置文件
|
||||
config_dir = Path.home() / ".config" / "mcp-feedback-enhanced"
|
||||
settings_file = config_dir / "ui_settings.json"
|
||||
|
||||
if settings_file.exists():
|
||||
with open(settings_file, 'r', encoding='utf-8') as f:
|
||||
settings = json.load(f)
|
||||
language = settings.get('language')
|
||||
|
||||
if language:
|
||||
debug_log(t('test.messages.loadingLanguageFromSettings', language=language))
|
||||
|
||||
# 獲取 GUI 國際化管理器並設定語言
|
||||
i18n_manager = get_i18n_manager()
|
||||
current_language = i18n_manager.get_current_language()
|
||||
|
||||
if language != current_language:
|
||||
debug_log(t('test.messages.syncingLanguage', **{'from': current_language, 'to': language}))
|
||||
success = i18n_manager.set_language(language)
|
||||
if success:
|
||||
debug_log(t('test.messages.guiLanguageSynced', language=language))
|
||||
else:
|
||||
debug_log(t('test.messages.languageSetFailed', language=current_language))
|
||||
else:
|
||||
debug_log(t('test.messages.languageAlreadySynced', language=language))
|
||||
|
||||
return language
|
||||
else:
|
||||
debug_log(t('test.messages.noLanguageInSettings'))
|
||||
else:
|
||||
debug_log(t('test.messages.settingsFileNotExists'))
|
||||
|
||||
except Exception as e:
|
||||
debug_log(t('test.messages.loadLanguageSettingsFailed', error=str(e)))
|
||||
|
||||
# 返回當前語言作為回退
|
||||
return get_i18n_manager().get_current_language()
|
||||
|
||||
def get_test_summary():
|
||||
"""獲取測試摘要,使用國際化系統"""
|
||||
return t('test.webUiSummary')
|
||||
@ -61,46 +103,52 @@ def find_free_port():
|
||||
|
||||
def test_web_ui(keep_running=False):
|
||||
"""Test the Web UI functionality"""
|
||||
|
||||
debug_log("🧪 測試 MCP Feedback Enhanced Web UI")
|
||||
|
||||
debug_log(t('test.messages.testingWebUi'))
|
||||
debug_log("=" * 50)
|
||||
|
||||
# 同步 Web UI 語言設定到 GUI 國際化系統
|
||||
debug_log(t('test.messages.syncingLanguageSettings'))
|
||||
current_language = load_web_ui_language_setting()
|
||||
debug_log(t('test.messages.currentLanguage', language=current_language))
|
||||
debug_log("-" * 30)
|
||||
|
||||
# Test import
|
||||
try:
|
||||
# 使用新的 web 模組
|
||||
from .web import WebUIManager, launch_web_feedback_ui
|
||||
debug_log("✅ Web UI 模組匯入成功")
|
||||
debug_log(t('test.messages.webUiModuleImportSuccess'))
|
||||
except ImportError as e:
|
||||
debug_log(f"❌ Web UI 模組匯入失敗: {e}")
|
||||
debug_log(t('test.messages.webUiModuleImportFailed', error=str(e)))
|
||||
return False, None
|
||||
|
||||
# Find free port
|
||||
try:
|
||||
free_port = find_free_port()
|
||||
debug_log(f"🔍 找到可用端口: {free_port}")
|
||||
debug_log(t('test.messages.foundAvailablePort', port=free_port))
|
||||
except Exception as e:
|
||||
debug_log(f"❌ 尋找可用端口失敗: {e}")
|
||||
debug_log(t('test.messages.findPortFailed', error=str(e)))
|
||||
return False, None
|
||||
|
||||
# Test manager creation
|
||||
try:
|
||||
manager = WebUIManager(port=free_port)
|
||||
debug_log("✅ WebUIManager 創建成功")
|
||||
debug_log(t('test.messages.webUiManagerCreateSuccess'))
|
||||
except Exception as e:
|
||||
debug_log(f"❌ WebUIManager 創建失敗: {e}")
|
||||
debug_log(t('test.messages.webUiManagerCreateFailed', error=str(e)))
|
||||
return False, None
|
||||
|
||||
# Test server start (with timeout)
|
||||
server_started = False
|
||||
try:
|
||||
debug_log("🚀 啟動 Web 服務器...")
|
||||
|
||||
debug_log(t('test.messages.startingWebServer'))
|
||||
|
||||
def start_server():
|
||||
try:
|
||||
manager.start_server()
|
||||
return True
|
||||
except Exception as e:
|
||||
debug_log(f"服務器啟動錯誤: {e}")
|
||||
debug_log(t('test.messages.serverStartError', error=str(e)))
|
||||
return False
|
||||
|
||||
# Start server in thread
|
||||
@ -117,17 +165,17 @@ def test_web_ui(keep_running=False):
|
||||
result = s.connect_ex((manager.host, manager.port))
|
||||
if result == 0:
|
||||
server_started = True
|
||||
debug_log("✅ Web 服務器啟動成功")
|
||||
debug_log(f"🌐 服務器運行在: http://{manager.host}:{manager.port}")
|
||||
debug_log(t('test.messages.webServerStartSuccess'))
|
||||
debug_log(t('test.messages.serverRunningAt', host=manager.host, port=manager.port))
|
||||
else:
|
||||
debug_log(f"❌ 無法連接到服務器端口 {manager.port}")
|
||||
|
||||
debug_log(t('test.messages.cannotConnectToPort', port=manager.port))
|
||||
|
||||
except Exception as e:
|
||||
debug_log(f"❌ Web 服務器啟動失敗: {e}")
|
||||
debug_log(t('test.messages.webServerStartFailed', error=str(e)))
|
||||
return False, None
|
||||
|
||||
|
||||
if not server_started:
|
||||
debug_log("❌ 服務器未能正常啟動")
|
||||
debug_log(t('test.messages.serverNotStarted'))
|
||||
return False, None
|
||||
|
||||
# Test session creation
|
||||
@ -142,41 +190,41 @@ def test_web_ui(keep_running=False):
|
||||
'session_id': session_id,
|
||||
'url': f"http://{manager.host}:{manager.port}" # 使用根路徑
|
||||
}
|
||||
debug_log(f"✅ 測試會話創建成功 (ID: {session_id[:8]}...)")
|
||||
debug_log(f"🔗 測試 URL: {session_info['url']}")
|
||||
debug_log(t('test.messages.testSessionCreated', sessionId=session_id[:8]))
|
||||
debug_log(t('test.messages.testUrl', url=session_info['url']))
|
||||
|
||||
# 測試瀏覽器啟動功能
|
||||
try:
|
||||
debug_log("🌐 測試瀏覽器啟動功能...")
|
||||
debug_log(t('test.messages.testingBrowserLaunch'))
|
||||
if is_wsl_environment():
|
||||
debug_log("✅ 檢測到 WSL 環境,使用 WSL 專用瀏覽器啟動")
|
||||
debug_log(t('test.messages.wslEnvironmentDetected'))
|
||||
else:
|
||||
debug_log("ℹ️ 非 WSL 環境,使用標準瀏覽器啟動")
|
||||
debug_log(t('test.messages.nonWslEnvironment'))
|
||||
|
||||
smart_browser_open(session_info['url'])
|
||||
debug_log(f"✅ 瀏覽器啟動成功: {session_info['url']}")
|
||||
debug_log(t('test.messages.browserLaunchSuccess', url=session_info['url']))
|
||||
except Exception as browser_error:
|
||||
debug_log(f"⚠️ 瀏覽器啟動失敗: {browser_error}")
|
||||
debug_log("💡 這可能是正常的,請手動在瀏覽器中開啟上述 URL")
|
||||
debug_log(t('test.messages.browserLaunchFailed', error=str(browser_error)))
|
||||
debug_log(t('test.messages.browserLaunchNote'))
|
||||
|
||||
except Exception as e:
|
||||
debug_log(f"❌ 會話創建失敗: {e}")
|
||||
debug_log(t('test.messages.sessionCreationFailed', error=str(e)))
|
||||
return False, None
|
||||
|
||||
debug_log("\n" + "=" * 50)
|
||||
debug_log("🎉 所有測試通過!Web UI 準備就緒")
|
||||
debug_log("📝 注意事項:")
|
||||
debug_log(" - Web UI 會在 SSH remote 環境下自動啟用")
|
||||
debug_log(" - 本地環境會繼續使用 Qt GUI")
|
||||
debug_log(" - 支援即時命令執行和 WebSocket 通訊")
|
||||
debug_log(" - 提供現代化的深色主題界面")
|
||||
debug_log(" - 支援智能 Ctrl+V 圖片貼上功能")
|
||||
debug_log(t('test.messages.allTestsPassed'))
|
||||
debug_log(t('test.messages.notes'))
|
||||
debug_log(t('test.messages.webUiAutoEnabled'))
|
||||
debug_log(t('test.messages.localEnvironmentGui'))
|
||||
debug_log(t('test.messages.realtimeCommandSupport'))
|
||||
debug_log(t('test.messages.modernDarkTheme'))
|
||||
debug_log(t('test.messages.smartCtrlVPaste'))
|
||||
|
||||
return True, session_info
|
||||
|
||||
def test_environment_detection():
|
||||
"""Test environment detection logic"""
|
||||
debug_log("🔍 測試環境檢測功能")
|
||||
debug_log(t('test.messages.testingEnvironmentDetection'))
|
||||
debug_log("-" * 30)
|
||||
|
||||
try:
|
||||
@ -186,84 +234,84 @@ def test_environment_detection():
|
||||
remote_detected = is_remote_environment()
|
||||
gui_available = can_use_gui()
|
||||
|
||||
debug_log(f"WSL 環境檢測: {'是' if wsl_detected else '否'}")
|
||||
debug_log(f"遠端環境檢測: {'是' if remote_detected else '否'}")
|
||||
debug_log(f"GUI 可用性: {'是' if gui_available else '否'}")
|
||||
debug_log(t('test.messages.wslDetection', result=t('test.messages.yes') if wsl_detected else t('test.messages.no')))
|
||||
debug_log(t('test.messages.remoteDetection', result=t('test.messages.yes') if remote_detected else t('test.messages.no')))
|
||||
debug_log(t('test.messages.guiAvailability', result=t('test.messages.yes') if gui_available else t('test.messages.no')))
|
||||
|
||||
if wsl_detected:
|
||||
debug_log("✅ 檢測到 WSL 環境,將使用 Web UI 並支援 Windows 瀏覽器啟動")
|
||||
debug_log(t('test.messages.wslEnvironmentWebUi'))
|
||||
elif remote_detected:
|
||||
debug_log("✅ 將使用 Web UI (適合遠端開發環境)")
|
||||
debug_log(t('test.messages.remoteEnvironmentWebUi'))
|
||||
else:
|
||||
debug_log("✅ 將使用 Qt GUI (本地環境)")
|
||||
debug_log(t('test.messages.localEnvironmentQtGui'))
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
debug_log(f"❌ 環境檢測失敗: {e}")
|
||||
debug_log(t('test.messages.environmentDetectionFailed', error=str(e)))
|
||||
return False
|
||||
|
||||
def test_mcp_integration():
|
||||
"""Test MCP server integration"""
|
||||
debug_log("\n🔧 測試 MCP 整合功能")
|
||||
debug_log(t('test.messages.testingMcpIntegration'))
|
||||
debug_log("-" * 30)
|
||||
|
||||
|
||||
try:
|
||||
from .server import interactive_feedback
|
||||
debug_log("✅ MCP 工具函數可用")
|
||||
|
||||
debug_log(t('test.messages.mcpToolFunctionAvailable'))
|
||||
|
||||
# Test timeout parameter
|
||||
debug_log("✅ 支援 timeout 參數")
|
||||
|
||||
debug_log(t('test.messages.timeoutParameterSupported'))
|
||||
|
||||
# Test environment-based Web UI selection
|
||||
debug_log("✅ 支援基於環境變數的 Web UI 選擇")
|
||||
|
||||
debug_log(t('test.messages.environmentBasedWebUiSupported'))
|
||||
|
||||
# Test would require actual MCP call, so just verify import
|
||||
debug_log("✅ 準備接受來自 AI 助手的調用")
|
||||
debug_log(t('test.messages.readyForAiAssistantCalls'))
|
||||
return True
|
||||
|
||||
|
||||
except Exception as e:
|
||||
debug_log(f"❌ MCP 整合測試失敗: {e}")
|
||||
debug_log(t('test.messages.mcpIntegrationTestFailed', error=str(e)))
|
||||
return False
|
||||
|
||||
def test_new_parameters():
|
||||
"""Test timeout parameter and environment variable support"""
|
||||
debug_log("\n🆕 測試參數功能")
|
||||
debug_log(t('test.messages.testingParameterFunctionality'))
|
||||
debug_log("-" * 30)
|
||||
|
||||
|
||||
try:
|
||||
from .server import interactive_feedback
|
||||
|
||||
|
||||
# 測試參數是否存在
|
||||
import inspect
|
||||
sig = inspect.signature(interactive_feedback)
|
||||
|
||||
|
||||
# 檢查 timeout 參數
|
||||
if 'timeout' in sig.parameters:
|
||||
timeout_param = sig.parameters['timeout']
|
||||
debug_log(f"✅ timeout 參數存在,預設值: {timeout_param.default}")
|
||||
debug_log(t('test.messages.timeoutParameterExists', default=timeout_param.default))
|
||||
else:
|
||||
debug_log("❌ timeout 參數不存在")
|
||||
debug_log(t('test.messages.timeoutParameterMissing'))
|
||||
return False
|
||||
|
||||
|
||||
# 檢查環境變數支援
|
||||
import os
|
||||
current_force_web = os.getenv("FORCE_WEB")
|
||||
if current_force_web:
|
||||
debug_log(f"✅ 檢測到 FORCE_WEB 環境變數: {current_force_web}")
|
||||
debug_log(t('test.messages.forceWebDetected', value=current_force_web))
|
||||
else:
|
||||
debug_log("ℹ️ FORCE_WEB 環境變數未設定(將使用預設邏輯)")
|
||||
|
||||
debug_log("✅ 參數功能正常")
|
||||
debug_log(t('test.messages.forceWebNotSet'))
|
||||
|
||||
debug_log(t('test.messages.parameterFunctionalityNormal'))
|
||||
return True
|
||||
|
||||
|
||||
except Exception as e:
|
||||
debug_log(f"❌ 參數測試失敗: {e}")
|
||||
debug_log(t('test.messages.parameterTestFailed', error=str(e)))
|
||||
return False
|
||||
|
||||
def test_environment_web_ui_mode():
|
||||
"""Test environment-based Web UI mode"""
|
||||
debug_log("\n🌐 測試環境變數控制 Web UI 模式")
|
||||
debug_log(t('test.messages.testingEnvironmentWebUiMode'))
|
||||
debug_log("-" * 30)
|
||||
|
||||
try:
|
||||
@ -276,62 +324,62 @@ def test_environment_web_ui_mode():
|
||||
gui_available = can_use_gui()
|
||||
force_web_env = os.getenv("FORCE_WEB", "").lower()
|
||||
|
||||
debug_log(f"當前環境 - WSL: {is_wsl}, 遠端: {is_remote}, GUI 可用: {gui_available}")
|
||||
debug_log(f"FORCE_WEB 環境變數: {force_web_env or '未設定'}")
|
||||
debug_log(t('test.messages.currentEnvironment', wsl=is_wsl, remote=is_remote, gui=gui_available))
|
||||
debug_log(t('test.messages.forceWebVariable', value=force_web_env or t('test.messages.notSet')))
|
||||
|
||||
if force_web_env in ("true", "1", "yes", "on"):
|
||||
debug_log("✅ FORCE_WEB 已啟用,將強制使用 Web UI")
|
||||
debug_log(t('test.messages.forceWebEnabled'))
|
||||
elif is_wsl:
|
||||
debug_log("✅ WSL 環境,將使用 Web UI 並支援 Windows 瀏覽器啟動")
|
||||
debug_log(t('test.messages.wslEnvironmentWebUiBrowser'))
|
||||
elif not is_remote and gui_available:
|
||||
debug_log("ℹ️ 本地 GUI 環境,將使用 Qt GUI")
|
||||
debug_log("💡 可設定 FORCE_WEB=true 強制使用 Web UI 進行測試")
|
||||
debug_log(t('test.messages.localGuiEnvironmentQtGui'))
|
||||
debug_log(t('test.messages.forceWebTestHint'))
|
||||
else:
|
||||
debug_log("ℹ️ 將自動使用 Web UI(遠端環境或 GUI 不可用)")
|
||||
debug_log(t('test.messages.autoWebUiRemoteOrNoGui'))
|
||||
|
||||
return True
|
||||
|
||||
|
||||
except Exception as e:
|
||||
debug_log(f"❌ 環境變數測試失敗: {e}")
|
||||
debug_log(t('test.messages.environmentVariableTestFailed', error=str(e)))
|
||||
return False
|
||||
|
||||
def interactive_demo(session_info):
|
||||
"""Run interactive demo with the Web UI"""
|
||||
debug_log(f"\n🌐 Web UI 互動測試模式")
|
||||
debug_log(t('test.messages.webUiInteractiveTestMode'))
|
||||
debug_log("=" * 50)
|
||||
debug_log(f"服務器地址: {session_info['url']}") # 簡化輸出,只顯示服務器地址
|
||||
debug_log("\n📖 操作指南:")
|
||||
debug_log(" 1. 在瀏覽器中開啟上面的服務器地址")
|
||||
debug_log(" 2. 嘗試以下功能:")
|
||||
debug_log(" - 點擊 '顯示命令區塊' 按鈕")
|
||||
debug_log(" - 輸入命令如 'echo Hello World' 並執行")
|
||||
debug_log(" - 在回饋區域輸入文字")
|
||||
debug_log(" - 使用 Ctrl+Enter 提交回饋")
|
||||
debug_log(" 3. 測試 WebSocket 即時通訊功能")
|
||||
debug_log(" 4. 測試頁面持久性(提交反饋後頁面不關閉)")
|
||||
debug_log("\n⌨️ 控制選項:")
|
||||
debug_log(" - 按 Enter 繼續運行")
|
||||
debug_log(" - 輸入 'q' 或 'quit' 停止服務器")
|
||||
debug_log(t('test.messages.serverAddress', url=session_info['url'])) # 簡化輸出,只顯示服務器地址
|
||||
debug_log(t('test.messages.operationGuide'))
|
||||
debug_log(t('test.messages.openServerInBrowser'))
|
||||
debug_log(t('test.messages.tryFollowingFeatures'))
|
||||
debug_log(t('test.messages.clickShowCommandBlock'))
|
||||
debug_log(t('test.messages.inputCommandAndExecute'))
|
||||
debug_log(t('test.messages.inputTextInFeedbackArea'))
|
||||
debug_log(t('test.messages.useCtrlEnterSubmit'))
|
||||
debug_log(t('test.messages.testWebSocketRealtime'))
|
||||
debug_log(t('test.messages.testPagePersistence'))
|
||||
debug_log(t('test.messages.controlOptions'))
|
||||
debug_log(t('test.messages.pressEnterContinue'))
|
||||
debug_log(t('test.messages.inputQuitToStop'))
|
||||
|
||||
while True:
|
||||
try:
|
||||
user_input = input("\n>>> ").strip().lower()
|
||||
if user_input in ['q', 'quit', 'exit']:
|
||||
debug_log("🛑 停止服務器...")
|
||||
debug_log(t('test.messages.stoppingServer'))
|
||||
break
|
||||
elif user_input == '':
|
||||
debug_log(f"🔄 服務器持續運行在: {session_info['url']}")
|
||||
debug_log(" 瀏覽器應該仍可正常訪問")
|
||||
debug_log(t('test.messages.serverContinuesRunning', url=session_info['url']))
|
||||
debug_log(t('test.messages.browserShouldStillAccess'))
|
||||
else:
|
||||
debug_log("❓ 未知命令。按 Enter 繼續運行,或輸入 'q' 退出")
|
||||
debug_log(t('test.messages.unknownCommand'))
|
||||
except KeyboardInterrupt:
|
||||
debug_log("\n🛑 收到中斷信號,停止服務器...")
|
||||
debug_log(t('test.messages.interruptSignalReceived'))
|
||||
break
|
||||
|
||||
debug_log("✅ Web UI 測試完成")
|
||||
|
||||
debug_log(t('test.messages.webUiTestComplete'))
|
||||
|
||||
if __name__ == "__main__":
|
||||
debug_log("MCP Feedback Enhanced - Web UI 測試")
|
||||
debug_log(t('test.messages.webUiTest'))
|
||||
debug_log("=" * 60)
|
||||
|
||||
# Test environment detection
|
||||
@ -351,25 +399,25 @@ if __name__ == "__main__":
|
||||
|
||||
debug_log("\n" + "=" * 60)
|
||||
if env_test and params_test and env_web_test and mcp_test and web_test:
|
||||
debug_log("🎊 所有測試完成!準備使用 MCP Feedback Enhanced")
|
||||
debug_log("\n📖 使用方法:")
|
||||
debug_log(" 1. 在 Cursor/Cline 中配置此 MCP 服務器")
|
||||
debug_log(" 2. AI 助手會自動調用 interactive_feedback 工具")
|
||||
debug_log(" 3. 根據環境自動選擇 GUI 或 Web UI")
|
||||
debug_log(" 4. 提供回饋後繼續工作流程")
|
||||
|
||||
debug_log("\n✨ Web UI 新功能:")
|
||||
debug_log(" - 支援 SSH remote 開發環境")
|
||||
debug_log(" - 現代化深色主題界面")
|
||||
debug_log(" - WebSocket 即時通訊")
|
||||
debug_log(" - 自動瀏覽器啟動")
|
||||
debug_log(" - 命令執行和即時輸出")
|
||||
|
||||
debug_log("\n✅ 測試完成 - 系統已準備就緒!")
|
||||
debug_log(t('test.messages.allTestsComplete'))
|
||||
debug_log(t('test.messages.usageInstructions'))
|
||||
debug_log(t('test.messages.configureMcpServer'))
|
||||
debug_log(t('test.messages.aiAssistantAutoCall'))
|
||||
debug_log(t('test.messages.autoSelectGuiOrWebUi'))
|
||||
debug_log(t('test.messages.provideFeedbackContinue'))
|
||||
|
||||
debug_log(t('test.messages.webUiNewFeatures'))
|
||||
debug_log(t('test.messages.sshRemoteSupport'))
|
||||
debug_log(t('test.messages.modernDarkThemeInterface'))
|
||||
debug_log(t('test.messages.webSocketRealtime'))
|
||||
debug_log(t('test.messages.autoBrowserLaunch'))
|
||||
debug_log(t('test.messages.commandExecutionRealtime'))
|
||||
|
||||
debug_log(t('test.messages.testCompleteSystemReady'))
|
||||
if session_info:
|
||||
debug_log(f"💡 您可以現在就在瀏覽器中測試: {session_info['url']}")
|
||||
debug_log(" (服務器會繼續運行一小段時間)")
|
||||
debug_log(t('test.messages.canTestInBrowserNow', url=session_info['url']))
|
||||
debug_log(t('test.messages.serverWillContinueRunning'))
|
||||
time.sleep(10) # Keep running for a short time for immediate testing
|
||||
else:
|
||||
debug_log("❌ 部分測試失敗,請檢查錯誤信息")
|
||||
sys.exit(1)
|
||||
debug_log(t('test.messages.someTestsFailed'))
|
||||
sys.exit(1)
|
@ -1319,6 +1319,24 @@ class FeedbackApp {
|
||||
}
|
||||
|
||||
console.log('設定載入完成,應用設定...');
|
||||
|
||||
// 同步語言設定到 i18nManager(確保 ui_settings.json 優先於 localStorage)
|
||||
if (settings.language && window.i18nManager) {
|
||||
const currentI18nLanguage = window.i18nManager.getCurrentLanguage();
|
||||
console.log(`檢查語言設定: ui_settings.json=${settings.language}, i18nManager=${currentI18nLanguage}`);
|
||||
if (settings.language !== currentI18nLanguage) {
|
||||
console.log(`🔄 同步語言設定: ${currentI18nLanguage} -> ${settings.language}`);
|
||||
window.i18nManager.setLanguage(settings.language);
|
||||
// 同步到 localStorage,確保一致性
|
||||
localStorage.setItem('language', settings.language);
|
||||
console.log(`✅ 語言同步完成: ${settings.language}`);
|
||||
} else {
|
||||
console.log(`✅ 語言設定已同步: ${settings.language}`);
|
||||
}
|
||||
} else {
|
||||
console.log(`⚠️ 語言同步跳過: settings.language=${settings.language}, i18nManager=${!!window.i18nManager}`);
|
||||
}
|
||||
|
||||
this.applySettings();
|
||||
} else {
|
||||
console.log('沒有找到設定,使用預設值');
|
||||
@ -1380,6 +1398,15 @@ class FeedbackApp {
|
||||
autoCloseToggle.classList.toggle('active', this.autoClose);
|
||||
}
|
||||
|
||||
// 應用語言設定
|
||||
if (this.currentLanguage && window.i18nManager) {
|
||||
const currentI18nLanguage = window.i18nManager.getCurrentLanguage();
|
||||
if (this.currentLanguage !== currentI18nLanguage) {
|
||||
console.log(`應用語言設定: ${currentI18nLanguage} -> ${this.currentLanguage}`);
|
||||
window.i18nManager.setLanguage(this.currentLanguage);
|
||||
}
|
||||
}
|
||||
|
||||
// 應用圖片設定
|
||||
if (this.imageSizeLimitSelect) {
|
||||
this.imageSizeLimitSelect.value = this.imageSizeLimit.toString();
|
||||
@ -1612,7 +1639,13 @@ class FeedbackApp {
|
||||
window.i18nManager.setLanguage(lang);
|
||||
}
|
||||
|
||||
// 同步到 localStorage,確保一致性
|
||||
localStorage.setItem('language', lang);
|
||||
|
||||
// 保存到 ui_settings.json
|
||||
this.saveSettings();
|
||||
|
||||
console.log(`語言已切換到: ${lang}`);
|
||||
}
|
||||
|
||||
handleCombinedMode() {
|
||||
|
@ -18,17 +18,20 @@ class I18nManager {
|
||||
const savedLanguage = localStorage.getItem('language');
|
||||
if (savedLanguage) {
|
||||
this.currentLanguage = savedLanguage;
|
||||
console.log(`i18nManager 從 localStorage 載入語言: ${savedLanguage}`);
|
||||
} else {
|
||||
console.log(`i18nManager 使用默認語言: ${this.currentLanguage}`);
|
||||
}
|
||||
|
||||
// 載入翻譯數據
|
||||
await this.loadTranslations();
|
||||
|
||||
|
||||
// 應用翻譯
|
||||
this.applyTranslations();
|
||||
|
||||
|
||||
// 設置語言選擇器
|
||||
this.setupLanguageSelectors();
|
||||
|
||||
|
||||
// 延遲一點再更新動態內容,確保應用程式已初始化
|
||||
setTimeout(() => {
|
||||
this.updateDynamicContent();
|
||||
@ -119,11 +122,12 @@ class I18nManager {
|
||||
}
|
||||
|
||||
setLanguage(language) {
|
||||
console.log(`🔄 i18nManager.setLanguage() 被調用: ${this.currentLanguage} -> ${language}`);
|
||||
if (this.translations[language]) {
|
||||
this.currentLanguage = language;
|
||||
localStorage.setItem('language', language);
|
||||
this.applyTranslations();
|
||||
|
||||
|
||||
// 更新語言選擇器(只更新設定頁面的)
|
||||
const selector = document.getElementById('settingsLanguageSelect');
|
||||
if (selector) {
|
||||
@ -132,10 +136,10 @@ class I18nManager {
|
||||
|
||||
// 更新 HTML lang 屬性
|
||||
document.documentElement.lang = language;
|
||||
|
||||
console.log('語言已切換到:', language);
|
||||
|
||||
console.log(`✅ i18nManager 語言已切換到: ${language}`);
|
||||
} else {
|
||||
console.warn('不支援的語言:', language);
|
||||
console.warn(`❌ i18nManager 不支援的語言: ${language}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user