新增 Web UI 語言設定同步功能,優化多語言支持,並更新相關日誌輸出。修正語言選擇器的應用邏輯,確保設定一致性,提升使用體驗。

This commit is contained in:
Minidoracat 2025-06-06 19:37:20 +08:00
parent 568e381e55
commit bb89de33fc
6 changed files with 557 additions and 130 deletions

View File

@ -202,6 +202,120 @@
}, },
"test": { "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!", "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}"
}
} }
} }

View File

@ -183,7 +183,121 @@
}, },
"test": { "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请测试这些功能并提供回馈", "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": { "about": {
"appInfo": "应用程序信息", "appInfo": "应用程序信息",

View File

@ -197,6 +197,120 @@
}, },
"test": { "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請測試這些功能並提供回饋", "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}"
}
} }
} }

View File

@ -27,6 +27,7 @@ import sys
import os import os
import socket import socket
import threading import threading
import json
from pathlib import Path from pathlib import Path
from typing import Dict, Any, Optional 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__), '..', '..')) sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..'))
from .debug import debug_log from .debug import debug_log
from .i18n import t from .i18n import t, get_i18n_manager
# 嘗試導入 Web UI 模組 # 嘗試導入 Web UI 模組
try: try:
@ -42,11 +43,52 @@ try:
from .web import WebUIManager, launch_web_feedback_ui, get_web_ui_manager from .web import WebUIManager, launch_web_feedback_ui, get_web_ui_manager
from .web.utils.browser import smart_browser_open, is_wsl_environment from .web.utils.browser import smart_browser_open, is_wsl_environment
WEB_UI_AVAILABLE = True WEB_UI_AVAILABLE = True
debug_log("✅ 使用新的 web 模組") debug_log(t('test.messages.webModuleLoaded'))
except ImportError as e: except ImportError as e:
debug_log(f"⚠️ 無法導入 Web UI 模組: {e}") debug_log(t('test.messages.webModuleLoadFailed', error=str(e)))
WEB_UI_AVAILABLE = False 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(): def get_test_summary():
"""獲取測試摘要,使用國際化系統""" """獲取測試摘要,使用國際化系統"""
return t('test.webUiSummary') return t('test.webUiSummary')
@ -61,46 +103,52 @@ def find_free_port():
def test_web_ui(keep_running=False): def test_web_ui(keep_running=False):
"""Test the Web UI functionality""" """Test the Web UI functionality"""
debug_log("🧪 測試 MCP Feedback Enhanced Web UI") debug_log(t('test.messages.testingWebUi'))
debug_log("=" * 50) 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 # Test import
try: try:
# 使用新的 web 模組 # 使用新的 web 模組
from .web import WebUIManager, launch_web_feedback_ui from .web import WebUIManager, launch_web_feedback_ui
debug_log("✅ Web UI 模組匯入成功") debug_log(t('test.messages.webUiModuleImportSuccess'))
except ImportError as e: except ImportError as e:
debug_log(f"❌ Web UI 模組匯入失敗: {e}") debug_log(t('test.messages.webUiModuleImportFailed', error=str(e)))
return False, None return False, None
# Find free port # Find free port
try: try:
free_port = find_free_port() free_port = find_free_port()
debug_log(f"🔍 找到可用端口: {free_port}") debug_log(t('test.messages.foundAvailablePort', port=free_port))
except Exception as e: except Exception as e:
debug_log(f"❌ 尋找可用端口失敗: {e}") debug_log(t('test.messages.findPortFailed', error=str(e)))
return False, None return False, None
# Test manager creation # Test manager creation
try: try:
manager = WebUIManager(port=free_port) manager = WebUIManager(port=free_port)
debug_log("✅ WebUIManager 創建成功") debug_log(t('test.messages.webUiManagerCreateSuccess'))
except Exception as e: except Exception as e:
debug_log(f"❌ WebUIManager 創建失敗: {e}") debug_log(t('test.messages.webUiManagerCreateFailed', error=str(e)))
return False, None return False, None
# Test server start (with timeout) # Test server start (with timeout)
server_started = False server_started = False
try: try:
debug_log("🚀 啟動 Web 服務器...") debug_log(t('test.messages.startingWebServer'))
def start_server(): def start_server():
try: try:
manager.start_server() manager.start_server()
return True return True
except Exception as e: except Exception as e:
debug_log(f"服務器啟動錯誤: {e}") debug_log(t('test.messages.serverStartError', error=str(e)))
return False return False
# Start server in thread # Start server in thread
@ -117,17 +165,17 @@ def test_web_ui(keep_running=False):
result = s.connect_ex((manager.host, manager.port)) result = s.connect_ex((manager.host, manager.port))
if result == 0: if result == 0:
server_started = True server_started = True
debug_log("✅ Web 服務器啟動成功") debug_log(t('test.messages.webServerStartSuccess'))
debug_log(f"🌐 服務器運行在: http://{manager.host}:{manager.port}") debug_log(t('test.messages.serverRunningAt', host=manager.host, port=manager.port))
else: else:
debug_log(f"❌ 無法連接到服務器端口 {manager.port}") debug_log(t('test.messages.cannotConnectToPort', port=manager.port))
except Exception as e: except Exception as e:
debug_log(f"❌ Web 服務器啟動失敗: {e}") debug_log(t('test.messages.webServerStartFailed', error=str(e)))
return False, None return False, None
if not server_started: if not server_started:
debug_log("❌ 服務器未能正常啟動") debug_log(t('test.messages.serverNotStarted'))
return False, None return False, None
# Test session creation # Test session creation
@ -142,41 +190,41 @@ def test_web_ui(keep_running=False):
'session_id': session_id, 'session_id': session_id,
'url': f"http://{manager.host}:{manager.port}" # 使用根路徑 'url': f"http://{manager.host}:{manager.port}" # 使用根路徑
} }
debug_log(f"✅ 測試會話創建成功 (ID: {session_id[:8]}...)") debug_log(t('test.messages.testSessionCreated', sessionId=session_id[:8]))
debug_log(f"🔗 測試 URL: {session_info['url']}") debug_log(t('test.messages.testUrl', url=session_info['url']))
# 測試瀏覽器啟動功能 # 測試瀏覽器啟動功能
try: try:
debug_log("🌐 測試瀏覽器啟動功能...") debug_log(t('test.messages.testingBrowserLaunch'))
if is_wsl_environment(): if is_wsl_environment():
debug_log("✅ 檢測到 WSL 環境,使用 WSL 專用瀏覽器啟動") debug_log(t('test.messages.wslEnvironmentDetected'))
else: else:
debug_log(" 非 WSL 環境,使用標準瀏覽器啟動") debug_log(t('test.messages.nonWslEnvironment'))
smart_browser_open(session_info['url']) 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: except Exception as browser_error:
debug_log(f"⚠️ 瀏覽器啟動失敗: {browser_error}") debug_log(t('test.messages.browserLaunchFailed', error=str(browser_error)))
debug_log("💡 這可能是正常的,請手動在瀏覽器中開啟上述 URL") debug_log(t('test.messages.browserLaunchNote'))
except Exception as e: except Exception as e:
debug_log(f"❌ 會話創建失敗: {e}") debug_log(t('test.messages.sessionCreationFailed', error=str(e)))
return False, None return False, None
debug_log("\n" + "=" * 50) debug_log("\n" + "=" * 50)
debug_log("🎉 所有測試通過Web UI 準備就緒") debug_log(t('test.messages.allTestsPassed'))
debug_log("📝 注意事項:") debug_log(t('test.messages.notes'))
debug_log(" - Web UI 會在 SSH remote 環境下自動啟用") debug_log(t('test.messages.webUiAutoEnabled'))
debug_log(" - 本地環境會繼續使用 Qt GUI") debug_log(t('test.messages.localEnvironmentGui'))
debug_log(" - 支援即時命令執行和 WebSocket 通訊") debug_log(t('test.messages.realtimeCommandSupport'))
debug_log(" - 提供現代化的深色主題界面") debug_log(t('test.messages.modernDarkTheme'))
debug_log(" - 支援智能 Ctrl+V 圖片貼上功能") debug_log(t('test.messages.smartCtrlVPaste'))
return True, session_info return True, session_info
def test_environment_detection(): def test_environment_detection():
"""Test environment detection logic""" """Test environment detection logic"""
debug_log("🔍 測試環境檢測功能") debug_log(t('test.messages.testingEnvironmentDetection'))
debug_log("-" * 30) debug_log("-" * 30)
try: try:
@ -186,84 +234,84 @@ def test_environment_detection():
remote_detected = is_remote_environment() remote_detected = is_remote_environment()
gui_available = can_use_gui() gui_available = can_use_gui()
debug_log(f"WSL 環境檢測: {'' if wsl_detected else ''}") debug_log(t('test.messages.wslDetection', result=t('test.messages.yes') if wsl_detected else t('test.messages.no')))
debug_log(f"遠端環境檢測: {'' if remote_detected else ''}") debug_log(t('test.messages.remoteDetection', result=t('test.messages.yes') if remote_detected else t('test.messages.no')))
debug_log(f"GUI 可用性: {'' if gui_available else ''}") debug_log(t('test.messages.guiAvailability', result=t('test.messages.yes') if gui_available else t('test.messages.no')))
if wsl_detected: if wsl_detected:
debug_log("✅ 檢測到 WSL 環境,將使用 Web UI 並支援 Windows 瀏覽器啟動") debug_log(t('test.messages.wslEnvironmentWebUi'))
elif remote_detected: elif remote_detected:
debug_log("✅ 將使用 Web UI (適合遠端開發環境)") debug_log(t('test.messages.remoteEnvironmentWebUi'))
else: else:
debug_log("✅ 將使用 Qt GUI (本地環境)") debug_log(t('test.messages.localEnvironmentQtGui'))
return True return True
except Exception as e: except Exception as e:
debug_log(f"❌ 環境檢測失敗: {e}") debug_log(t('test.messages.environmentDetectionFailed', error=str(e)))
return False return False
def test_mcp_integration(): def test_mcp_integration():
"""Test MCP server integration""" """Test MCP server integration"""
debug_log("\n🔧 測試 MCP 整合功能") debug_log(t('test.messages.testingMcpIntegration'))
debug_log("-" * 30) debug_log("-" * 30)
try: try:
from .server import interactive_feedback from .server import interactive_feedback
debug_log("✅ MCP 工具函數可用") debug_log(t('test.messages.mcpToolFunctionAvailable'))
# Test timeout parameter # Test timeout parameter
debug_log("✅ 支援 timeout 參數") debug_log(t('test.messages.timeoutParameterSupported'))
# Test environment-based Web UI selection # 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 # Test would require actual MCP call, so just verify import
debug_log("✅ 準備接受來自 AI 助手的調用") debug_log(t('test.messages.readyForAiAssistantCalls'))
return True return True
except Exception as e: except Exception as e:
debug_log(f"❌ MCP 整合測試失敗: {e}") debug_log(t('test.messages.mcpIntegrationTestFailed', error=str(e)))
return False return False
def test_new_parameters(): def test_new_parameters():
"""Test timeout parameter and environment variable support""" """Test timeout parameter and environment variable support"""
debug_log("\n🆕 測試參數功能") debug_log(t('test.messages.testingParameterFunctionality'))
debug_log("-" * 30) debug_log("-" * 30)
try: try:
from .server import interactive_feedback from .server import interactive_feedback
# 測試參數是否存在 # 測試參數是否存在
import inspect import inspect
sig = inspect.signature(interactive_feedback) sig = inspect.signature(interactive_feedback)
# 檢查 timeout 參數 # 檢查 timeout 參數
if 'timeout' in sig.parameters: if 'timeout' in sig.parameters:
timeout_param = sig.parameters['timeout'] timeout_param = sig.parameters['timeout']
debug_log(f"✅ timeout 參數存在,預設值: {timeout_param.default}") debug_log(t('test.messages.timeoutParameterExists', default=timeout_param.default))
else: else:
debug_log("❌ timeout 參數不存在") debug_log(t('test.messages.timeoutParameterMissing'))
return False return False
# 檢查環境變數支援 # 檢查環境變數支援
import os import os
current_force_web = os.getenv("FORCE_WEB") current_force_web = os.getenv("FORCE_WEB")
if current_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: else:
debug_log(" FORCE_WEB 環境變數未設定(將使用預設邏輯)") debug_log(t('test.messages.forceWebNotSet'))
debug_log("✅ 參數功能正常") debug_log(t('test.messages.parameterFunctionalityNormal'))
return True return True
except Exception as e: except Exception as e:
debug_log(f"❌ 參數測試失敗: {e}") debug_log(t('test.messages.parameterTestFailed', error=str(e)))
return False return False
def test_environment_web_ui_mode(): def test_environment_web_ui_mode():
"""Test environment-based Web UI mode""" """Test environment-based Web UI mode"""
debug_log("\n🌐 測試環境變數控制 Web UI 模式") debug_log(t('test.messages.testingEnvironmentWebUiMode'))
debug_log("-" * 30) debug_log("-" * 30)
try: try:
@ -276,62 +324,62 @@ def test_environment_web_ui_mode():
gui_available = can_use_gui() gui_available = can_use_gui()
force_web_env = os.getenv("FORCE_WEB", "").lower() force_web_env = os.getenv("FORCE_WEB", "").lower()
debug_log(f"當前環境 - WSL: {is_wsl}, 遠端: {is_remote}, GUI 可用: {gui_available}") debug_log(t('test.messages.currentEnvironment', wsl=is_wsl, remote=is_remote, gui=gui_available))
debug_log(f"FORCE_WEB 環境變數: {force_web_env or '未設定'}") debug_log(t('test.messages.forceWebVariable', value=force_web_env or t('test.messages.notSet')))
if force_web_env in ("true", "1", "yes", "on"): if force_web_env in ("true", "1", "yes", "on"):
debug_log("✅ FORCE_WEB 已啟用,將強制使用 Web UI") debug_log(t('test.messages.forceWebEnabled'))
elif is_wsl: elif is_wsl:
debug_log("✅ WSL 環境,將使用 Web UI 並支援 Windows 瀏覽器啟動") debug_log(t('test.messages.wslEnvironmentWebUiBrowser'))
elif not is_remote and gui_available: elif not is_remote and gui_available:
debug_log(" 本地 GUI 環境,將使用 Qt GUI") debug_log(t('test.messages.localGuiEnvironmentQtGui'))
debug_log("💡 可設定 FORCE_WEB=true 強制使用 Web UI 進行測試") debug_log(t('test.messages.forceWebTestHint'))
else: else:
debug_log(" 將自動使用 Web UI遠端環境或 GUI 不可用)") debug_log(t('test.messages.autoWebUiRemoteOrNoGui'))
return True return True
except Exception as e: except Exception as e:
debug_log(f"❌ 環境變數測試失敗: {e}") debug_log(t('test.messages.environmentVariableTestFailed', error=str(e)))
return False return False
def interactive_demo(session_info): def interactive_demo(session_info):
"""Run interactive demo with the Web UI""" """Run interactive demo with the Web UI"""
debug_log(f"\n🌐 Web UI 互動測試模式") debug_log(t('test.messages.webUiInteractiveTestMode'))
debug_log("=" * 50) debug_log("=" * 50)
debug_log(f"服務器地址: {session_info['url']}") # 簡化輸出,只顯示服務器地址 debug_log(t('test.messages.serverAddress', url=session_info['url'])) # 簡化輸出,只顯示服務器地址
debug_log("\n📖 操作指南:") debug_log(t('test.messages.operationGuide'))
debug_log(" 1. 在瀏覽器中開啟上面的服務器地址") debug_log(t('test.messages.openServerInBrowser'))
debug_log(" 2. 嘗試以下功能:") debug_log(t('test.messages.tryFollowingFeatures'))
debug_log(" - 點擊 '顯示命令區塊' 按鈕") debug_log(t('test.messages.clickShowCommandBlock'))
debug_log(" - 輸入命令如 'echo Hello World' 並執行") debug_log(t('test.messages.inputCommandAndExecute'))
debug_log(" - 在回饋區域輸入文字") debug_log(t('test.messages.inputTextInFeedbackArea'))
debug_log(" - 使用 Ctrl+Enter 提交回饋") debug_log(t('test.messages.useCtrlEnterSubmit'))
debug_log(" 3. 測試 WebSocket 即時通訊功能") debug_log(t('test.messages.testWebSocketRealtime'))
debug_log(" 4. 測試頁面持久性(提交反饋後頁面不關閉)") debug_log(t('test.messages.testPagePersistence'))
debug_log("\n⌨️ 控制選項:") debug_log(t('test.messages.controlOptions'))
debug_log(" - 按 Enter 繼續運行") debug_log(t('test.messages.pressEnterContinue'))
debug_log(" - 輸入 'q''quit' 停止服務器") debug_log(t('test.messages.inputQuitToStop'))
while True: while True:
try: try:
user_input = input("\n>>> ").strip().lower() user_input = input("\n>>> ").strip().lower()
if user_input in ['q', 'quit', 'exit']: if user_input in ['q', 'quit', 'exit']:
debug_log("🛑 停止服務器...") debug_log(t('test.messages.stoppingServer'))
break break
elif user_input == '': elif user_input == '':
debug_log(f"🔄 服務器持續運行在: {session_info['url']}") debug_log(t('test.messages.serverContinuesRunning', url=session_info['url']))
debug_log(" 瀏覽器應該仍可正常訪問") debug_log(t('test.messages.browserShouldStillAccess'))
else: else:
debug_log("❓ 未知命令。按 Enter 繼續運行,或輸入 'q' 退出") debug_log(t('test.messages.unknownCommand'))
except KeyboardInterrupt: except KeyboardInterrupt:
debug_log("\n🛑 收到中斷信號,停止服務器...") debug_log(t('test.messages.interruptSignalReceived'))
break break
debug_log("✅ Web UI 測試完成") debug_log(t('test.messages.webUiTestComplete'))
if __name__ == "__main__": if __name__ == "__main__":
debug_log("MCP Feedback Enhanced - Web UI 測試") debug_log(t('test.messages.webUiTest'))
debug_log("=" * 60) debug_log("=" * 60)
# Test environment detection # Test environment detection
@ -351,25 +399,25 @@ if __name__ == "__main__":
debug_log("\n" + "=" * 60) debug_log("\n" + "=" * 60)
if env_test and params_test and env_web_test and mcp_test and web_test: if env_test and params_test and env_web_test and mcp_test and web_test:
debug_log("🎊 所有測試完成!準備使用 MCP Feedback Enhanced") debug_log(t('test.messages.allTestsComplete'))
debug_log("\n📖 使用方法:") debug_log(t('test.messages.usageInstructions'))
debug_log(" 1. 在 Cursor/Cline 中配置此 MCP 服務器") debug_log(t('test.messages.configureMcpServer'))
debug_log(" 2. AI 助手會自動調用 interactive_feedback 工具") debug_log(t('test.messages.aiAssistantAutoCall'))
debug_log(" 3. 根據環境自動選擇 GUI 或 Web UI") debug_log(t('test.messages.autoSelectGuiOrWebUi'))
debug_log(" 4. 提供回饋後繼續工作流程") debug_log(t('test.messages.provideFeedbackContinue'))
debug_log("\n✨ Web UI 新功能:") debug_log(t('test.messages.webUiNewFeatures'))
debug_log(" - 支援 SSH remote 開發環境") debug_log(t('test.messages.sshRemoteSupport'))
debug_log(" - 現代化深色主題界面") debug_log(t('test.messages.modernDarkThemeInterface'))
debug_log(" - WebSocket 即時通訊") debug_log(t('test.messages.webSocketRealtime'))
debug_log(" - 自動瀏覽器啟動") debug_log(t('test.messages.autoBrowserLaunch'))
debug_log(" - 命令執行和即時輸出") debug_log(t('test.messages.commandExecutionRealtime'))
debug_log("\n✅ 測試完成 - 系統已準備就緒!") debug_log(t('test.messages.testCompleteSystemReady'))
if session_info: if session_info:
debug_log(f"💡 您可以現在就在瀏覽器中測試: {session_info['url']}") debug_log(t('test.messages.canTestInBrowserNow', url=session_info['url']))
debug_log(" (服務器會繼續運行一小段時間)") debug_log(t('test.messages.serverWillContinueRunning'))
time.sleep(10) # Keep running for a short time for immediate testing time.sleep(10) # Keep running for a short time for immediate testing
else: else:
debug_log("❌ 部分測試失敗,請檢查錯誤信息") debug_log(t('test.messages.someTestsFailed'))
sys.exit(1) sys.exit(1)

View File

@ -1319,6 +1319,24 @@ class FeedbackApp {
} }
console.log('設定載入完成,應用設定...'); 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(); this.applySettings();
} else { } else {
console.log('沒有找到設定,使用預設值'); console.log('沒有找到設定,使用預設值');
@ -1380,6 +1398,15 @@ class FeedbackApp {
autoCloseToggle.classList.toggle('active', this.autoClose); 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) { if (this.imageSizeLimitSelect) {
this.imageSizeLimitSelect.value = this.imageSizeLimit.toString(); this.imageSizeLimitSelect.value = this.imageSizeLimit.toString();
@ -1612,7 +1639,13 @@ class FeedbackApp {
window.i18nManager.setLanguage(lang); window.i18nManager.setLanguage(lang);
} }
// 同步到 localStorage確保一致性
localStorage.setItem('language', lang);
// 保存到 ui_settings.json
this.saveSettings(); this.saveSettings();
console.log(`語言已切換到: ${lang}`);
} }
handleCombinedMode() { handleCombinedMode() {

View File

@ -18,17 +18,20 @@ class I18nManager {
const savedLanguage = localStorage.getItem('language'); const savedLanguage = localStorage.getItem('language');
if (savedLanguage) { if (savedLanguage) {
this.currentLanguage = savedLanguage; this.currentLanguage = savedLanguage;
console.log(`i18nManager 從 localStorage 載入語言: ${savedLanguage}`);
} else {
console.log(`i18nManager 使用默認語言: ${this.currentLanguage}`);
} }
// 載入翻譯數據 // 載入翻譯數據
await this.loadTranslations(); await this.loadTranslations();
// 應用翻譯 // 應用翻譯
this.applyTranslations(); this.applyTranslations();
// 設置語言選擇器 // 設置語言選擇器
this.setupLanguageSelectors(); this.setupLanguageSelectors();
// 延遲一點再更新動態內容,確保應用程式已初始化 // 延遲一點再更新動態內容,確保應用程式已初始化
setTimeout(() => { setTimeout(() => {
this.updateDynamicContent(); this.updateDynamicContent();
@ -119,11 +122,12 @@ class I18nManager {
} }
setLanguage(language) { setLanguage(language) {
console.log(`🔄 i18nManager.setLanguage() 被調用: ${this.currentLanguage} -> ${language}`);
if (this.translations[language]) { if (this.translations[language]) {
this.currentLanguage = language; this.currentLanguage = language;
localStorage.setItem('language', language); localStorage.setItem('language', language);
this.applyTranslations(); this.applyTranslations();
// 更新語言選擇器(只更新設定頁面的) // 更新語言選擇器(只更新設定頁面的)
const selector = document.getElementById('settingsLanguageSelect'); const selector = document.getElementById('settingsLanguageSelect');
if (selector) { if (selector) {
@ -132,10 +136,10 @@ class I18nManager {
// 更新 HTML lang 屬性 // 更新 HTML lang 屬性
document.documentElement.lang = language; document.documentElement.lang = language;
console.log('語言已切換到:', language); console.log(`✅ i18nManager 語言已切換到: ${language}`);
} else { } else {
console.warn('不支援的語言:', language); console.warn(`❌ i18nManager 不支援的語言: ${language}`);
} }
} }