UNPKG

dynamic-interaction

Version:

Dynamic interaction 动态交互mcp,用于cursor、windsurf、trae 等 AI 智能编辑器 Agent 运行时交互使用

257 lines 8.21 kB
/** * 国际化服务 * 支持中英文切换,默认根据用户系统语言自动检测 */ // 中文语言数据 const zhCN = { title: "交互式反馈系统", status: { workspace: "工作区:", sessionId: "会话ID:", sessionTimer: "会话剩余时间:", connectionStatus: { connected: "已连接", disconnected: "未连接", highLatency: "延迟高", reconnecting: "正在重连..." }, messageStatus: { idle: "暂无新消息", sending: "正在发送...", waiting: "等待AI响应...", received: "已收到回复", timeout: "会话已超时" }, themeSwitch: "切换主题" }, summary: { title: "AI 工作摘要" }, feedback: { title: "提供反馈", submitButton: "提交反馈", textLabel: "文字反馈", textPlaceholder: "请在这里输入您的指示或回复...", hints: { title: "小提示:", shortcut: "按 Ctrl+Enter (或 Cmd+Enter) 可快速提交", pasteImage: "支持 Ctrl+V (或 Cmd+V) 粘贴图片" }, attachments: { title: "图片附件 (可选)", dropZoneText: "点击选择或拖拽图片到此处", supportedFormats: "支持 PNG, JPG, GIF, WebP 等格式" }, messages: { enterFeedback: "请输入反馈文本或添加图片", feedbackSent: "反馈已发送", sendFailed: "发送失败,请检查连接", checkConnection: "请检查连接", unsavedContent: "您有未发送的内容,确定要离开吗?", loadingWorkspace: "加载中...", loadingSession: "加载中...", unknownDirectory: "未知目录", unknown: "未知", timeout: "超时" } }, language: { switch: "切换语言", chinese: "中文", english: "English" } }; // 英文语言数据 const enUS = { title: "Interactive Feedback System", status: { workspace: "Workspace:", sessionId: "Session ID:", sessionTimer: "Session Time Remaining:", connectionStatus: { connected: "Connected", disconnected: "Disconnected", highLatency: "High Latency", reconnecting: "Reconnecting..." }, messageStatus: { idle: "No new messages", sending: "Sending...", waiting: "Waiting for AI response...", received: "Reply received", timeout: "Session timed out" }, themeSwitch: "Switch Theme" }, summary: { title: "AI Work Summary" }, feedback: { title: "Provide Feedback", submitButton: "Submit Feedback", textLabel: "Text Feedback", textPlaceholder: "Please enter your instructions or reply here...", hints: { title: "Tips:", shortcut: "Press Ctrl+Enter (or Cmd+Enter) for quick submit", pasteImage: "Support Ctrl+V (or Cmd+V) to paste images" }, attachments: { title: "Image Attachments (Optional)", dropZoneText: "Click to select or drag images here", supportedFormats: "Supports PNG, JPG, GIF, WebP and other formats" }, messages: { enterFeedback: "Please enter feedback text or add images", feedbackSent: "Feedback sent", sendFailed: "Send failed, please check connection", checkConnection: "Please check connection", unsavedContent: "You have unsaved content, are you sure you want to leave?", loadingWorkspace: "Loading...", loadingSession: "Loading...", unknownDirectory: "Unknown directory", unknown: "Unknown", timeout: "Timeout" } }, language: { switch: "Switch Language", chinese: "中文", english: "English" } }; class I18nService { currentLanguage = 'zh-CN'; languages = { 'zh-CN': zhCN, 'en-US': enUS }; listeners = []; constructor() { this.detectAndSetLanguage(); } /** * 检测用户系统语言并设置默认语言 */ detectAndSetLanguage() { // 优先读取 localStorage,其次读取 SSR 注入的默认语言,最后回退浏览器语言 const savedLanguage = localStorage.getItem('app-language'); const ssrDefault = window.__DEFAULT_LANG__; if (savedLanguage && this.languages[savedLanguage]) { // 本地已保存偏好 this.currentLanguage = savedLanguage; } else if (ssrDefault && (ssrDefault === 'zh' || ssrDefault === 'en')) { // 服务器注入首选 this.currentLanguage = ssrDefault === 'zh' ? 'zh-CN' : 'en-US'; } else { // 检测浏览器语言 const browserLanguage = navigator.language || navigator.languages?.[0] || 'en-US'; if (browserLanguage.startsWith('zh')) { this.currentLanguage = 'zh-CN'; } else { this.currentLanguage = 'en-US'; } } } /** * 获取当前语言代码 */ getCurrentLanguage() { return this.currentLanguage; } /** * 获取当前语言的所有文本数据 */ getLanguageData() { return this.languages[this.currentLanguage]; } /** * 获取指定路径的文本 */ t(path) { const data = this.getLanguageData(); const keys = path.split('.'); let result = data; for (const key of keys) { if (result && typeof result === 'object' && key in result) { result = result[key]; } else { console.warn(`I18n key not found: ${path}`); return path; } } return typeof result === 'string' ? result : path; } /** * 切换语言 */ switchLanguage(language) { if (!this.languages[language]) { console.warn(`Unsupported language: ${language}`); return; } this.currentLanguage = language; localStorage.setItem('app-language', language); // 更新 HTML lang 属性 document.documentElement.lang = language; // 通知所有监听器 this.notifyListeners(); } /** * 切换到下一个语言 */ toggleLanguage() { const languages = Object.keys(this.languages); const currentIndex = languages.indexOf(this.currentLanguage); const nextIndex = (currentIndex + 1) % languages.length; this.switchLanguage(languages[nextIndex]); } /** * 添加语言变化监听器 */ addLanguageChangeListener(listener) { this.listeners.push(listener); } /** * 移除语言变化监听器 */ removeLanguageChangeListener(listener) { const index = this.listeners.indexOf(listener); if (index > -1) { this.listeners.splice(index, 1); } } /** * 通知所有监听器语言已变化 */ notifyListeners() { const data = this.getLanguageData(); this.listeners.forEach(listener => { try { listener(this.currentLanguage, data); } catch (error) { console.error('Error in language change listener:', error); } }); } /** * 获取所有支持的语言列表 */ getSupportedLanguages() { return [ { code: 'zh-CN', name: this.languages['zh-CN'].language.chinese }, { code: 'en-US', name: this.languages['en-US'].language.english } ]; } } export const i18nService = new I18nService(); // 获取初始语言,供应用启动时使用 export function getInitialLang() { return i18nService.getCurrentLanguage(); } //# sourceMappingURL=i18n.js.map