// ==UserScript==
// @name 划词翻译(谷歌有道)
// @namespace http://tampermonkey.net/
// @version 6.4
// @description 支持在移动端设备上单击自动翻译功能,点击文本后自动显示翻译结果、音标、例句、释义并朗读文本,点击页面隐藏翻译框
// @author YourName
// @match *://*/*
// @grant none
// @downloadURL none
// ==/UserScript==
(function () {
'use strict';
// 创建翻译结果的显示框
const translationBox = document.createElement('div');
translationBox.style.position = 'absolute';
translationBox.style.backgroundColor = '#e6ffe6';
translationBox.style.border = '1px solid #ccc';
translationBox.style.padding = '10px';
translationBox.style.zIndex = '1000';
translationBox.style.display = 'none';
translationBox.style.boxSizing = 'border-box';
translationBox.style.fontSize = '14px';
translationBox.style.boxShadow = '0 4px 8px rgba(0, 0, 0, 0.1)';
translationBox.style.borderRadius = '8px';
translationBox.style.width = '100%';
translationBox.style.left = '0';
document.body.appendChild(translationBox);
document.addEventListener('click', (event) => {
if (event.target.classList.contains('translation-close')) {
translationBox.style.display = 'none';
return;
}
const selectedText = getWordUnderCursor(event);
if (selectedText) {
fetchTranslation(selectedText, event);
playTTSWithYoudao(selectedText); // 调用有道 TTS 播放功能
} else {
translationBox.style.display = 'none';
}
});
function getWordUnderCursor(event) {
const range = document.caretRangeFromPoint(event.clientX, event.clientY);
if (!range || !range.startContainer || range.startContainer.nodeType !== Node.TEXT_NODE) {
return '';
}
const textContent = range.startContainer.textContent;
const offset = range.startOffset;
const before = textContent.slice(0, offset).split(/\s+/).pop();
const after = textContent.slice(offset).split(/\s+/).shift();
return (before + after).trim();
}
function fetchTranslation(text, event) {
fetch(`https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=zh-CN&dt=t&dt=bd&dt=rm&dt=ss&dt=md&q=${encodeURIComponent(text)}`)
.then(response => response.json())
.then(data => {
const translation = data[0][0][0];
showTranslation(text, translation, event);
})
.catch(err => console.error('翻译错误:', err));
}
function showTranslation(word, translation, event) {
const top = event.clientY + window.scrollY;
translationBox.style.top = `${top + 20}px`;
const closeButton = document.createElement('button');
closeButton.textContent = '×';
closeButton.classList.add('translation-close');
closeButton.style.position = 'absolute';
closeButton.style.top = '5px';
closeButton.style.right = '5px';
closeButton.style.fontSize = '18px';
closeButton.style.backgroundColor = 'transparent';
closeButton.style.border = 'none';
closeButton.style.color = '#333';
closeButton.style.cursor = 'pointer';
closeButton.style.fontWeight = 'bold';
translationBox.innerHTML = `
单词: ${word}
翻译: ${translation}
`;
translationBox.appendChild(closeButton);
translationBox.style.display = 'block';
}
function playTTSWithYoudao(selectedText) {
if (!selectedText) {
return;
}
const ttsUrl = `https://dict.youdao.com/dictvoice?audio=${encodeURIComponent(selectedText)}&type=2`;
let existingAudio = document.getElementById('hiddenAudioExample');
if (existingAudio) {
existingAudio.remove();
}
const audio = document.createElement('audio');
audio.id = 'hiddenAudioExample';
audio.style.display = 'none';
audio.src = ttsUrl;
document.body.append(audio);
audio.play().catch(error => console.error('TTS播放错误:', error));
}
})();