您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
首帧即中文:抢占 Cookie + 并行脚本 + 幽灵渲染 + 启发式完成检测。
// ==UserScript== // @name Phantom-Render 0-ms Translate (CN) // @namespace BlackHat.Tech/PhantomRender // @version 1.0 // @description 首帧即中文:抢占 Cookie + 并行脚本 + 幽灵渲染 + 启发式完成检测。 // @author // @match *://*/* // @run-at document-start // @grant none // ==/UserScript== (() => { /* 0 · 若本身含大量中文直接退出 */ const zh = /[\u4e00-\u9fff]/; if ( zh.test(document.title) || zh.test((document.documentElement.innerText||'').slice(0,4096)) ) return; /* 1 · 抢占:写 googtrans,欺骗服务器"必须中文" */ const LANG = '/auto/zh-CN'; document.cookie = `googtrans=${LANG};path=/;max-age=63072000`; localStorage.googtrans = LANG; sessionStorage.googtrans = LANG; /* 2 · 基础占位 + CSS 隐身,避免英文闪烁 */ document.head.insertAdjacentHTML('afterbegin', ` <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> <link rel="dns-prefetch" href="//translate.google.com"> <link rel="preconnect" href="https://translate.google.com" crossorigin> <link rel="dns-prefetch" href="//translate.googleapis.com"> <link rel="preconnect" href="https://translate.googleapis.com" crossorigin> <style id="phantom-css"> body{visibility:hidden!important;opacity:0!important; transition:opacity .3s;top:0!important} body.phantom-show{visibility:visible!important;opacity:1!important} .skiptranslate,#google_translate_element, .goog-te-banner-frame,.goog-te-balloon-frame, .goog-logo-link,.goog-te-gadget span{display:none!important} /* 保留 Markdown 链接原始颜色 */ a font[color] { color: inherit !important; } .markdown-body a font, .markdown a font, [class*="markdown"] a font, article a font, .content a font, .post a font, .article-content a font, main a font { color: inherit !important; } a { color: revert !important; } .markdown-body a, .markdown a, [class*="markdown"] a, article a, .content a, .post a, .article-content a, main a { color: revert !important; } </style> `); const phDiv = document.createElement('div'); phDiv.id = 'google_translate_element'; phDiv.style.display='none'; document.documentElement.appendChild(phDiv); /* 3 · Google 回调 */ window.__phInit = () => new google.translate.TranslateElement({ pageLanguage:'auto', includedLanguages:'zh-CN', autoDisplay:true, layout:google.translate.TranslateElement.InlineLayout.SIMPLE }, 'google_translate_element'); /* 4 · 并行拉脚本(带缓存)*/ const SRC = 'https://translate.google.com/translate_a/element.js?cb=__phInit'; const sc = document.createElement('script'); sc.src = SRC; sc.defer = sc.async = true; document.head.appendChild(sc); /* 5 · 启发式"翻译完成"检测 + Reveal */ const reveal = () => { document.body.classList.add('phantom-show'); addRestoreBtn(); fixLinkColors(); obs && obs.disconnect(); }; let timer, obs; const waitBody = new MutationObserver((m, o)=>{ if(!document.body) return; o.disconnect(); obs = new MutationObserver(()=>{ clearTimeout(timer); timer = setTimeout(reveal, 250); // 250 ms 静默:判定完成 }); obs.observe(document.body,{childList:true,subtree:true,characterData:true}); setTimeout(reveal, 5000); // 5 s 保险 }); waitBody.observe(document.documentElement,{childList:true,subtree:true}); /* 修复链接颜色 */ function fixLinkColors() { // 移除 Google 翻译添加的 font 标签的 color 属性 const fonts = document.querySelectorAll('a font[color]'); fonts.forEach(font => { font.removeAttribute('color'); }); } /* 6 · 恢复原文按钮 */ function addRestoreBtn(){ const btn = document.createElement('div'); btn.textContent='原文'; Object.assign(btn.style,{ position:'fixed',right:'20px',bottom:'28px',padding:'6px 14px', background:'#ff4d4f',color:'#fff',borderRadius:'6px', fontSize:'13px',fontFamily:'sans-serif',cursor:'pointer', zIndex:'2147483647',userSelect:'none',opacity:0.6, boxShadow:'0 2px 6px rgba(0,0,0,.25)',transition:'opacity .2s' }); btn.onmouseenter=()=>btn.style.opacity=1; btn.onmouseleave=()=>btn.style.opacity=0.6; btn.onclick=()=>{ /* 清 cookie → 刷新即回英文;再次点击可再翻译 */ const exp='Thu, 01 Jan 1970 00:00:00 GMT'; document.cookie=`googtrans=;expires=${exp};path=/;`; localStorage.removeItem('googtrans'); sessionStorage.removeItem('googtrans'); location.reload(); }; document.body.appendChild(btn); } })();