油猴脚本实现谷歌翻译接口划词翻译【接口来着论坛其他大佬】
本帖最后由 似水流年小小 于 2024-1-19 11:04 编辑免费的小红心点起来{:1_929:}本脚本集成了【zhurui】大佬提供的谷歌翻译接口,感谢大佬。如大佬接口不能使用,那本脚本也随之失效。
Tips: 接口大佬很坚挺,仍然稳如狗
附大佬链接:https://www.52pojie.cn/thread-1863856-1-1.html
直接上代码:
// ==UserScript==
// @name 文本翻译脚本
// @namespace https://example.com
// @version 1.0
// @description鼠标左键选中文本后,自动请求翻译并显示结果
// @match *://*/*
// @grant GM_xmlhttpRequest
// ==/UserScript==
(function() {
'use strict';
// 创建气泡样式
const tooltipStyle = `
position: absolute;
z-index: 9999;
background-color: #333;
color: #fff;
padding: 5px;
font-size: 14px;
border-radius: 3px;
max-width: 450px;
text-align: left;
white-space: normal;
word-wrap: break-word;
pointer-events: none;
`;
// 创建气泡元素
function createTooltip() {
const tooltip = document.createElement('div');
tooltip.id = 'translation-tooltip';
tooltip.style.cssText = tooltipStyle;
return tooltip;
}
// 显示气泡
function showTooltip(text, x, y) {
let tooltip = document.getElementById('translation-tooltip');
if (!tooltip) {
tooltip = createTooltip();
document.body.appendChild(tooltip);
}
tooltip.textContent = text;
// 调整气泡位置
const tooltipWidth = tooltip.offsetWidth;
const tooltipHeight = tooltip.offsetHeight;
const windowWidth = window.innerWidth;
const windowHeight = window.innerHeight;
const tooltipX = Math.max(0, Math.min(x - tooltipWidth / 2, windowWidth - tooltipWidth));
const tooltipY = Math.max(0, y - tooltipHeight - 10);
tooltip.style.left = tooltipX + 'px';
tooltip.style.top = tooltipY + 'px';
}
// 隐藏气泡
function hideTooltip() {
const tooltip = document.getElementById('translation-tooltip');
if (tooltip) {
tooltip.remove();
}
}
// 发送翻译请求
function translateText(text) {
const url = 'https://findmyip.net/api/translate.php?text=' + encodeURIComponent(text);
GM_xmlhttpRequest({
method: 'GET',
url: url,
onload: function(response) {
const Jresponse = JSON.parse(response.responseText);
var translation = '内部接口错误,请联系开发者'
if(Jresponse.code==400){
translation = Jresponse.error;
}else{
translation = Jresponse.data.translate_result;
}
const selection = window.getSelection();
if (selection.rangeCount > 0) {
const range = selection.getRangeAt(0);
const rect = range.getBoundingClientRect();
const x = rect.left + window.pageXOffset + rect.width / 2;
const y = rect.top + window.pageYOffset;
showTooltip(translation, x, y);
}
},
onerror: function(error) {
console.error('翻译请求发生错误:', error);
}
});
}
// 监听鼠标释放事件
window.addEventListener('mouseup', function(event) {
if (event.button === 0) { // 鼠标左键
const selection = window.getSelection();
const selectedText = selection.toString().trim();
if (selectedText !== '') {
translateText(selectedText);
} else {
hideTooltip();
}
}
});
// 初始化气泡元素
window.addEventListener('DOMContentLoaded', function() {
createTooltip();
});
})();
PS:代码粘过来被强行变化了,我把代码打包上来。请下载附件
使用方法:直接复制本脚本代码,打开油猴脚本管理界面,点击新建脚本,把复制的代码粘贴进去,保存即可。
实际截图如下(代码开头被改变了,参照图片上改一下,或者直接下载附件):
本帖最后由 hsx778899 于 2023-12-8 10:01 编辑
破解专用户 发表于 2023-12-8 08:40
我是不是应该回复,大佬挺住,您一定要坚挺啊!!!
--------------------------
同时我又自私的回复楼主 ...
你的建议不错,我试着改了下
// ==UserScript==
// @name 文本翻译脚本
// @namespace https://example.com
// @version 1.0
// @description鼠标左键选中文本后,自动请求翻译并显示结果
// @match *://*/*
// @grant GM_xmlhttpRequest
// ==/UserScript==
(function() {
'use strict';
// Function to decode HTML entities
function decodeHtml(html) {
var txt = document.createElement("textarea");
txt.innerHTML = html;
return txt.value;
}
// 创建气泡样式
const tooltipStyle = `
position: absolute;
z-index: 9999;
background-color: #333;
color: #fff;
padding: 5px;
font-size: 14px;
border-radius: 3px;
max-width: 450px;
text-align: left;
white-space: normal;
word-wrap: break-word;
pointer-events: auto;
`;
const buttonStyle = `
background-color: #555;
color: #fff;
border: none;
padding: 5px 10px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 12px;
margin: 5px 2px;
cursor: pointer;
border-radius: 2px;
`;
// 创建气泡元素
function createTooltip() {
const tooltip = document.createElement('div');
tooltip.id = 'translation-tooltip';
tooltip.style.cssText = tooltipStyle;
return tooltip;
}
// 显示气泡
function showTooltip(text, x, y) {
let tooltip = document.getElementById('translation-tooltip');
if (!tooltip) {
tooltip = createTooltip();
document.body.appendChild(tooltip);
}
tooltip.innerHTML = text;
// Add copy button
const copyButton = document.createElement('button');
copyButton.textContent = '复制';
copyButton.style.cssText = buttonStyle;
copyButton.onclick = function() {
// Decode HTML entities before copying
const decodedText = decodeHtml(text);
navigator.clipboard.writeText(decodedText).then(function() {
// Show success message
copyButton.textContent = '复制成功';
setTimeout(function() {
copyButton.textContent = '复制';
}, 2000);
}, function(err) {
console.error('复制失败:', err);
});
};
tooltip.appendChild(copyButton);
// Adjust tooltip position
const tooltipWidth = tooltip.offsetWidth;
const tooltipHeight = tooltip.offsetHeight;
const windowWidth = window.innerWidth;
const windowHeight = window.innerHeight;
const tooltipX = Math.max(0, Math.min(x - tooltipWidth / 2, windowWidth - tooltipWidth));
const tooltipY = Math.max(0, y - tooltipHeight - 10);
tooltip.style.left = tooltipX + 'px';
tooltip.style.top = tooltipY + 'px';
}
// 隐藏气泡
function hideTooltip() {
const tooltip = document.getElementById('translation-tooltip');
if (tooltip) {
tooltip.remove();
}
}
// 发送翻译请求
function translateText(text) {
const url = 'https://findmyip.net/api/translate.php?text=' + encodeURIComponent(text);
GM_xmlhttpRequest({
method: 'GET',
url: url,
onload: function(response) {
const Jresponse = JSON.parse(response.responseText);
var translation = '内部接口错误,请联系开发者'
if(Jresponse.code==400){
translation = Jresponse.error;
}else{
translation = Jresponse.data.translate_result;
}
const selection = window.getSelection();
if (selection.rangeCount > 0) {
const range = selection.getRangeAt(0);
const rect = range.getBoundingClientRect();
const x = rect.left + window.pageXOffset + rect.width / 2;
const y = rect.top + window.pageYOffset;
showTooltip(translation, x, y);
}
},
onerror: function(error) {
console.error('翻译请求发生错误:', error);
}
});
}
// 监听鼠标释放事件
window.addEventListener('mouseup', function(event) {
if (event.button === 0) { // 鼠标左键
const selection = window.getSelection();
const selectedText = selection.toString().trim();
if (selectedText !== '') {
translateText(selectedText);
} else {
hideTooltip();
}
}
});
// 初始化气泡元素
window.addEventListener('DOMContentLoaded', function() {
createTooltip();
});
})(); 感谢大佬分享{:1_921:}{:1_919:} 支持一下 可用 非常感谢 谷歌翻译不好使就一直没找到好用的 拿了.......... 测试了一下,好用,大佬{:1_921:} 很强啊,收下了!!!!! 似水流年小小 发表于 2024-2-29 21:14
没遇到过,截图看看
今天试了下,又可以用了,神奇!之前忘记截图了{:301_977:} 似水流年小小 发表于 2024-1-19 10:53
看来大佬能抗住
{:1_921:}{:1_921:}大佬威武:lol:lol 给大佬点赞 谢谢楼主分享试试 第二位{:1_918:}一会儿研究研究。 试试翻译效果~~ 不错不错,挺精简的 感谢楼主分享谢谢 沙发坐下 棒!棒!棒!棒!棒! 感谢分享 不错不错!{:1_893:}