1 line
19 KiB
JSON
1 line
19 KiB
JSON
{"repo": "89988998lmy-cell/sensen", "files": {"script.js": {"b348511646595f44a07e295ce894882a697d2b3a": {"t": 1785746676.6311977, "n": 8168, "h": "bf8da8e2096cbf7f", "c": "// DeepSeek API配置\r\nconst API_CONFIG = {\r\n base_url: 'https://api.deepseek.com',\r\n model: 'deepseek-chat'\r\n};\r\n\r\n// DOM元素\r\nconst elements = {\r\n sourceLang: document.getElementById('sourceLang'),\r\n targetLang: document.getElementById('targetLang'),\r\n swapBtn: document.getElementById('swapBtn'),\r\n inputText: document.getElementById('inputText'),\r\n outputText: document.getElementById('outputText'),\r\n translateBtn: document.getElementById('translateBtn'),\r\n clearBtn: document.getElementById('clearBtn'),\r\n copyBtn: document.getElementById('copyBtn'),\r\n voiceBtn: document.getElementById('voiceBtn')\r\n};\r\n\r\n// 语音识别相关变量\r\nlet recognition = null;\r\nlet isRecording = false;\r\n\r\n// 语言映射 - 一带一路主要20国语言\r\nconst LANGUAGE_MAP = {\r\n zh: '中文',\r\n en: '英语',\r\n ru: '俄语',\r\n ar: '阿拉伯语',\r\n fr: '法语',\r\n es: '西班牙语',\r\n pt: '葡萄牙语',\r\n de: '德语',\r\n ja: '日语',\r\n ko: '韩语',\r\n tr: '土耳其语',\r\n it: '意大利语',\r\n id: '印尼语',\r\n hi: '印地语',\r\n bn: '孟加拉语',\r\n ur: '乌尔都语',\r\n th: '泰语',\r\n vi: '越南语',\r\n ms: '马来语',\r\n fa: '波斯语'\r\n};\r\n\r\n// 初始化\r\nfunction init() {\r\n // 设置默认语言(中文→日语)\r\n elements.sourceLang.value = 'zh';\r\n elements.targetLang.value = 'ja';\r\n \r\n // 绑定事件监听\r\n bindEvents();\r\n \r\n // 检查本地存储的API密钥\r\n checkApiKey();\r\n}\r\n\r\n// 绑定事件监听\r\nfunction bindEvents() {\r\n elements.swapBtn.addEventListener('click', swapLanguages);\r\n elements.translateBtn.addEventListener('click', translate);\r\n elements.clearBtn.addEventListener('click', clearInput);\r\n elements.copyBtn.addEventListener('click', copyOutput);\r\n elements.inputText.addEventListener('keydown', handleKeyDown);\r\n elements.voiceBtn.addEventListener('click', toggleVoiceRecognition);\r\n}\r\n\r\n// 初始化语音识别\r\nfunction initVoiceRecognition() {\r\n if ('webkitSpeechRecognition' in window || 'SpeechRecognition' in window) {\r\n const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;\r\n recognition = new SpeechRecognition();\r\n \r\n // 配置语音识别\r\n recognition.continuous = true;\r\n recognition.interimResults = true;\r\n recognition.maxAlternatives = 1;\r\n \r\n // 语音识别结果事件\r\n recognition.onresult = (event) => {\r\n let transcript = '';\r\n for (let i = event.resultIndex; i < event.results.length; i++) {\r\n transcript += event.results[i][0].transcript;\r\n }\r\n elements.inputText.value = transcript;\r\n };\r\n \r\n // 语音识别结束事件\r\n recognition.onend = () => {\r\n isRecording = false;\r\n elements.voiceBtn.classList.remove('recording');\r\n elements.voiceBtn.textContent = '🎤';\r\n };\r\n \r\n // 语音识别错误事件\r\n recognition.onerror = (event) => {\r\n console.error('语音识别错误:', event.error);\r\n isRecording = false;\r\n elements.voiceBtn.classList.remove('recording');\r\n elements.voiceBtn.textContent = '🎤';\r\n };\r\n } else {\r\n alert('您的浏览器不支持语音识别功能,请使用Chrome或Edge浏览器。');\r\n }\r\n}\r\n\r\n// 切换语音识别状态\r\nfunction toggleVoiceRecognition() {\r\n if (!recognition) {\r\n initVoiceRecognition();\r\n }\r\n \r\n if (isRecording) {\r\n stopVoiceRecognition();\r\n } else {\r\n startVoiceRecognition();\r\n }\r\n}\r\n\r\n// 开始语音识别\r\nfunction startVoiceRecognition() {\r\n // 设置语音识别语言\r\n const langMap = {\r\n zh: 'zh-CN',\r\n en: 'en-US',\r\n ru: 'ru-RU',\r\n ar: 'ar-SA',\r\n fr: 'fr-FR',\r\n es: 'es-ES',\r\n pt: 'pt-BR',\r\n de: 'de-DE',\r\n ja: 'ja-JP',\r\n ko: 'ko-KR',\r\n tr: 'tr-TR',\r\n it: 'it-IT',\r\n id: 'id-ID',\r\n hi: 'hi-IN',\r\n bn: 'bn-IN',\r\n ur: 'ur-PK',\r\n th: 'th-TH',\r\n vi: 'vi-VN',\r\n ms: 'ms-MY',\r\n fa: 'fa-IR'\r\n };\r\n \r\n recognition.lang = langMap[elements.sourceLang.value] || 'zh-CN';\r\n recognition.start();\r\n isRecording = true;\r\n elements.voiceBtn.classList.add('recording');\r\n elements.voiceBtn.textContent = '⏹️';\r\n}\r\n\r\n// 停止语音识别\r\nfunction stopVoiceRecognition() {\r\n recognition.stop();\r\n isRecording = false;\r\n elements.voiceBtn.classList.remove('recording');\r\n elements.voiceBtn.textContent = '🎤';\r\n}\r\n\r\n// 检查API密钥\r\nfunction checkApiKey() {\r\n const apiKey = localStorage.getItem('deepseekApiKey');\r\n if (!apiKey) {\r\n const userApiKey = prompt('请输入您的DeepSeek API密钥:');\r\n if (userApiKey) {\r\n localStorage.setItem('deepseekApiKey', userApiKey);\r\n } else {\r\n alert('API密钥是必需的,请稍后再试。');\r\n }\r\n }\r\n}\r\n\r\n// 交换语言\r\nfunction swapLanguages() {\r\n const temp = elements.sourceLang.value;\r\n elements.sourceLang.value = elements.targetLang.value;\r\n elements.targetLang.value = temp;\r\n \r\n // 如果有输入和输出,也交换它们\r\n if (elements.outputText.textContent) {\r\n const tempText = elements.inputText.value;\r\n elements.inputText.value = elements.outputText.textContent;\r\n elements.outputText.textContent = '';\r\n }\r\n}\r\n\r\n// 翻译函数\r\nasync function translate() {\r\n const input = elements.inputText.value.trim();\r\n if (!input) {\r\n alert('请输入要翻译的文本。');\r\n return;\r\n }\r\n \r\n const apiKey = localStorage.getItem('deepseekApiKey');\r\n if (!apiKey) {\r\n checkApiKey();\r\n return;\r\n }\r\n \r\n const sourceLang = elements.sourceLang.value;\r\n const targetLang = elements.targetLang.value;\r\n \r\n if (sourceLang === targetLang) {\r\n elements.outputText.textContent = input;\r\n return;\r\n }\r\n \r\n // 显示加载状态\r\n showLoading(true);\r\n \r\n try {\r\n const response = await fetch(`${API_CONFIG.base_url}/chat/completions`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${apiKey}`\r\n },\r\n body: JSON.stringify({\r\n model: API_CONFIG.model,\r\n messages: [\r\n {\r\n role: 'system',\r\n content: `你是一个专业的翻译助手,请将${LANGUAGE_MAP[sourceLang]}翻译成${LANGUAGE_MAP[targetLang]},保持原意准确,语言流畅自然。不要添加任何解释或额外内容。`\r\n },\r\n {\r\n role: 'user',\r\n content: input\r\n }\r\n ],\r\n stream: false,\r\n temperature: 0.7\r\n })\r\n });\r\n \r\n if (!response.ok) {\r\n throw new Error(`API请求失败: ${response.status}`);\r\n }\r\n \r\n const data = await response.json();\r\n \r\n if (data.choices && data.choices.length > 0) {\r\n elements.outputText.textContent = data.choices[0].message.content;\r\n } else {\r\n throw new Error('API返回格式不正确');\r\n }\r\n } catch (error) {\r\n console.error('翻译错误:', error);\r\n alert(`翻译失败: ${error.message}\\n请检查API密钥是否正确,或稍后再试。`);\r\n } finally {\r\n showLoading(false);\r\n }\r\n}\r\n\r\n// 显示/隐藏加载状态\r\nfunction showLoading(show) {\r\n if (show) {\r\n elements.translateBtn.disabled = true;\r\n elements.translateBtn.innerHTML = '<span class=\"loading\"></span> 翻译中...';\r\n } else {\r\n elements.translateBtn.disabled = false;\r\n elements.translateBtn.textContent = '翻译';\r\n }\r\n}\r\n\r\n// 清空输入\r\nfunction clearInput() {\r\n elements.inputText.value = '';\r\n elements.outputText.textContent = '';\r\n elements.inputText.focus();\r\n}\r\n\r\n// 复制输出结果\r\nfunction copyOutput() {\r\n const output = elements.outputText.textContent;\r\n if (!output) {\r\n alert('没有可复制的内容。');\r\n return;\r\n }\r\n \r\n navigator.clipboard.writeText(output)\r\n .then(() => {\r\n alert('翻译结果已复制到剪贴板!');\r\n })\r\n .catch(err => {\r\n console.error('复制失败:', err);\r\n alert('复制失败,请手动复制。');\r\n });\r\n}\r\n\r\n// 键盘快捷键处理\r\nfunction handleKeyDown(e) {\r\n // Ctrl/Cmd + Enter 触发翻译\r\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\r\n e.preventDefault();\r\n translate();\r\n }\r\n}\r\n\r\n// 初始化应用\r\ndocument.addEventListener('DOMContentLoaded', init);"}, "fa56110b7bc5f39945daa382b835831007469e88": {"t": 1785766755.3163369, "n": 8168, "h": "bf8da8e2096cbf7f", "c": "// DeepSeek API配置\r\nconst API_CONFIG = {\r\n base_url: 'https://api.deepseek.com',\r\n model: 'deepseek-chat'\r\n};\r\n\r\n// DOM元素\r\nconst elements = {\r\n sourceLang: document.getElementById('sourceLang'),\r\n targetLang: document.getElementById('targetLang'),\r\n swapBtn: document.getElementById('swapBtn'),\r\n inputText: document.getElementById('inputText'),\r\n outputText: document.getElementById('outputText'),\r\n translateBtn: document.getElementById('translateBtn'),\r\n clearBtn: document.getElementById('clearBtn'),\r\n copyBtn: document.getElementById('copyBtn'),\r\n voiceBtn: document.getElementById('voiceBtn')\r\n};\r\n\r\n// 语音识别相关变量\r\nlet recognition = null;\r\nlet isRecording = false;\r\n\r\n// 语言映射 - 一带一路主要20国语言\r\nconst LANGUAGE_MAP = {\r\n zh: '中文',\r\n en: '英语',\r\n ru: '俄语',\r\n ar: '阿拉伯语',\r\n fr: '法语',\r\n es: '西班牙语',\r\n pt: '葡萄牙语',\r\n de: '德语',\r\n ja: '日语',\r\n ko: '韩语',\r\n tr: '土耳其语',\r\n it: '意大利语',\r\n id: '印尼语',\r\n hi: '印地语',\r\n bn: '孟加拉语',\r\n ur: '乌尔都语',\r\n th: '泰语',\r\n vi: '越南语',\r\n ms: '马来语',\r\n fa: '波斯语'\r\n};\r\n\r\n// 初始化\r\nfunction init() {\r\n // 设置默认语言(中文→日语)\r\n elements.sourceLang.value = 'zh';\r\n elements.targetLang.value = 'ja';\r\n \r\n // 绑定事件监听\r\n bindEvents();\r\n \r\n // 检查本地存储的API密钥\r\n checkApiKey();\r\n}\r\n\r\n// 绑定事件监听\r\nfunction bindEvents() {\r\n elements.swapBtn.addEventListener('click', swapLanguages);\r\n elements.translateBtn.addEventListener('click', translate);\r\n elements.clearBtn.addEventListener('click', clearInput);\r\n elements.copyBtn.addEventListener('click', copyOutput);\r\n elements.inputText.addEventListener('keydown', handleKeyDown);\r\n elements.voiceBtn.addEventListener('click', toggleVoiceRecognition);\r\n}\r\n\r\n// 初始化语音识别\r\nfunction initVoiceRecognition() {\r\n if ('webkitSpeechRecognition' in window || 'SpeechRecognition' in window) {\r\n const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;\r\n recognition = new SpeechRecognition();\r\n \r\n // 配置语音识别\r\n recognition.continuous = true;\r\n recognition.interimResults = true;\r\n recognition.maxAlternatives = 1;\r\n \r\n // 语音识别结果事件\r\n recognition.onresult = (event) => {\r\n let transcript = '';\r\n for (let i = event.resultIndex; i < event.results.length; i++) {\r\n transcript += event.results[i][0].transcript;\r\n }\r\n elements.inputText.value = transcript;\r\n };\r\n \r\n // 语音识别结束事件\r\n recognition.onend = () => {\r\n isRecording = false;\r\n elements.voiceBtn.classList.remove('recording');\r\n elements.voiceBtn.textContent = '🎤';\r\n };\r\n \r\n // 语音识别错误事件\r\n recognition.onerror = (event) => {\r\n console.error('语音识别错误:', event.error);\r\n isRecording = false;\r\n elements.voiceBtn.classList.remove('recording');\r\n elements.voiceBtn.textContent = '🎤';\r\n };\r\n } else {\r\n alert('您的浏览器不支持语音识别功能,请使用Chrome或Edge浏览器。');\r\n }\r\n}\r\n\r\n// 切换语音识别状态\r\nfunction toggleVoiceRecognition() {\r\n if (!recognition) {\r\n initVoiceRecognition();\r\n }\r\n \r\n if (isRecording) {\r\n stopVoiceRecognition();\r\n } else {\r\n startVoiceRecognition();\r\n }\r\n}\r\n\r\n// 开始语音识别\r\nfunction startVoiceRecognition() {\r\n // 设置语音识别语言\r\n const langMap = {\r\n zh: 'zh-CN',\r\n en: 'en-US',\r\n ru: 'ru-RU',\r\n ar: 'ar-SA',\r\n fr: 'fr-FR',\r\n es: 'es-ES',\r\n pt: 'pt-BR',\r\n de: 'de-DE',\r\n ja: 'ja-JP',\r\n ko: 'ko-KR',\r\n tr: 'tr-TR',\r\n it: 'it-IT',\r\n id: 'id-ID',\r\n hi: 'hi-IN',\r\n bn: 'bn-IN',\r\n ur: 'ur-PK',\r\n th: 'th-TH',\r\n vi: 'vi-VN',\r\n ms: 'ms-MY',\r\n fa: 'fa-IR'\r\n };\r\n \r\n recognition.lang = langMap[elements.sourceLang.value] || 'zh-CN';\r\n recognition.start();\r\n isRecording = true;\r\n elements.voiceBtn.classList.add('recording');\r\n elements.voiceBtn.textContent = '⏹️';\r\n}\r\n\r\n// 停止语音识别\r\nfunction stopVoiceRecognition() {\r\n recognition.stop();\r\n isRecording = false;\r\n elements.voiceBtn.classList.remove('recording');\r\n elements.voiceBtn.textContent = '🎤';\r\n}\r\n\r\n// 检查API密钥\r\nfunction checkApiKey() {\r\n const apiKey = localStorage.getItem('deepseekApiKey');\r\n if (!apiKey) {\r\n const userApiKey = prompt('请输入您的DeepSeek API密钥:');\r\n if (userApiKey) {\r\n localStorage.setItem('deepseekApiKey', userApiKey);\r\n } else {\r\n alert('API密钥是必需的,请稍后再试。');\r\n }\r\n }\r\n}\r\n\r\n// 交换语言\r\nfunction swapLanguages() {\r\n const temp = elements.sourceLang.value;\r\n elements.sourceLang.value = elements.targetLang.value;\r\n elements.targetLang.value = temp;\r\n \r\n // 如果有输入和输出,也交换它们\r\n if (elements.outputText.textContent) {\r\n const tempText = elements.inputText.value;\r\n elements.inputText.value = elements.outputText.textContent;\r\n elements.outputText.textContent = '';\r\n }\r\n}\r\n\r\n// 翻译函数\r\nasync function translate() {\r\n const input = elements.inputText.value.trim();\r\n if (!input) {\r\n alert('请输入要翻译的文本。');\r\n return;\r\n }\r\n \r\n const apiKey = localStorage.getItem('deepseekApiKey');\r\n if (!apiKey) {\r\n checkApiKey();\r\n return;\r\n }\r\n \r\n const sourceLang = elements.sourceLang.value;\r\n const targetLang = elements.targetLang.value;\r\n \r\n if (sourceLang === targetLang) {\r\n elements.outputText.textContent = input;\r\n return;\r\n }\r\n \r\n // 显示加载状态\r\n showLoading(true);\r\n \r\n try {\r\n const response = await fetch(`${API_CONFIG.base_url}/chat/completions`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${apiKey}`\r\n },\r\n body: JSON.stringify({\r\n model: API_CONFIG.model,\r\n messages: [\r\n {\r\n role: 'system',\r\n content: `你是一个专业的翻译助手,请将${LANGUAGE_MAP[sourceLang]}翻译成${LANGUAGE_MAP[targetLang]},保持原意准确,语言流畅自然。不要添加任何解释或额外内容。`\r\n },\r\n {\r\n role: 'user',\r\n content: input\r\n }\r\n ],\r\n stream: false,\r\n temperature: 0.7\r\n })\r\n });\r\n \r\n if (!response.ok) {\r\n throw new Error(`API请求失败: ${response.status}`);\r\n }\r\n \r\n const data = await response.json();\r\n \r\n if (data.choices && data.choices.length > 0) {\r\n elements.outputText.textContent = data.choices[0].message.content;\r\n } else {\r\n throw new Error('API返回格式不正确');\r\n }\r\n } catch (error) {\r\n console.error('翻译错误:', error);\r\n alert(`翻译失败: ${error.message}\\n请检查API密钥是否正确,或稍后再试。`);\r\n } finally {\r\n showLoading(false);\r\n }\r\n}\r\n\r\n// 显示/隐藏加载状态\r\nfunction showLoading(show) {\r\n if (show) {\r\n elements.translateBtn.disabled = true;\r\n elements.translateBtn.innerHTML = '<span class=\"loading\"></span> 翻译中...';\r\n } else {\r\n elements.translateBtn.disabled = false;\r\n elements.translateBtn.textContent = '翻译';\r\n }\r\n}\r\n\r\n// 清空输入\r\nfunction clearInput() {\r\n elements.inputText.value = '';\r\n elements.outputText.textContent = '';\r\n elements.inputText.focus();\r\n}\r\n\r\n// 复制输出结果\r\nfunction copyOutput() {\r\n const output = elements.outputText.textContent;\r\n if (!output) {\r\n alert('没有可复制的内容。');\r\n return;\r\n }\r\n \r\n navigator.clipboard.writeText(output)\r\n .then(() => {\r\n alert('翻译结果已复制到剪贴板!');\r\n })\r\n .catch(err => {\r\n console.error('复制失败:', err);\r\n alert('复制失败,请手动复制。');\r\n });\r\n}\r\n\r\n// 键盘快捷键处理\r\nfunction handleKeyDown(e) {\r\n // Ctrl/Cmd + Enter 触发翻译\r\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\r\n e.preventDefault();\r\n translate();\r\n }\r\n}\r\n\r\n// 初始化应用\r\ndocument.addEventListener('DOMContentLoaded', init);"}}}} |