您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
When Youtube using Immersive Translation copies the subtitles to the clipboard, supporting before translation, after translation, or select all Youtube使用沉浸式翻译时将字幕复制到剪贴板,支持翻译前,翻译后,或者全选
当前为
// ==UserScript== // @name Youtube Copying Selected Subtitles - Immersive Translation : 沉浸式翻译字幕复制 // @namespace http://tampermonkey.net/ // @version 1.2.1 // @description When Youtube using Immersive Translation copies the subtitles to the clipboard, supporting before translation, after translation, or select all Youtube使用沉浸式翻译时将字幕复制到剪贴板,支持翻译前,翻译后,或者全选 // @author i02sDarling // @match https://www.youtube.com/watch?v=* // @icon https://www.google.com/s2/favicons?sz=64&domain=youtube.com // @grant none // @name en // @license MIT // ==/UserScript== (function() { 'use strict'; console.log("02sdarling:Running"); let curSelect=1; const OutSelection=['Ori','Out','Both']; const button = document.createElement('button'); const toggleBtn=document.createElement('button'); mkContainer(); let intervalId; intervalId = setInterval(addClickEventWhenTargetAppears, 4000); function toggle(){ button.textContent = 'Copy'; } function appendStyle(btn){ btn.style.position = 'absolute'; btn.style.left = '10px'; btn.style.transform = 'translateY(-70%)'; btn.style.backgroundColor = '#007bff'; btn.style.color = '#fff'; btn.style.padding = '10px 15px'; btn.style.border = 'none'; btn.style.borderRadius = '5px'; btn.style.cursor = 'pointer'; } function mkContainer(){ button.id = '02sdarling'; button.textContent = 'Waiting'; button.style.top = '70%'; appendStyle(button); document.body.appendChild(button); } function mkToggle(){ toggleBtn.id = '02sdarlingYa'; toggleBtn.textContent = OutSelection[curSelect]; toggleBtn.style.top = '90%'; appendStyle(toggleBtn); document.body.appendChild(toggleBtn); } toggleBtn.addEventListener('click', function(){ curSelect=(curSelect+1)%3; toggleBtn.textContent= OutSelection[curSelect]; }) function getSpan(){ const ytbPlayer=document.getElementById('ytd-player'); const TopCont=ytbPlayer.children[0]; const container = TopCont.children[0].lastChild; if(container.id!=='immersive-translate-caption-window'){ console.log('Lost window container! make sure you have installed the immersive translation and opened it. If you have already done these things, you can wait.') return false; } const TmpString=container.getInnerHTML(); const domstring=TmpString.replace(/<template[^>]*>|<\/template>/g, ''); const doc = new DOMParser().parseFromString(domstring, "text/xml"); let span=doc.getElementsByTagName('span'); if(span) return span; console.err("Open the subtitle translate first"); return false; } function getText(){ const span=getSpan(); if(span){ if(curSelect===2){ return span[0].textContent+" "+span[1].textContent; }else{ return span[curSelect].textContent; } } return "falut to copy"; } function addClickEventWhenTargetAppears() { try{ if(getSpan()){ mkToggle(); toggle(); clearInterval(intervalId); } if(button.textContent==='Waiting'){ return; } //const ClickContainer=doc.getElementsByClassName('captions-text'); button.addEventListener('click', function() { let res=getText(); navigator.clipboard.writeText(res) .then(() => { console.log('Copy successful:', res); }) .catch(err => { console.error('Copy failed:', err); }); }) }catch(e){ console.log('Waiting'); } } })();