// ==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);
}
})();