新增 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": {
"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": {
"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": "应用程序信息",

View File

@ -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}"
}
}
}

View File

@ -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)

View File

@ -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() {

View File

@ -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}`);
}
}