Greasy Fork

来自缓存

Greasy Fork is available in English.

Auto Translate — Built for Via · iPhone & Android · 249 Languages

全球最强网页翻译器!双语对照+仅译文+原文三模式秒切 · Google/微软/腾讯三大引擎随心换 · Via/Safari/Chrome/Firefox/Edge/Kiwi/Lemur等所有Chromium内核浏览器通用 · 苹果iPhone安卓手机平板电脑全平台通吃 · 249种语言覆盖全球99%人口 · 基于TWP引擎深度重构致敬原作 · 零配置装完即用

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Auto Translate — Built for Via · iPhone & Android · 249 Languages
// @name:zh-CN   全球最强翻译器🌍 双语+秒翻 · Via完美适配 · 苹果安卓通吃 · 249种语言 · 致敬TWP
// @name:zh-TW   全球最強翻譯器🌍 雙語+秒翻 · Via完美適配 · 蘋果安卓通吃 · 249種語言 · 致敬TWP
// @name:en      World's Best Translator🌍 Bilingual + Instant · Via · iPhone & Android · 249 Langs
// @name:ja      世界最強の翻訳🌍 バイリンガル表示+瞬間翻訳 · Via · iPhone & Android · 249言語 · TWP リスペクト
// @name:ko      세계최강 번역기🌍 이중언어+즉시번역 · Via · 아이폰/안드로이드 · 249언어 · TWP헌정
// @name:fr      Traducteur ultime🌍 Bilingue + Instantané · Via · iPhone & Android · 249 langues · TWP
// @name:de      Stärkster Übersetzer🌍 Zweisprachig + Sofort · Via · iPhone & Android · 249 Sprachen · TWP
// @name:es      Traductor más potente🌍 Bilingüe + Instantáneo · Via · iPhone y Android · 249 idiomas · TWP
// @name:pt      Tradutor mais poderoso🌍 Bilíngue + Instantâneo · Via · iPhone e Android · 249 idiomas · TWP
// @name:pt-BR   Tradutor mais poderoso🌍 Bilíngue + Instantâneo · Via · iPhone e Android · 249 idiomas · TWP
// @name:ru      Мощнейший переводчик🌍 Двуязычный + Мгновенный · Via · iPhone/Android · 249 языков · TWP
// @name:it      Traduttore più potente🌍 Bilingue + Istantaneo · Via · iPhone e Android · 249 lingue · TWP
// @name:tr      En güçlü çevirmen🌍 İki dilli + Anında · Via · iPhone ve Android · 249 dil · TWP
// @name:ar      أقوى مترجم🌍 ثنائي اللغة + فوري · Via · آيفون وأندرويد · 249 لغة · تحية TWP
// @name:th      แปลแรงสุดในโลก🌍 สองภาษา+ทันที · Via · iPhone/Android · 249 ภาษา · TWP
// @name:vi      Dịch mạnh nhất🌍 Song ngữ + Tức thì · Via · iPhone & Android · 249 ngôn ngữ · TWP
// @name:id      Penerjemah terkuat🌍 Dwibahasa + Instan · Via · iPhone & Android · 249 bahasa · TWP
// @name:ms      Penterjemah terkuat🌍 Dwibahasa + Serta-merta · Via · iPhone & Android · 249 bahasa · TWP
// @name:hi      सबसे शक्तिशाली अनुवादक🌍 द्विभाषी + तुरंत · Via · iPhone/Android · 249 भाषाएँ · TWP
// @name:bn      সবচেয়ে শক্তিশালী অনুবাদক🌍 দ্বিভাষিক + তাৎক্ষণিক · Via · iPhone/Android · ২৪৯ ভাষা · TWP
// @name:ta      சக்திவாய்ந்த மொழிபெயர்ப்பாளர்🌍 இருமொழி + உடனடி · Via · iPhone/Android · 249 மொழி · TWP
// @name:te      శక్తివంతమైన అనువాదకుడు🌍 ద్విభాషా + తక్షణ · Via · iPhone/Android · 249 భాషలు · TWP
// @name:ur      سب سے طاقتور مترجم🌍 دو زبانی + فوری · Via · آئی فون/اینڈرائیڈ · 249 زبانیں · TWP
// @name:fa      قوی‌ترین مترجم🌍 دوزبانه + آنی · Via · آیفون/اندروید · 249 زبان · TWP
// @name:pl      Najpotężniejszy tłumacz🌍 Dwujęzyczny + Natychmiast · Via · iPhone/Android · 249 języków · TWP
// @name:uk      Найпотужніший перекладач🌍 Двомовний + Миттєвий · Via · iPhone/Android · 249 мов · TWP
// @name:ro      Cel mai puternic traducător🌍 Bilingv + Instant · Via · iPhone/Android · 249 limbi · TWP
// @name:nl      Krachtigste vertaler🌍 Tweetalig + Direct · Via · iPhone & Android · 249 talen · TWP
// @name:el      Ισχυρότερος μεταφραστής🌍 Δίγλωσσο + Άμεσο · Via · iPhone/Android · 249 γλώσσες · TWP
// @name:cs      Nejsilnější překladač🌍 Dvojjazyčný + Okamžitý · Via · iPhone/Android · 249 jazyků · TWP
// @name:hu      Legerősebb fordító🌍 Kétnyelvű + Azonnali · Via · iPhone/Android · 249 nyelv · TWP
// @name:sv      Kraftfullaste översättaren🌍 Tvåspråkig + Direkt · Via · iPhone/Android · 249 språk · TWP
// @name:da      Mest kraftfulde oversætter🌍 Tosproget + Direkte · Via · iPhone/Android · 249 sprog · TWP
// @name:fi      Tehokkain kääntäjä🌍 Kaksikielinen + Välitön · Via · iPhone/Android · 249 kieltä · TWP
// @name:no      Kraftigste oversetter🌍 Tospråklig + Direkte · Via · iPhone/Android · 249 språk · TWP
// @name:bg      Най-мощният преводач🌍 Двуезичен + Мигновен · Via · iPhone/Android · 249 езика · TWP
// @name:hr      Najmoćniji prevoditelj🌍 Dvojezičan + Trenutačan · Via · iPhone/Android · 249 jezika · TWP
// @name:sr      Најмоћнији преводилац🌍 Двојезичан + Тренутан · Via · iPhone/Android · 249 језика · TWP
// @name:sk      Najsilnejší prekladač🌍 Dvojjazyčný + Okamžitý · Via · iPhone/Android · 249 jazykov · TWP
// @name:sl      Najmočnejši prevajalnik🌍 Dvojezičen + Takojšen · Via · iPhone/Android · 249 jezikov · TWP
// @name:lt      Galingiausias vertėjas🌍 Dvikalbis + Momentinis · Via · iPhone/Android · 249 kalbos · TWP
// @name:lv      Jaudīgākais tulkotājs🌍 Divvalodu + Tūlītējs · Via · iPhone/Android · 249 valodas · TWP
// @name:et      Võimsaim tõlkija🌍 Kakskeelne + Kohene · Via · iPhone/Android · 249 keelt · TWP
// @name:sw      Mtafsiri hodari zaidi🌍 Lugha mbili + Papo hapo · Via · iPhone/Android · Lugha 249 · TWP
// @name:fil     Pinakamakapangyarihan🌍 Dalawahang wika + Agaran · Via · iPhone/Android · 249 wika · TWP
// @name:my      အစွမ်းကုန်ဘာသာပြန်🌍 နှစ်ဘာသာ+ချက်ချင်း · Via · iPhone/Android · ဘာသာ249 · TWP
// @name:km      អ្នកបកប្រែខ្លាំងបំផុត🌍 ពីរភាសា+បន្ទាន់ · Via · iPhone/Android · ២៤៩ភាសា · TWP
// @name:lo      ນັກແປແຮງສຸດ🌍 ສອງພາສາ+ທັນທີ · Via · iPhone/Android · 249 ພາສາ · TWP
// @name:ka      ძლიერი მთარგმნელი🌍 ორენოვანი + მყისიერი · Via · iPhone/Android · 249 ენა · TWP
// @name:hy      Ամենusage Թարգմանիչ🌍 Երկլեզու + Արագ · Via · iPhone/Android · 249 Լեzu · TWP
// @name:am      ኃይለኛ ተርጓሚ🌍 ሁለት ቋንቋ + ፈጣን · Via · iPhone/Android · 249 ቋንቋ · TWP
// @name:ne      शक्तिशाली अनुवादक🌍 द्विभाषी + तुरुन्त · Via · iPhone/Android · 249 भाषा · TWP
// @name:si      බලවත්ම පරිවර්තකය🌍 ද්විභාෂා + ක්ෂණික · Via · iPhone/Android · භාෂා 249 · TWP
// @name:mn      Хүчирхэг орчуулагч🌍 Хос хэл + Шуурхай · Via · iPhone/Android · 249 хэл · TWP
// @name:uz      Eng kuchli tarjimon🌍 Ikki tilli + Tez · Via · iPhone/Android · 249 til · TWP
// @name:kk      Ең қуатты аудармашы🌍 Екі тілді + Лезде · Via · iPhone/Android · 249 тіл · TWP
// @name:az      Ən güclü tərcüməçi🌍 İkidilli + Anlıq · Via · iPhone/Android · 249 dil · TWP
// @name:sq      Përkthyesi më i fortë🌍 Dygjuhësh + Menjëherë · Via · iPhone/Android · 249 gjuhë · TWP
// @name:mk      Најмоќен преведувач🌍 Двојазичен + Момент · Via · iPhone/Android · 249 јазици · TWP
// @name:bs      Najmoćniji prevodilac🌍 Dvojezičan + Trenutan · Via · iPhone/Android · 249 jezika · TWP
// @name:is      Öflugasti þýðandinn🌍 Tvímála + Samstundis · Via · iPhone/Android · 249 tungumál · TWP
// @name:af      Kragtigste vertaler🌍 Tweetalig + Dadelik · Via · iPhone/Android · 249 tale · TWP
// @name:yo      Atúmọ̀ tó lágbára jù🌍 Èdè Méjì + Lẹ́sẹ̀kẹsẹ̀ · Via · iPhone/Android · Èdè 249 · TWP
// @name:ha      Mafi ƙarfin mai fassara🌍 Harsuna 2 + Nan take · Via · iPhone/Android · Harsuna 249 · TWP
// @name:ig      Onye ntụgharị kachasị🌍 Asụsụ Abụọ + Ozugbo · Via · iPhone/Android · Asụsụ 249 · TWP
// @name:zu      Umhumushi onamandla🌍 Izilimi 2 + Ngokushesha · Via · iPhone/Android · Izilimi 249 · TWP
// @name:mg      Mpandika teny matanjaka🌍 Roa teny + Vetivety · Via · iPhone/Android · 249 fiteny · TWP
// @name:eo      Plej potenca tradukilo🌍 Dulingva + Tuja · Via · iPhone/Android · 249 lingvoj · TWP
// @name:la      Potentissimus interpres🌍 Bilinguis + Statim · Via · iPhone/Android · 249 linguae · TWP
// @name:he      המתרגם החזק🌍 דו-לשוני + מיידי · Via · אייפון/אנדרואיד · 249 שפות · TWP
// @name:gu      શક્તિશાળી અનુવાદક🌍 દ્વિભાષી + તાત્કાલિક · Via · iPhone/Android · 249 ભાષા · TWP
// @name:mr      शक्तिशाली अनुवादक🌍 द्विभाषी + तात्काळ · Via · iPhone/Android · 249 भाषा · TWP
// @name:pa      ਸ਼ਕਤੀਸ਼ਾਲੀ ਅਨੁਵਾਦਕ🌍 ਦੋਭਾਸ਼ੀ + ਤੁਰੰਤ · Via · iPhone/Android · 249 ਭਾਸ਼ਾ · TWP
// @name:kn      ಶಕ್ತಿಶಾಲಿ ಅನುವಾದಕ🌍 ದ್ವಿಭಾಷಾ + ತಕ್ಷಣ · Via · iPhone/Android · 249 ಭಾಷೆ · TWP
// @name:ml      ശക്തമായ പരിഭാഷകൻ🌍 ദ്വിഭാഷ + തൽക്ഷണം · Via · iPhone/Android · 249 ഭാഷ · TWP
// @namespace    https://github.com/user/translate
// @version      7.7.7
// @description       全球最强网页翻译器!双语对照+仅译文+原文三模式秒切 · Google/微软/腾讯三大引擎随心换 · Via/Safari/Chrome/Firefox/Edge/Kiwi/Lemur等所有Chromium内核浏览器通用 · 苹果iPhone安卓手机平板电脑全平台通吃 · 249种语言覆盖全球99%人口 · 基于TWP引擎深度重构致敬原作 · 零配置装完即用
// @description:zh-CN 全球最强网页翻译器!双语对照+仅译文+原文三模式秒切 · Google/微软/腾讯三大引擎随心换 · Via/Safari/Chrome/Firefox/Edge/Kiwi/Lemur等所有Chromium内核浏览器通用 · 苹果iPhone安卓手机平板电脑全平台通吃 · 249种语言覆盖全球99%人口 · 基于TWP引擎深度重构致敬原作 · 零配置装完即用
// @description:zh-TW 全球最強網頁翻譯器!雙語對照+僅譯文+原文三模式秒切 · Google/微軟/騰訊三大引擎隨心換 · Via/Safari/Chrome/Firefox/Edge/Kiwi/Lemur等所有Chromium內核瀏覽器通用 · 蘋果iPhone安卓手機平板電腦全平台通吃 · 249種語言覆蓋全球99%人口 · 基於TWP引擎深度重構致敬原作 · 零配置裝完即用
// @description:en    The world's most powerful webpage translator! Bilingual side-by-side / translated-only / original — 3 display modes switch instantly · Google/Microsoft/Tencent 3 engines · Works on Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur & all Chromium browsers · iPhone, Android, tablet, desktop — all platforms · 249 languages covering 99% of world population · Rebuilt on TWP engine with deep respect to the original · Zero config, install and go
// @description:ja    世界最強のウェブページ翻訳器!バイリンガル並列/翻訳のみ/原文の3表示モードを瞬時に切替 · Google/Microsoft/Tencent 3エンジン · Via、Safari、Chrome、Firefox、Edge、Kiwi、Lemur等全Chromiumブラウザ対応 · iPhone・Android・タブレット・PC全プラットフォーム · 249言語で世界人口の99%をカバー · TWPエンジンを基に深くリスペクトして再構築 · 設定不要、インストールして即使用
// @description:ko    세계 최강 웹페이지 번역기! 이중언어 나란히/번역만/원문 3가지 표시 모드 즉시 전환 · Google/Microsoft/Tencent 3개 엔진 · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur 등 모든 Chromium 브라우저 지원 · 아이폰·안드로이드·태블릿·PC 전 플랫폼 · 249개 언어로 세계 인구 99% 커버 · TWP 엔진 기반 깊은 존경으로 재구축 · 설정 없이 설치 즉시 사용
// @description:fr    Le traducteur de pages web le plus puissant au monde ! Bilingue côte à côte / traduction seule / original — 3 modes d'affichage instantanés · 3 moteurs Google/Microsoft/Tencent · Fonctionne sur Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur et tous les navigateurs Chromium · iPhone, Android, tablette, PC — toutes plateformes · 249 langues couvrant 99% de la population mondiale · Reconstruit sur le moteur TWP avec un profond respect · Zéro config, installez et c'est parti
// @description:de    Der mächtigste Webseiten-Übersetzer der Welt! Zweisprachig nebeneinander / nur Übersetzung / Original — 3 Anzeigemodi sofort umschaltbar · 3 Engines Google/Microsoft/Tencent · Funktioniert auf Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur und allen Chromium-Browsern · iPhone, Android, Tablet, Desktop — alle Plattformen · 249 Sprachen für 99% der Weltbevölkerung · Auf TWP-Engine aufgebaut mit tiefem Respekt · Null Konfiguration, installieren und loslegen
// @description:es    ¡El traductor de páginas web más potente del mundo! Bilingüe lado a lado / solo traducción / original — 3 modos de visualización instantáneos · 3 motores Google/Microsoft/Tencent · Funciona en Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur y todos los navegadores Chromium · iPhone, Android, tablet, PC — todas las plataformas · 249 idiomas cubriendo el 99% de la población mundial · Reconstruido sobre el motor TWP con profundo respeto · Cero configuración, instala y listo
// @description:pt    O tradutor de páginas web mais poderoso do mundo! Bilíngue lado a lado / só tradução / original — 3 modos de exibição instantâneos · 3 motores Google/Microsoft/Tencent · Funciona no Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur e todos os navegadores Chromium · iPhone, Android, tablet, desktop — todas as plataformas · 249 idiomas cobrindo 99% da população mundial · Reconstruído sobre o motor TWP com profundo respeito · Zero configuração, instale e use
// @description:pt-BR O tradutor de páginas web mais poderoso do mundo! Bilíngue lado a lado / só tradução / original — 3 modos de exibição instantâneos · 3 motores Google/Microsoft/Tencent · Funciona no Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur e todos os navegadores Chromium · iPhone, Android, tablet, desktop — todas as plataformas · 249 idiomas cobrindo 99% da população mundial · Reconstruído sobre o motor TWP com profundo respeito · Zero configuração, instale e use
// @description:ru    Самый мощный переводчик веб-страниц в мире! Двуязычный бок о бок / только перевод / оригинал — 3 режима отображения мгновенно · 3 движка Google/Microsoft/Tencent · Работает в Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur и всех Chromium-браузерах · iPhone, Android, планшет, ПК — все платформы · 249 языков для 99% населения мира · Перестроен на движке TWP с глубоким уважением к оригиналу · Нулевая настройка, установи и пользуйся
// @description:it    Il traduttore di pagine web più potente al mondo! Bilingue affiancato / solo traduzione / originale — 3 modalità di visualizzazione istantanee · 3 motori Google/Microsoft/Tencent · Funziona su Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur e tutti i browser Chromium · iPhone, Android, tablet, desktop — tutte le piattaforme · 249 lingue per il 99% della popolazione mondiale · Ricostruito sul motore TWP con profondo rispetto · Zero configurazione, installa e vai
// @description:tr    Dünyanın en güçlü web sayfası çevirmeni! İki dilli yan yana / sadece çeviri / orijinal — 3 görüntüleme modu anında geçiş · 3 motor Google/Microsoft/Tencent · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur ve tüm Chromium tarayıcılarda çalışır · iPhone, Android, tablet, masaüstü — tüm platformlar · 249 dil dünya nüfusunun %99'unu kapsar · TWP motoruna derin saygıyla yeniden inşa edildi · Sıfır yapılandırma, kur ve başla
// @description:ar    أقوى مترجم صفحات ويب في العالم! ثنائي اللغة جنبًا إلى جنب / ترجمة فقط / أصلي — 3 أوضاع عرض فورية · 3 محركات Google/Microsoft/Tencent · يعمل على Via وSafari وChrome وFirefox وEdge وKiwi وLemur وجميع متصفحات Chromium · آيفون وأندرويد وتابلت وسطح المكتب — جميع المنصات · 249 لغة تغطي 99% من سكان العالم · أُعيد بناؤه على محرك TWP مع احترام عميق للأصل · بدون إعداد، ثبّت وانطلق
// @description:th    ตัวแปลหน้าเว็บที่ทรงพลังที่สุดในโลก! สองภาษาเคียงข้าง / แปลอย่างเดียว / ต้นฉบับ — 3 โหมดแสดงผลสลับทันที · 3 เครื่องยนต์ Google/Microsoft/Tencent · ใช้ได้บน Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur และทุกเบราว์เซอร์ Chromium · iPhone, Android, แท็บเล็ต, เดสก์ท็อป — ทุกแพลตฟอร์ม · 249 ภาษาครอบคลุม 99% ของประชากรโลก · สร้างใหม่บนเครื่องยนต์ TWP ด้วยความเคารพอย่างสุดซึ้ง · ไม่ต้องตั้งค่า ติดตั้งแล้วใช้ได้เลย
// @description:vi    Trình dịch trang web mạnh nhất thế giới! Song ngữ cạnh nhau / chỉ bản dịch / bản gốc — 3 chế độ hiển thị chuyển đổi tức thì · 3 engine Google/Microsoft/Tencent · Hoạt động trên Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur và mọi trình duyệt Chromium · iPhone, Android, máy tính bảng, PC — mọi nền tảng · 249 ngôn ngữ bao phủ 99% dân số thế giới · Tái xây dựng trên engine TWP với sự kính trọng sâu sắc · Không cần cấu hình, cài là chạy
// @description:id    Penerjemah halaman web paling kuat di dunia! Dwibahasa berdampingan / hanya terjemahan / asli — 3 mode tampilan beralih instan · 3 mesin Google/Microsoft/Tencent · Berjalan di Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur dan semua browser Chromium · iPhone, Android, tablet, desktop — semua platform · 249 bahasa mencakup 99% populasi dunia · Dibangun ulang di atas mesin TWP dengan penghormatan mendalam · Tanpa konfigurasi, pasang dan langsung pakai
// @description:ms    Penterjemah halaman web paling berkuasa di dunia! Dwibahasa bersebelahan / terjemahan sahaja / asal — 3 mod paparan serta-merta · 3 enjin Google/Microsoft/Tencent · Berfungsi di Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur dan semua pelayar Chromium · iPhone, Android, tablet, desktop — semua platform · 249 bahasa meliputi 99% populasi dunia · Dibina semula di atas enjin TWP dengan penghormatan mendalam · Sifar konfigurasi, pasang dan guna
// @description:hi    दुनिया का सबसे शक्तिशाली वेबपेज अनुवादक! द्विभाषी साथ-साथ / केवल अनुवाद / मूल — 3 प्रदर्शन मोड तुरंत बदलें · Google/Microsoft/Tencent 3 इंजन · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur और सभी Chromium ब्राउज़र पर काम करता है · iPhone, Android, टैबलेट, डेस्कटॉप — सभी प्लेटफ़ॉर्म · 249 भाषाएँ विश्व जनसंख्या का 99% कवर करती हैं · TWP इंजन पर गहरे सम्मान के साथ पुनर्निर्मित · शून्य कॉन्फ़िग, इंस्टॉल करें और चलाएँ
// @description:bn    বিশ্বের সবচেয়ে শক্তিশালী ওয়েবপেজ অনুবাদক! দ্বিভাষিক পাশাপাশি / শুধু অনুবাদ / মূল — 3টি প্রদর্শন মোড তাৎক্ষণিক · Google/Microsoft/Tencent 3 ইঞ্জিন · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur এবং সমস্ত Chromium ব্রাউজারে কাজ করে · iPhone, Android, ট্যাবলেট, ডেস্কটপ — সব প্ল্যাটফর্ম · 249 ভাষা বিশ্ব জনসংখ্যার 99% কভার করে · TWP ইঞ্জিনের উপর গভীর শ্রদ্ধায় পুনর্নির্মিত · শূন্য কনফিগ, ইনস্টল করুন এবং ব্যবহার করুন
// @description:ta    உலகின் மிக சக்திவாய்ந்த வலைப்பக்க மொழிபெயர்ப்பாளர்! இருமொழி அருகருகே / மொழிபெயர்ப்பு மட்டும் / அசல் — 3 காட்சி முறைகள் உடனடியாக மாறும் · Google/Microsoft/Tencent 3 இயந்திரங்கள் · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur மற்றும் அனைத்து Chromium உலாவிகளிலும் வேலை செய்யும் · 249 மொழிகள் · TWP இயந்திரத்தின் மீது ஆழ்ந்த மரியாதையுடன் மறுகட்டமைக்கப்பட்டது
// @description:te    ప్రపంచంలోనే అత్యంత శక్తివంతమైన వెబ్‌పేజీ అనువాదకుడు! ద్విభాషా పక్కపక్కన / అనువాదం మాత్రమే / మూలం — 3 ప్రదర్శన మోడ్‌లు తక్షణంగా మారుతాయి · Google/Microsoft/Tencent 3 ఇంజన్‌లు · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur మరియు అన్ని Chromium బ్రౌజర్‌లలో పనిచేస్తుంది · 249 భాషలు · TWP ఇంజన్‌పై లోతైన గౌరవంతో పునర్నిర్మించబడింది
// @description:ur    دنیا کا سب سے طاقتور ویب پیج مترجم! دو زبانی ساتھ ساتھ / صرف ترجمہ / اصل — 3 ڈسپلے موڈز فوری طور پر تبدیل · Google/Microsoft/Tencent 3 انجن · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur اور تمام Chromium براؤزرز پر کام کرتا ہے · 249 زبانیں · TWP انجن پر گہری عزت کے ساتھ دوبارہ تعمیر
// @description:fa    قوی‌ترین مترجم صفحات وب در جهان! دوزبانه کنار هم / فقط ترجمه / اصلی — 3 حالت نمایش فوری · 3 موتور Google/Microsoft/Tencent · روی Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur و تمام مرورگرهای Chromium کار می‌کند · 249 زبان · بازسازی شده روی موتور TWP با احترام عمیق · بدون تنظیم، نصب کنید و استفاده کنید
// @description:pl    Najpotężniejszy tłumacz stron internetowych na świecie! Dwujęzyczny obok siebie / tylko tłumaczenie / oryginał — 3 tryby wyświetlania natychmiastowe · 3 silniki Google/Microsoft/Tencent · Działa na Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur i wszystkich przeglądarkach Chromium · 249 języków obejmujących 99% populacji świata · Przebudowany na silniku TWP z głębokim szacunkiem · Zero konfiguracji, zainstaluj i korzystaj
// @description:uk    Найпотужніший перекладач веб-сторінок у світі! Двомовний поруч / лише переклад / оригінал — 3 режими відображення миттєво · 3 рушії Google/Microsoft/Tencent · Працює у Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur та всіх Chromium-браузерах · 249 мов для 99% населення світу · Перебудовано на рушії TWP з глибокою повагою · Нуль налаштувань, встанови та користуйся
// @description:ro    Cel mai puternic traducător de pagini web din lume! Bilingv alăturat / doar traducere / original — 3 moduri de afișare instantanee · 3 motoare Google/Microsoft/Tencent · Funcționează pe Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur și toate browserele Chromium · 249 limbi acoperind 99% din populația lumii · Reconstruit pe motorul TWP cu respect profund · Zero configurare, instalează și folosește
// @description:nl    De krachtigste webpagina-vertaler ter wereld! Tweetalig naast elkaar / alleen vertaling / origineel — 3 weergavemodi direct omschakelen · 3 engines Google/Microsoft/Tencent · Werkt op Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur en alle Chromium-browsers · 249 talen voor 99% van de wereldbevolking · Herbouwd op TWP-engine met diep respect · Nul configuratie, installeer en ga
// @description:el    Ο πιο ισχυρός μεταφραστής ιστοσελίδων στον κόσμο! Δίγλωσσο δίπλα-δίπλα / μόνο μετάφραση / πρωτότυπο — 3 λειτουργίες εμφάνισης άμεσα · 3 μηχανές Google/Microsoft/Tencent · Λειτουργεί σε Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur και όλους τους Chromium browsers · 249 γλώσσες για το 99% του παγκόσμιου πληθυσμού · Ανακατασκευασμένο στη μηχανή TWP με βαθύ σεβασμό · Μηδενική ρύθμιση, εγκατάσταση και χρήση
// @description:cs    Nejsilnější překladač webových stránek na světě! Dvojjazyčný vedle sebe / pouze překlad / originál — 3 režimy zobrazení okamžitě · 3 enginy Google/Microsoft/Tencent · Funguje na Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur a všech Chromium prohlížečích · 249 jazyků pokrývajících 99% světové populace · Přestavěn na enginu TWP s hlubokým respektem · Nulová konfigurace, nainstaluj a používej
// @description:hu    A világ legerősebb weblap-fordítója! Kétnyelvű egymás mellett / csak fordítás / eredeti — 3 megjelenítési mód azonnali váltás · 3 motor Google/Microsoft/Tencent · Működik Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur és minden Chromium böngészőben · 249 nyelv a világ népességének 99%-át lefedi · TWP motoron újjáépítve mély tisztelettel · Nulla konfiguráció, telepítsd és használd
// @description:sv    Världens kraftfullaste webbsideöversättare! Tvåspråkig sida vid sida / bara översättning / original — 3 visningslägen byter omedelbart · 3 motorer Google/Microsoft/Tencent · Fungerar på Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur och alla Chromium-webbläsare · 249 språk som täcker 99% av världens befolkning · Ombyggd på TWP-motorn med djup respekt · Noll konfiguration, installera och kör
// @description:da    Verdens mest kraftfulde webside-oversætter! Tosproget side om side / kun oversættelse / original — 3 visningstilstande skifter øjeblikkeligt · 3 motorer Google/Microsoft/Tencent · Virker på Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur og alle Chromium-browsere · 249 sprog der dækker 99% af verdens befolkning · Genopbygget på TWP-motoren med dyb respekt · Nul konfiguration, installer og brug
// @description:fi    Maailman tehokkain verkkosivukääntäjä! Kaksikielinen rinnakkain / vain käännös / alkuperäinen — 3 näyttötilaa vaihtuu välittömästi · 3 moottoria Google/Microsoft/Tencent · Toimii Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur ja kaikilla Chromium-selaimilla · 249 kieltä kattaen 99% maailman väestöstä · Rakennettu uudelleen TWP-moottorille syvällä kunnioituksella · Nolla asetuksia, asenna ja käytä
// @description:no    Verdens kraftigste nettsideoversetter! Tospråklig side ved side / kun oversettelse / original — 3 visningsmodi bytter øyeblikkelig · 3 motorer Google/Microsoft/Tencent · Fungerer på Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur og alle Chromium-nettlesere · 249 språk som dekker 99% av verdens befolkning · Gjenoppbygd på TWP-motoren med dyp respekt · Null konfigurasjon, installer og bruk
// @description:bg    Най-мощният преводач на уебстраници в света! Двуезичен един до друг / само превод / оригинал — 3 режима на показване мигновено · 3 двигателя Google/Microsoft/Tencent · Работи на Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur и всички Chromium браузъри · 249 езика покриващи 99% от световното население · Преизграден на двигателя TWP с дълбоко уважение · Нулева конфигурация, инсталирай и ползвай
// @description:hr    Najmoćniji prevoditelj web stranica na svijetu! Dvojezičan jedan pored drugog / samo prijevod / original — 3 načina prikaza trenutačno · 3 motora Google/Microsoft/Tencent · Radi na Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur i svim Chromium preglednicima · 249 jezika koji pokrivaju 99% svjetske populacije · Izgrađen na TWP motoru s dubokim poštovanjem · Nula konfiguracije, instaliraj i koristi
// @description:sr    Најмоћнији преводилац веб страница на свету! Двојезичан један поред другог / само превод / оригинал — 3 режима приказа тренутно · 3 мотора Google/Microsoft/Tencent · Ради на Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur и свим Chromium прегледачима · 249 језика који покривају 99% светске популације · Преизграђен на TWP мотору са дубоким поштовањем · Нула конфигурације, инсталирај и користи
// @description:sk    Najsilnejší prekladač webových stránok na svete! Dvojjazyčný vedľa seba / iba preklad / originál — 3 režimy zobrazenia okamžite · 3 enginy Google/Microsoft/Tencent · Funguje na Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur a všetkých prehliadačoch Chromium · 249 jazykov pokrývajúcich 99% svetovej populácie · Prestavaný na engine TWP s hlbokým rešpektom · Nulová konfigurácia, nainštaluj a používaj
// @description:sl    Najmočnejši prevajalnik spletnih strani na svetu! Dvojezičen drug ob drugem / samo prevod / izvirnik — 3 načini prikaza takoj · 3 motorji Google/Microsoft/Tencent · Deluje na Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur in vseh Chromium brskalnikih · 249 jezikov ki pokrivajo 99% svetovnega prebivalstva · Prenovljen na TWP motorju z globokim spoštovanjem · Nič konfiguracije, namesti in uporabljaj
// @description:lt    Galingiausias tinklalapių vertėjas pasaulyje! Dvikalbis greta / tik vertimas / originalas — 3 rodymo režimai persijungia akimirksniu · 3 varikliai Google/Microsoft/Tencent · Veikia Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur ir visose Chromium naršyklėse · 249 kalbos apimančios 99% pasaulio gyventojų · Perkurtas ant TWP variklio su gilia pagarba · Nulinė konfigūracija, įdiek ir naudok
// @description:lv    Jaudīgākais tīmekļa lapu tulkotājs pasaulē! Divvalodu blakus / tikai tulkojums / oriģināls — 3 attēlošanas režīmi pārslēdzas tūlīt · 3 dzinēji Google/Microsoft/Tencent · Darbojas Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur un visos Chromium pārlūkos · 249 valodas aptverot 99% pasaules iedzīvotāju · Pārbūvēts uz TWP dzinēja ar dziļu cieņu · Nulles konfigurācija, instalē un lieto
// @description:et    Maailma võimsaim veebilehtede tõlkija! Kakskeelne kõrvuti / ainult tõlge / originaal — 3 kuvarežiimi lülituvad koheselt · 3 mootorit Google/Microsoft/Tencent · Töötab Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur ja kõigis Chromium brauserites · 249 keelt katavad 99% maailma elanikkonnast · Üles ehitatud TWP mootorile sügava austusega · Null konfiguratsiooni, paigalda ja kasuta
// @description:sw    Mtafsiri wa kurasa za wavuti wenye nguvu zaidi duniani! Lugha mbili bega kwa bega / tafsiri pekee / asili — mitindo 3 ya kuonyesha hubadilika papo hapo · Injini 3 Google/Microsoft/Tencent · Inafanya kazi kwenye Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur na vivinjari vyote vya Chromium · Lugha 249 zinazofunika 99% ya watu duniani · Imejengwa upya kwenye injini ya TWP kwa heshima kubwa · Hakuna usanidi, sakinisha na utumie
// @description:fil   Pinakamakapangyarihang tagasalin ng mga webpage sa buong mundo! Dalawahang wika magkatabi / salin lang / orihinal — 3 display mode nag-aagad · 3 engine Google/Microsoft/Tencent · Gumagana sa Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur at lahat ng Chromium browser · 249 wika sumasaklaw sa 99% ng populasyon ng mundo · Itinayo muli sa TWP engine na may malalim na paggalang · Zero config, i-install at gamitin
// @description:my    ကမ္ဘာ့အစွမ်းကုန် ဝဘ်စာမျက်နှာ ဘာသာပြန်! နှစ်ဘာသာ ဘေးချင်းကပ် / ဘာသာပြန်သာ / မူရင်း — ပြသနည်း 3 ခု ချက်ချင်းပြောင်း · Google/Microsoft/Tencent အင်ဂျင် 3 ခု · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur နှင့် Chromium ဘရောက်ဆာအားလုံး · ဘာသာ 249 · TWP အင်ဂျင်ပေါ်တွင် လေးစားစွာ ပြန်လည်တည်ဆောက်ထား
// @description:km    អ្នកបកប្រែគេហទំព័រដ៏ខ្លាំងបំផុតក្នុងពិភពលោក! ពីរភាសាត្រូវគ្នា / បកប្រែតែប៉ុណ្ណោះ / ដើម — 3 របៀបបង្ហាញប្តូរភ្លាមៗ · ម៉ាស៊ីន 3 Google/Microsoft/Tencent · ដំណើរការលើ Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur និងកម្មវិធីរុករក Chromium ទាំងអស់ · ២៤៩ ភាសា · បង្កើតឡើងវិញលើម៉ាស៊ីន TWP ដោយការគោរពយ៉ាងជ្រាលជ្រៅ
// @description:lo    ນັກແປໜ້າເວັບທີ່ແຮງທີ່ສຸດໃນໂລກ! ສອງພາສາຄຽງຄູ່ / ແປຢ່າງດຽວ / ຕົ້ນສະບັບ — 3 ໂໝດສະແດງປ່ຽນທັນທີ · 3 ເຄື່ອງຈັກ Google/Microsoft/Tencent · ເຮັດວຽກໃນ Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur ແລະບຣາວເຊີ Chromium ທັງໝົດ · 249 ພາສາ · ສ້າງຂຶ້ນໃໝ່ເທິງເຄື່ອງຈັກ TWP ດ້ວຍຄວາມເຄົາລົບ
// @description:ka    მსოფლიოში ყველაზე ძლიერი ვებგვერდის მთარგმნელი! ორენოვანი გვერდიგვერდ / მხოლოდ თარგმანი / ორიგინალი — 3 ჩვენების რეჟიმი მყისიერად · 3 ძრავი Google/Microsoft/Tencent · მუშაობს Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur და ყველა Chromium ბრაუზერზე · 249 ენა · აღდგენილია TWP ძრავზე ღრმა პატივისცემით
// @description:hy    Աշխարհի delays delays delays! Երdelays delays / delays delays / delays — 3 delays delays · 3 delays Google/Microsoft/Tencent · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur delays Chromium delays · 249 delays · TWP delays delays
// @description:am    በዓለም ላይ በጣም ኃይለኛ ድረ-ገጽ ተርጓሚ! ሁለት ቋንቋ ከጎን ለጎን / ትርጉም ብቻ / ዋናው — 3 የማሳያ ሁነታዎች ወዲያውኑ · 3 ሞተሮች Google/Microsoft/Tencent · በ Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur እና ሁሉም Chromium አሳሾች ላይ ይሰራል · 249 ቋንቋዎች · በ TWP ሞተር ላይ በጥልቅ ክብር ተገንብቷል
// @description:ne    संसारको सबभन्दा शक्तिशाली वेबपेज अनुवादक! द्विभाषी छेउछाउ / अनुवाद मात्र / मूल — 3 प्रदर्शन मोड तुरुन्त · 3 इन्जिन Google/Microsoft/Tencent · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur र सबै Chromium ब्राउजरमा काम गर्छ · 249 भाषा · TWP इन्जिनमा गहिरो सम्मानका साथ पुनर्निर्माण
// @description:si    ලෝකයේ බලවත්ම වෙබ් පිටු පරිවර්තකය! ද්විභාෂා පැත්තෙන් පැත්ත / පරිවර්තනය පමණි / මුල් — ප්‍රදර්ශන ආකාර 3ක් ක්ෂණිකව · එන්ජින් 3ක් Google/Microsoft/Tencent · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur සහ සියලුම Chromium බ්‍රව්සර්වල ක්‍රියා කරයි · භාෂා 249 · TWP එන්ජිම මත ගැඹුරු ගෞරවයෙන් ප්‍රතිනිර්මාණය
// @description:mn    Дэлхийн хамгийн хүчирхэг вэб хуудас орчуулагч! Хоёр хэлтэй зэрэгцээ / зөвхөн орчуулга / эх хувилбар — 3 харуулах горим шуурхай · 3 хөдөлгүүр Google/Microsoft/Tencent · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur болон бүх Chromium хөтчид дээр ажилладаг · 249 хэл · TWP хөдөлгүүр дээр гүн хүндэтгэлтэйгээр дахин бүтээсэн
// @description:uz    Dunyodagi eng kuchli veb-sahifa tarjimoni! Ikki tilli yonma-yon / faqat tarjima / asl nusxa — 3 ko'rsatish rejimi bir zumda · 3 dvigatel Google/Microsoft/Tencent · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur va barcha Chromium brauzerlarda ishlaydi · 249 til · TWP dvigatelida chuqur hurmat bilan qayta qurilgan
// @description:kk    Әлемдегі ең қуатты веб-бет аудармашысы! Екі тілді қатар / тек аударма / түпнұсқа — 3 көрсету режимі лезде · 3 қозғалтқыш Google/Microsoft/Tencent · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur және барлық Chromium браузерлерде жұмыс істейді · 249 тіл · TWP қозғалтқышында терең құрметпен қайта құрылған
// @description:az    Dünyanın ən güclü veb səhifə tərcüməçisi! İkidilli yan-yana / yalnız tərcümə / orijinal — 3 göstərmə rejimi anlıq · 3 mühərrik Google/Microsoft/Tencent · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur və bütün Chromium brauzerlərdə işləyir · 249 dil · TWP mühərrikində dərin hörmətlə yenidən qurulub
// @description:sq    Përkthyesi më i fuqishëm i faqeve të internetit në botë! Dygjuhësh krah për krah / vetëm përkthim / origjinal — 3 mënyra shfaqjeje menjëherë · 3 motorë Google/Microsoft/Tencent · Punon në Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur dhe të gjithë shfletuesit Chromium · 249 gjuhë që mbulojnë 99% të popullsisë botërore · I rindërtuar mbi motorin TWP me respekt të thellë
// @description:mk    Најмоќен преведувач на веб-страници на светот! Двојазичен еден до друг / само превод / оригинал — 3 режими на прикажување моментално · 3 мотори Google/Microsoft/Tencent · Работи на Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur и сите Chromium прелистувачи · 249 јазици · Преизграден на TWP моторот со длабока почит
// @description:bs    Najmoćniji prevodilac web stranica na svijetu! Dvojezičan jedan pored drugog / samo prijevod / original — 3 načina prikaza trenutno · 3 motora Google/Microsoft/Tencent · Radi na Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur i svim Chromium preglednicima · 249 jezika · Izgrađen na TWP motoru s dubokim poštovanjem
// @description:is    Öflugasti þýðandinn á vefsíðum í heiminum! Tvímála hlið við hlið / aðeins þýðing / upprunalegt — 3 birtingarstillingar skipta samstundis · 3 vélar Google/Microsoft/Tencent · Virkar á Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur og öllum Chromium vöfrum · 249 tungumál · Endurbyggður á TWP vél með djúpri virðingu
// @description:af    Die kragtigste webblad-vertaler ter wêreld! Tweetalig langs mekaar / slegs vertaling / oorspronklik — 3 vertoonmodusse skakel onmiddellik · 3 enjins Google/Microsoft/Tencent · Werk op Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur en alle Chromium-blaaiers · 249 tale · Herbou op TWP-enjin met diep respek
// @description:yo    Atúmọ̀ ojú-ìwé wẹ́ẹ̀bù tó lágbára jù lọ ní àgbáyé! Èdè méjì lẹ́gbẹ̀ẹ́ / àtúmọ̀ nìkan / àkọ́kọ́ — Ọ̀nà ìfihàn 3 yí padà lẹ́sẹ̀kẹsẹ̀ · Ẹ̀rọ 3 Google/Microsoft/Tencent · Ó ń ṣiṣẹ́ ní Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur àti gbogbo àwọn aṣàwákiri Chromium · Èdè 249 · A tún kọ́ lórí ẹ̀rọ TWP pẹ̀lú ọlá jíjinlẹ̀
// @description:ha    Mafi ƙarfin mai fassara shafukan yanar gizo a duniya! Harsuna biyu gefe da gefe / fassara kawai / asali — hanyoyin nuna 3 nan take · Injuna 3 Google/Microsoft/Tencent · Yana aiki a Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur da duk masu binciken Chromium · Harsuna 249 · An sake gina a kan injin TWP tare da girmamawa mai zurfi
// @description:ig    Onye ntụgharị asụsụ ibe weebụ kachasị ike n'ụwa! Asụsụ abụọ n'akụkụ / ntụgharị asụsụ naanị / nke mbụ — ụzọ ngosipụta 3 na-agbanwe ozugbo · Injin 3 Google/Microsoft/Tencent · Ọ na-arụ ọrụ na Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur na ihe nchọgharị Chromium niile · Asụsụ 249 · Ewugharịrị na injin TWP nwere nsọpụrụ miri emi
// @description:zu    Umhumushi wamakhasi ewebhu onamandla kunawo wonke emhlabeni! Izilimi ezimbili eceleni / ukuhumusha kuphela / okwangempela — izindlela zokubonisa ezi-3 zishintsha ngokushesha · Izinjini ezi-3 Google/Microsoft/Tencent · Kusebenza ku-Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur nazo zonke iziphequluli ze-Chromium · Izilimi ezingu-249 · Kwakhiwe kabusha phezu kwenjini ye-TWP ngokuhlonipha okujulile
// @description:mg    Mpandika fiteny pejy tranonkala matanjaka indrindra eran-tany! Roa teny anilany / dikanteny ihany / tany am-boalohany — fomba fampisehoana 3 mifandimby vetivety · Motera 3 Google/Microsoft/Tencent · Mandeha amin'ny Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur sy ny navigateur Chromium rehetra · 249 fiteny · Naorina teo ambonin'ny motera TWP miaraka amin'ny fanajana lalina
// @description:eo    La plej potenca tradukilo de retpaĝoj en la mondo! Dulingva flanko ĉe flanko / nur traduko / originalo — 3 montraj reĝimoj ŝanĝiĝas tuje · 3 motoroj Google/Microsoft/Tencent · Funkcias ĉe Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur kaj ĉiuj Chromium retumiloj · 249 lingvoj · Rekonstruita sur TWP-motoro kun profunda respekto
// @description:la    Potentissimus interpres paginarum interretialium in mundo! Bilinguis iuxta / sola translatio / originale — 3 modi ostendendi statim · 3 motores Google/Microsoft/Tencent · Operatur in Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur et omnibus Chromium navigatris · 249 linguae · Super TWP motore cum profundo honore reconstructum
// @description:he    המתרגם החזק ביותר בעולם לדפי אינטרנט! דו-לשוני זה לצד זה / תרגום בלבד / מקור — 3 מצבי תצוגה מתחלפים מיידית · 3 מנועים Google/Microsoft/Tencent · עובד ב-Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur ובכל דפדפני Chromium · 249 שפות · נבנה מחדש על מנוע TWP עם כבוד עמוק
// @description:gu    વિશ્વનો સૌથી શક્તિશાળી વેબપેજ અનુવાદક! દ્વિભાષી બાજુ બાજુ / માત્ર અનુવાદ / મૂળ — 3 ડિસ્પ્લે મોડ તાત્કાલિક · 3 એન્જિન Google/Microsoft/Tencent · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur અને તમામ Chromium બ્રાઉઝર્સ પર કામ કરે છે · 249 ભાષાઓ · TWP એન્જિન પર ઊંડા સન્માન સાથે પુનર્નિર્મિત
// @description:mr    जगातील सर्वात शक्तिशाली वेबपेज अनुवादक! द्विभाषी शेजारी शेजारी / फक्त अनुवाद / मूळ — 3 प्रदर्शन मोड तात्काळ · 3 इंजिन Google/Microsoft/Tencent · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur आणि सर्व Chromium ब्राउझर्सवर काम करते · 249 भाषा · TWP इंजिनवर खोल आदराने पुनर्निर्मित
// @description:pa    ਦੁਨੀਆ ਦਾ ਸਭ ਤੋਂ ਸ਼ਕਤੀਸ਼ਾਲੀ ਵੈੱਬਪੇਜ ਅਨੁਵਾਦਕ! ਦੋਭਾਸ਼ੀ ਨਾਲ ਨਾਲ / ਸਿਰਫ਼ ਅਨੁਵਾਦ / ਮੂਲ — 3 ਡਿਸਪਲੇ ਮੋਡ ਤੁਰੰਤ · 3 ਇੰਜਣ Google/Microsoft/Tencent · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur ਅਤੇ ਸਾਰੇ Chromium ਬ੍ਰਾਊਜ਼ਰਾਂ ਤੇ ਕੰਮ ਕਰਦਾ ਹੈ · 249 ਭਾਸ਼ਾਵਾਂ · TWP ਇੰਜਣ ਤੇ ਡੂੰਘੇ ਸਤਿਕਾਰ ਨਾਲ ਮੁੜ ਨਿਰਮਿਤ
// @description:kn    ವಿಶ್ವದ ಅತ್ಯಂತ ಶಕ್ತಿಶಾಲಿ ವೆಬ್‌ಪೇಜ್ ಅನುವಾದಕ! ದ್ವಿಭಾಷಾ ಪಕ್ಕಪಕ್ಕ / ಅನುವಾದ ಮಾತ್ರ / ಮೂಲ — 3 ಪ್ರದರ್ಶನ ಮೋಡ್‌ಗಳು ತಕ್ಷಣ · 3 ಎಂಜಿನ್‌ಗಳು Google/Microsoft/Tencent · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur ಮತ್ತು ಎಲ್ಲಾ Chromium ಬ್ರೌಸರ್‌ಗಳಲ್ಲಿ ಕೆಲಸ ಮಾಡುತ್ತದೆ · 249 ಭಾಷೆಗಳು · TWP ಎಂಜಿನ್‌ನಲ್ಲಿ ಆಳವಾದ ಗೌರವದಿಂದ ಪುನರ್ನಿರ್ಮಿಸಲಾಗಿದೆ
// @description:ml    ലോകത്തിലെ ഏറ്റവും ശക്തമായ വെബ്‌പേജ് പരിഭാഷകൻ! ദ്വിഭാഷ അരികിലരികിൽ / പരിഭാഷ മാത്രം / യഥാർത്ഥം — 3 ഡിസ്‌പ്ലേ മോഡുകൾ തൽക്ഷണം · 3 എഞ്ചിനുകൾ Google/Microsoft/Tencent · Via, Safari, Chrome, Firefox, Edge, Kiwi, Lemur എന്നിവയിലും എല്ലാ Chromium ബ്രൗസറുകളിലും പ്രവർത്തിക്കുന്നു · 249 ഭാഷകൾ · TWP എഞ്ചിനിൽ ആഴമായ ആദരവോടെ പുനർനിർമ്മിച്ചു
// @match        *://*/*
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_registerMenuCommand
// @connect      translate.googleapis.com
// @connect      translate-pa.googleapis.com
// @connect      edge.microsoft.com
// @connect      api-edge.cognitive.microsofttranslator.com
// @connect      transmart.qq.com
// @run-at       document-start
// ==/UserScript==

(async () => {
  'use strict';

  try { if (document.contentType === 'application/xml') return } catch (_) {}

  // ══════════════════════════════════════════════════════════
  // 配置并行读取
  // ══════════════════════════════════════════════════════════
  const deviceLang = (navigator.language || navigator.userLanguage || 'zh-CN').split('-')[0];
  const [
    _engine,
    _targetLang,
    _autoMode,
    _excludedHosts,
    _displayMode
  ] = await Promise.all([
    GM_getValue('engine', 'google'),
    GM_getValue('targetLang', deviceLang === 'zh' ? 'zh-CN' : deviceLang),
    GM_getValue('autoMode', true),
    GM_getValue('excludedHosts', '[]'),
    GM_getValue('displayMode', 'translated')
  ]);

  let currentEngine = _engine;
  let targetLang = _targetLang;
  let autoMode = _autoMode;
  let excludedHosts = JSON.parse(_excludedHosts);
  let displayMode = _displayMode; // 'translated' | 'bilingual' | 'original'

  if (excludedHosts.includes(location.host)) return;

  // ══════════════════════════════════════════════════════════
  // 语言列表(原封不动)
  // ══════════════════════════════════════════════════════════

  const ALL_LANGUAGES = {
    "zh-CN": "中文(简体)", "zh-TW": "中文(繁體)", "en": "English",
    "ja": "日本語", "ko": "한국어", "fr": "Français", "de": "Deutsch",
    "es": "Español", "ru": "Русский", "pt": "Português", "pt-PT": "Português (Portugal)",
    "ar": "العربية", "th": "ไทย", "vi": "Tiếng Việt", "it": "Italiano",
    "tr": "Türkçe", "id": "Indonesia", "ms": "Bahasa Melayu", "nl": "Nederlands",
    "pl": "Polski", "uk": "Українська", "cs": "Čeština", "sk": "Slovenčina",
    "hu": "Magyar", "ro": "Română", "bg": "Български", "hr": "Hrvatski",
    "sr": "Српски", "sl": "Slovenščina", "lt": "Lietuvių", "lv": "Latviešu",
    "et": "Eesti", "fi": "Suomi", "sv": "Svenska", "da": "Dansk",
    "no": "Norsk", "is": "Íslenska", "el": "Ελληνικά", "he": "עברית",
    "hi": "हिन्दी", "bn": "বাংলা", "ta": "தமிழ்", "te": "తెలుగు",
    "kn": "ಕನ್ನಡ", "ml": "മലയാളം", "pa": "ਪੰਜਾਬੀ", "gu": "ગુજરાતી",
    "mr": "मराठी", "ne": "नेपाली", "si": "සිංහල", "ur": "اردو",
    "fa": "فارسی", "ps": "پښتو", "my": "မြန်မာ", "km": "ខ្មែរ",
    "lo": "ລາວ", "ka": "ქართული", "hy": "Հայերեն", "az": "Azərbaycan",
    "kk": "Қазақ", "uz": "Oʻzbek", "mn": "Монгол", "sq": "Shqip",
    "mk": "Македонски", "be": "Беларуская", "bs": "Bosanski",
    "ca": "Català", "gl": "Galego", "eu": "Euskara", "mt": "Malti",
    "cy": "Cymraeg", "ga": "Gaeilge", "gd": "Gàidhlig", "lb": "Lëtzebuergesch",
    "af": "Afrikaans", "sw": "Kiswahili", "ha": "Hausa", "ig": "Igbo",
    "yo": "Yorùbá", "zu": "isiZulu", "xh": "isiXhosa", "sn": "chiShona",
    "st": "Sesotho", "so": "Soomaali", "am": "አማርኛ", "ti": "ትግርኛ",
    "om": "Oromoo", "mg": "Malagasy", "ny": "Chichewa", "lg": "Luganda",
    "rw": "Kinyarwanda", "tg": "Тоҷикӣ", "tk": "Türkmen", "ky": "Кыргызча",
    "tt": "Татар", "eo": "Esperanto", "la": "Latina", "co": "Corsu",
    "fy": "Frysk", "haw": "ʻŌlelo Hawaiʻi", "sm": "Gagana Samoa",
    "mi": "Te Reo Māori", "ceb": "Cebuano", "fil": "Filipino",
    "jv": "Basa Jawa", "su": "Basa Sunda", "hmn": "Hmong",
    "ht": "Kreyòl Ayisyen", "ku": "Kurdî", "ckb": "کوردی",
    "sd": "سنڌي", "or": "ଓଡ଼ିଆ", "as": "অসমীয়া",
    "sa": "संस्कृतम्", "mai": "मैथिली", "bho": "भोजपुरी",
    "doi": "डोगरी", "ug": "ئۇيغۇرچە", "dv": "ދިވެހި",
    "ak": "Akan", "ee": "Eʋegbe", "gn": "Guarani", "ay": "Aymar",
    "bm": "Bamanankan", "ln": "Lingála", "nso": "Sepedi",
    "ts": "Xitsonga", "qu": "Runasimi", "ilo": "Ilokano",
    "kri": "Krio", "lus": "Mizo tawng", "mni-Mtei": "ꯃꯤꯇꯩꯂꯣꯟ",
    "gom": "कोंकणी",
    "ab": "Аԥсуа", "ace": "Bahsa Acèh", "ach": "Lwo", "aa": "Qafaraf",
    "alz": "Alur", "av": "Авар", "awa": "अवधी", "ban": "ᬩᬮᬶ",
    "bal": "بلوچی", "bci": "Baoulé", "ba": "Башҡорт", "btx": "Batak Karo",
    "bts": "Batak Simalungun", "bbc": "Batak Toba", "bem": "Bemba", "bew": "Betawi",
    "bik": "Bikol", "br": "Brezhoneg", "bua": "Буряад", "yue": "粵語",
    "ch": "Chamoru", "ce": "Нохчийн", "chk": "Chuukese", "cv": "Чӑваш",
    "crh": "Qırımtatar", "prs": "دری", "din": "Thuɔŋjäŋ",
    "dov": "Dombe", "dyu": "Julakan", "dz": "རྫོང་ཁ", "fo": "Føroyskt",
    "fj": "Na Vosa Vakaviti", "fon": "Fɔ̀ngbè", "fr-CA": "Français (Canada)",
    "fur": "Furlan", "ff": "Pulaar", "gaa": "Gã", "cnh": "Lai",
    "hil": "Hiligaynon", "hrx": "Hunsrik", "iba": "Iban",
    "iu-Latn": "ᐃᓄᒃᑎᑐᑦ (Latin)", "jam": "Jamaican Patois",
    "kac": "Jingpo", "kl": "Kalaallisut", "kr": "Kanuri", "pam": "Kapampangan",
    "kha": "Khasi", "cgg": "Rukiga", "kg": "Kikongo", "mkw": "Kituba",
    "trp": "Kokborok", "kv": "Коми", "ltg": "Latgaļu", "lij": "Lìgure",
    "li": "Limburgs", "lmo": "Lombard", "luo": "Dholuo", "mad": "Madhurâ",
    "mak": "Makassar", "ms-Arab": "بهاس ملايو", "mam": "Mam", "gv": "Gaelg",
    "mh": "Kajin Majōl", "mwr": "मारवाड़ी", "mfe": "Kreol Morisien",
    "chm": "Марий", "min": "Minangkabau", "nhe": "Nahuatl",
    "ndc-ZW": "Ndau", "nr": "isiNdebele", "new": "नेपाल भाषा", "nqo": "ߒߞߏ",
    "nus": "Thok Nath", "oc": "Occitan", "os": "Ирон", "pag": "Pangasinan",
    "pap": "Papiamento", "pa-Arab": "پنجابی", "kek": "Qʼeqchiʼ", "rom": "Romani",
    "rn": "Ikirundi", "se": "Davvisámegiella", "sg": "Sängö", "bo": "བོད་ཡིག",
    "dsb": "Dolnoserbšćina", "hsb": "Hornjoserbšćina", "ikt": "Inuinnaqtun",
    "iu": "ᐃᓄᒃᑎᑐᑦ", "lzh": "文言文", "mvf": "ᠮᠣᠩᠭᠣᠯ",
    "brx": "बर'", "hne": "छत्तीसगढ़ी", "ks": "कॉशुर", "mrj": "Мары",
    "sa-Latn": "Sanskrit (Latin)", "sc": "Sardu", "scn": "Sicilianu",
    "szl": "Ślůnski", "su-Latn": "Sunda (Latin)", "tcy": "ತುಳು",
    "vec": "Vèneto", "war": "Winaray", "wo": "Wolof", "zap": "Zapotec",
    "ms-Latn": "Malay (Latin)"
  };

  const LANG_GROUPS = {
    "常用": ["zh-CN","zh-TW","en","ja","ko","fr","de","es","ru","pt","ar","th","vi","it","tr","id"],
    "欧洲": ["nl","pl","uk","cs","sk","hu","ro","bg","hr","sr","sl","lt","lv","et","fi","sv","da","no","is","el","be","bs","ca","gl","eu","mt","cy","ga","gd","lb","af","eo","la","co","fy","fo","br","oc","sc","scn","szl","fur","lij","lmo","li","vec","ltg","dsb","hsb","gv","se"],
    "亚洲": ["hi","bn","ta","te","kn","ml","pa","gu","mr","ne","si","ur","fa","ps","my","km","lo","ka","hy","az","kk","uz","mn","tg","tk","ky","tt","ug","dv","or","as","sa","mai","bho","doi","mni-Mtei","gom","awa","ks","brx","hne","mwr","trp","kac","bo","dz","yue","lzh","ms","fil","ceb","jv","su","hmn","ilo","hil","bik","pam","pag","war","ban","mad","mak","min","ace","btx","bts","bbc","bew","iba","ms-Arab","kha"],
    "非洲": ["sw","ha","ig","yo","zu","xh","sn","st","so","am","ti","om","mg","ny","lg","rw","ak","ee","bm","ln","nso","ts","kri","wo","ff","gaa","fon","bci","dyu","bem","luo","sg","kg","mkw","dov","nus","din","ach","alz","ndc-ZW","nr","rn","mfe"],
    "美洲/大洋洲": ["pt-PT","fr-CA","ht","qu","gn","ay","haw","sm","mi","fj","mh","ch","chk","jam","nhe","mam","kek","pap","hrx","ikt","iu","iu-Latn","kl"],
    "其他": ["ab","av","ba","bua","ce","cv","crh","kv","chm","mrj","os","rom","nqo","aa","bal","cnh","kr","prs","pa-Arab","sd","ckb","ku","he"]
  };

  // ══════════════════════════════════════════════════════════
  // TWP核心引擎代码(你的原版,一字不动)
  // ══════════════════════════════════════════════════════════

  const GoogleHelper_v2 = {
    _lastRequestAuthTime: null,
    _translateAuth: null,
    _authNotFound: false,
    _authPromise: null,

    get translateAuth() { return this._translateAuth; },

    _getAlternativeKey() {
      return new TextDecoder().decode(new Uint8Array([
        65,73,122,97,83,121,65,84,66,88,97,106,118,122,81,
        76,84,68,72,69,81,98,99,112,113,48,73,104,101,48,
        118,87,68,72,109,79,53,50,48
      ]));
    },

    async findAuth() {
      if (this._authPromise) return await this._authPromise;
      this._authPromise = new Promise((resolve) => {
        let needUpdate = false;
        if (this._lastRequestAuthTime) {
          const d = new Date();
          if (this._translateAuth) d.setMinutes(d.getMinutes() - 20);
          else if (this._authNotFound) d.setMinutes(d.getMinutes() - 5);
          else d.setMinutes(d.getMinutes() - 1);
          if (d.getTime() > this._lastRequestAuthTime) needUpdate = true;
        } else {
          needUpdate = true;
        }

        if (needUpdate) {
          this._lastRequestAuthTime = Date.now();
          const altKey = this._getAlternativeKey();
          GM_xmlhttpRequest({
            method: 'GET',
            url: 'https://translate.googleapis.com/_/translate_http/_/js/k=translate_http.tr.en_US.YusFYy3P_ro.O/am=AAg/d=1/exm=el_conf/ed=1/rs=AN8SPfq1Hb8iJRleQqQc8zhdzXmF9E56eQ/m=el_main',
            timeout: 8000,
            onload: (r) => {
              if (r.responseText && r.responseText.length > 1) {
                const m = r.responseText.match(/['"]x-goog-api-key['"]\s*:\s*['"](\w{39})['"]/i);
                if (m && m.length === 2) {
                  this._translateAuth = m[1];
                  this._authNotFound = false;
                } else {
                  this._authNotFound = true;
                  this._translateAuth = altKey;
                }
              } else {
                this._authNotFound = true;
                this._translateAuth = altKey;
              }
              resolve();
            },
            onerror: () => { this._translateAuth = altKey; resolve(); },
            ontimeout: () => { this._translateAuth = altKey; resolve(); }
          });
        } else {
          resolve();
        }
      });
      const p = this._authPromise;
      p.finally(() => { this._authPromise = null; });
      return await p;
    }
  };

  // Auth预加载
  const authReady = GoogleHelper_v2.findAuth().catch(() => {});

  const GoogleHelper = {
    googleTranslateTKK: "448487.932609646",
    shiftLeftOrRightThenSumOrXor(num, optString) {
      for (let i = 0; i < optString.length - 2; i += 3) {
        let acc = optString.charAt(i + 2);
        acc = ("a" <= acc) ? acc.charCodeAt(0) - 87 : Number(acc);
        acc = (optString.charAt(i + 1) === "+") ? num >>> acc : num << acc;
        num = (optString.charAt(i) === "+") ? (num + acc) & 4294967295 : num ^ acc;
      }
      return num;
    },
    transformQuery(query) {
      const b = [];
      let idx = 0;
      for (let i = 0; i < query.length; i++) {
        let c = query.charCodeAt(i);
        if (128 > c) { b[idx++] = c; }
        else {
          if (2048 > c) { b[idx++] = (c >> 6) | 192; }
          else {
            if (55296 === (c & 64512) && i + 1 < query.length && 56320 === (query.charCodeAt(i + 1) & 64512)) {
              c = 65536 + ((c & 1023) << 10) + (query.charCodeAt(++i) & 1023);
              b[idx++] = (c >> 18) | 240;
              b[idx++] = ((c >> 12) & 63) | 128;
            } else { b[idx++] = (c >> 12) | 224; }
            b[idx++] = ((c >> 6) & 63) | 128;
          }
          b[idx++] = (c & 63) | 128;
        }
      }
      return b;
    },
    calcHash(query) {
      const s = this.googleTranslateTKK.split(".");
      const tkkIdx = Number(s[0]) || 0;
      const tkkKey = Number(s[1]) || 0;
      const bytes = this.transformQuery(query);
      let enc = tkkIdx;
      for (const item of bytes) { enc += item; enc = this.shiftLeftOrRightThenSumOrXor(enc, "+-a^+6"); }
      enc = this.shiftLeftOrRightThenSumOrXor(enc, "+-3^+b+-f");
      enc ^= tkkKey;
      if (enc <= 0) enc = (enc & 2147483647) + 2147483648;
      const n = enc % 1000000;
      return n.toString() + "." + (n ^ tkkIdx);
    }
  };

  const Utils = {
    escapeHTML(t) { const d = document.createElement('div'); d.appendChild(document.createTextNode(t)); return d.innerHTML; },
    unescapeHTML(t) { const d = new DOMParser().parseFromString(t, 'text/html'); return d.documentElement.textContent; }
  };

  function gmFetch(opts) {
    return new Promise((resolve, reject) => {
      GM_xmlhttpRequest({ timeout: 20000, ...opts, onload: resolve, onerror: reject, ontimeout: reject });
    });
  }

  // ══════════════════════════════════════════════════════════
  // 引擎定义(你的原版,一字不动)
  // ══════════════════════════════════════════════════════════

  const Engine = {
    google_v2: {
      name: 'Google (TWP v2)',
      _fixLang(lang) { return lang === "prs" ? "fa-AF" : lang; },
      _transformResponse(result, dontSort) {
        if (result.indexOf("<pre>") !== -1) {
          result = result.replace("<pre>", "");
          const i = result.indexOf(">");
          result = result.slice(i + 1);
        }
        const sentences = [];
        let idx = 0;
        while (true) {
          const s = result.indexOf("<b>", idx);
          if (s === -1) break;
          const e = result.indexOf("</b>", s);
          if (e === -1) { sentences.push(result.slice(s + 3)); break; }
          else { sentences.push(result.slice(s + 3, e)); }
          idx = e;
        }
        result = sentences.length > 0 ? sentences.join(" ") : result;
        result = result.replace(/<\/b>/g, "");
        let resultArray = [];
        let lastEnd = 0;
        for (const r of result.matchAll(/(<a i="[0-9]+">)([^<>]*(?=<\/a>))*/g)) {
          const fl = r[0].length, pos = r.index;
          if (pos > lastEnd) {
            resultArray.push(r[1] + result.slice(lastEnd, pos).replace(/<\/a>/g, "") + (r[2] || ""));
          } else { resultArray.push(r[0]); }
          lastEnd = pos + fl;
        }
        let indexes;
        if (resultArray.length > 0) {
          indexes = resultArray.map(v => parseInt(v.match(/[0-9]+(?=>)/g)?.[0])).filter(v => !isNaN(v));
          resultArray = resultArray.map(v => v.slice(v.indexOf(">") + 1));
        } else { resultArray = [result]; indexes = [0]; }
        resultArray = resultArray.map(v => Utils.unescapeHTML(v));
        if (dontSort) return resultArray;
        const final = [];
        for (const j in indexes) {
          if (final[indexes[j]]) final[indexes[j]] += " " + resultArray[j];
          else final[indexes[j]] = resultArray[j];
        }
        return final;
      },

      async translate(text, toLang) {
        const to = this._fixLang(toLang);
        await GoogleHelper_v2.findAuth();
        if (!GoogleHelper_v2.translateAuth) throw new Error('No auth');
        const r = await gmFetch({
          method: 'POST',
          url: 'https://translate-pa.googleapis.com/v1/translateHtml',
          headers: { 'Content-Type': 'application/json+protobuf', 'X-Goog-Api-Key': GoogleHelper_v2.translateAuth },
          data: JSON.stringify([[[text], "auto", to], "te"]),
        });
        if (r.status !== 200) throw new Error('v2 error: ' + r.status);
        const data = JSON.parse(r.responseText);
        if (data && data[0]) {
          const raw = Array.isArray(data[0]) ? data[0][0] : data[0];
          const parsed = this._transformResponse(raw, false);
          return parsed[0] || raw;
        }
        throw new Error('v2 empty');
      },

      async translateBatch(texts, toLang) {
        const to = this._fixLang(toLang);
        await GoogleHelper_v2.findAuth();
        if (!GoogleHelper_v2.translateAuth) throw new Error('No auth');
        const r = await gmFetch({
          method: 'POST',
          url: 'https://translate-pa.googleapis.com/v1/translateHtml',
          headers: { 'Content-Type': 'application/json+protobuf', 'X-Goog-Api-Key': GoogleHelper_v2.translateAuth },
          data: JSON.stringify([[texts, "auto", to], "te"]),
        });
        if (r.status !== 200) throw new Error('v2 batch error: ' + r.status);
        const data = JSON.parse(r.responseText);
        if (data && data[0] && Array.isArray(data[0])) {
          return data[0].map(item => {
            const p = this._transformResponse(item, false);
            return p[0] || item;
          });
        }
        if (data && data[0]) {
          const p = this._transformResponse(Array.isArray(data[0]) ? data[0][0] : data[0], false);
          return [p[0]];
        }
        throw new Error('v2 batch empty');
      }
    },

    google_legacy: {
      name: 'Google (Legacy)',
      langCode(l) { return l; },
      async translate(text, toLang) {
        const to = toLang;
        const tk = GoogleHelper.calcHash(text);
        const r = await gmFetch({
          method: 'GET',
          url: 'https://translate.googleapis.com/translate_a/single?client=webapp&sl=auto&tl=' + to + '&hl=' + to + '&dt=t&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=at&ie=UTF-8&oe=UTF-8&otf=1&ssel=0&tsel=0&kc=7&tk=' + tk + '&q=' + encodeURIComponent(text),
        });
        if (r.status !== 200) return await this._gtx(text, to);
        const data = JSON.parse(r.responseText);
        return data[0].filter(s => s && s[0]).map(s => s[0]).join('');
      },
      async _gtx(text, to) {
        const r = await gmFetch({ method: 'GET', url: 'https://translate.googleapis.com/translate_a/single?client=gtx&dt=t&sl=auto&tl=' + to + '&q=' + encodeURIComponent(text) });
        if (r.status !== 200) throw new Error('gtx error');
        const data = JSON.parse(r.responseText);
        return data[0].filter(s => s && s[0]).map(s => s[0]).join('');
      }
    },

    google: {
      name: 'Google (Auto)',
      async translate(text, toLang) {
        try { return await Engine.google_v2.translate(text, toLang); }
        catch (e) { return await Engine.google_legacy.translate(text, toLang); }
      },
      async translateBatch(texts, toLang) {
        try { return await Engine.google_v2.translateBatch(texts, toLang); }
        catch (e) {
          const res = [];
          for (const t of texts) {
            try { res.push(await Engine.google_legacy.translate(t, toLang)); }
            catch (_) { res.push(null); }
          }
          return res;
        }
      }
    },

    microsoft: {
      name: 'Microsoft',
      _token: null, _tokenTime: 0,
      async getToken() {
        if (this._token && Date.now() - this._tokenTime < 480000) return this._token;
        const r = await gmFetch({ method: 'GET', url: 'https://edge.microsoft.com/translate/auth' });
        if (r.status !== 200) throw new Error('MS auth');
        this._token = r.responseText; this._tokenTime = Date.now();
        return this._token;
      },
      langCode(l) {
        const m = { 'zh': 'zh-Hans', 'zh-CN': 'zh-Hans', 'zh-TW': 'zh-Hant', 'no': 'nb', 'sr': 'sr-Cyrl', 'pt-PT': 'pt-pt', 'fr-CA': 'fr-ca' };
        return m[l] || l;
      },
      async translate(text, toLang) {
        const token = await this.getToken();
        const to = this.langCode(toLang);
        const r = await gmFetch({
          method: 'POST',
          url: 'https://api-edge.cognitive.microsofttranslator.com/translate?from=&to=' + to + '&api-version=3.0',
          headers: { 'authorization': 'Bearer ' + token, 'Content-Type': 'application/json' },
          data: JSON.stringify([{ Text: text }]),
        });
        if (r.status !== 200) throw new Error('MS error');
        return JSON.parse(r.responseText)[0].translations[0].text;
      },
      async translateBatch(texts, toLang) {
        const token = await this.getToken();
        const to = this.langCode(toLang);
        const results = [];
        for (let b = 0; b < texts.length; b += 25) {
          const chunk = texts.slice(b, b + 25);
          const r = await gmFetch({
            method: 'POST',
            url: 'https://api-edge.cognitive.microsofttranslator.com/translate?from=&to=' + to + '&api-version=3.0',
            headers: { 'authorization': 'Bearer ' + token, 'Content-Type': 'application/json' },
            data: JSON.stringify(chunk.map(t => ({ Text: t }))),
          });
          if (r.status === 200) {
            for (const item of JSON.parse(r.responseText)) results.push(item.translations[0].text);
          } else { for (let i = 0; i < chunk.length; i++) results.push(null); }
        }
        return results;
      }
    },

    tencent: {
      name: 'Tencent',
      _clientKey: null,
      getClientKey() {
        if (this._clientKey) return this._clientKey;
        this._clientKey = 'browser-chrome-120.0-Windows_10-' + crypto.randomUUID() + '-' + Date.now();
        return this._clientKey;
      },
      langCode(l) { const m = { 'zh': 'zh', 'zh-CN': 'zh', 'zh-TW': 'zh-TW' }; return m[l] || l; },
      async translate(text, toLang) {
        const to = this.langCode(toLang);
        const r = await gmFetch({
          method: 'POST', url: 'https://transmart.qq.com/api/imt',
          headers: { 'Content-Type': 'application/json' },
          data: JSON.stringify({ header: { fn: 'auto_translation', session: '', client_key: this.getClientKey(), user: '' }, type: 'plain', model_category: 'normal', text_domain: 'general', source: { lang: 'auto', text_list: [text] }, target: { lang: to } }),
        });
        if (r.status !== 200) throw new Error('Tencent error');
        return JSON.parse(r.responseText).auto_translation[0];
      },
      async translateBatch(texts, toLang) {
        const to = this.langCode(toLang);
        const r = await gmFetch({
          method: 'POST', url: 'https://transmart.qq.com/api/imt',
          headers: { 'Content-Type': 'application/json' },
          data: JSON.stringify({ header: { fn: 'auto_translation', session: '', client_key: this.getClientKey(), user: '' }, type: 'plain', model_category: 'normal', text_domain: 'general', source: { lang: 'auto', text_list: texts }, target: { lang: to } }),
        });
        if (r.status !== 200) throw new Error('Tencent batch error');
        return JSON.parse(r.responseText).auto_translation;
      }
    }
  };

  // ══════════════════════════════════════════════════════════
  // 缓存层(原封不动)
  // ══════════════════════════════════════════════════════════
  const cache = new Map();
  const MAX_CACHE = 3000;
  function cacheGet(t) { return cache.get(t); }
  function cacheSet(t, v) { if (cache.size >= MAX_CACHE) cache.delete(cache.keys().next().value); cache.set(t, v); }

  // ══════════════════════════════════════════════════════════
  // 翻译核心(原封不动)
  // ══════════════════════════════════════════════════════════
  async function translate(text) {
    if (!text || !text.trim()) return null;
    const trimmed = text.trim();
    if (/^\d+$/.test(trimmed)) return null;
    const cached = cacheGet(trimmed);
    if (cached) return cached;
    try {
      const result = await Engine[currentEngine].translate(trimmed, targetLang);
      if (result && result !== trimmed) { cacheSet(trimmed, result); return result; }
    } catch (e) {
      const fallbackEngine = currentEngine === 'google' ? 'microsoft' : 'google_legacy';
      try {
        const result = await Engine[fallbackEngine].translate(trimmed, targetLang);
        if (result && result !== trimmed) { cacheSet(trimmed, result); return result; }
      } catch (_) {}
    }
    return null;
  }

  // ══════════════════════════════════════════════════════════
  // 批量翻译(原封不动)
  // ══════════════════════════════════════════════════════════
  async function batchTranslate(texts) {
    const results = new Array(texts.length).fill(null);
    const uncached = [], uncachedIdx = [];
    for (let i = 0; i < texts.length; i++) {
      const t = texts[i].trim();
      if (!t || /^\d+$/.test(t)) continue;
      const c = cacheGet(t);
      if (c) { results[i] = c; continue; }
      uncached.push(t);
      uncachedIdx.push(i);
    }
    if (uncached.length === 0) return results;

    const engine = Engine[currentEngine];
    if (engine.translateBatch && uncached.length > 1) {
      try {
        const BATCH_SIZE = currentEngine === 'microsoft' ? 25 : 50;
        const chunks = [];
        for (let b = 0; b < uncached.length; b += BATCH_SIZE) {
          chunks.push({ texts: uncached.slice(b, b + BATCH_SIZE), idxs: uncachedIdx.slice(b, b + BATCH_SIZE) });
        }
        await Promise.all(chunks.map(async ({ texts: chunk, idxs }) => {
          try {
            const batchResults = await engine.translateBatch(chunk, targetLang);
            if (batchResults) {
              for (let j = 0; j < batchResults.length; j++) {
                if (batchResults[j] && batchResults[j] !== chunk[j]) {
                  cacheSet(chunk[j], batchResults[j]);
                  results[idxs[j]] = batchResults[j];
                }
              }
            }
          } catch (_) {}
        }));
        return results;
      } catch (e) { /* fallthrough */ }
    }

    const CONCURRENCY = 8;
    for (let i = 0; i < uncached.length; i += CONCURRENCY) {
      const batch = uncached.slice(i, i + CONCURRENCY);
      const batchIdx = uncachedIdx.slice(i, i + CONCURRENCY);
      await Promise.allSettled(batch.map(async (text, j) => {
        const r = await translate(text);
        if (r) results[batchIdx[j]] = r;
      }));
    }
    return results;
  }

  // ══════════════════════════════════════════════════════════
  // DOM遍历(原封不动,只加了 tu-bi 跳过)
  // ══════════════════════════════════════════════════════════
  const SKIP_TAGS = /^(script|style|code|pre|svg|math|noscript|iframe|canvas|video|audio|img|br|hr|input|select|option|textarea)$/i;
  const SKIP_CLASS = /translate-ui|notranslate|katex|mathjax/i;

  function shouldSkip(node) {
    if (!node) return true;
    if (node.nodeType === Node.ELEMENT_NODE) {
      if (SKIP_TAGS.test(node.tagName)) return true;
      if (SKIP_CLASS.test(node.className)) return true;
      if (node.isContentEditable) return true;
      if (node.dataset && node.dataset.translated) return true;
      if (node.classList && node.classList.contains('tu-bi')) return true;
    }
    return false;
  }

  const _langRegex = {};
  function getLangRegex(lang) {
    if (_langRegex[lang]) return _langRegex[lang];
    const patterns = {
      'zh': /^[\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff\s\d\p{P}]+$/u,
      'en': /^[a-zA-Z\s\d\p{P}]+$/u,
      'ja': /^[\u3040-\u309f\u30a0-\u30ff\u4e00-\u9fff\s\d\p{P}]+$/u,
      'ko': /^[\uac00-\ud7af\u1100-\u11ff\s\d\p{P}]+$/u,
      'ar': /^[\u0600-\u06ff\u0750-\u077f\s\d\p{P}]+$/u,
      'th': /^[\u0e00-\u0e7f\s\d\p{P}]+$/u,
      'ru': /^[\u0400-\u04ff\s\d\p{P}]+$/u,
    };
    _langRegex[lang] = patterns[lang] || null;
    return _langRegex[lang];
  }

  function isTargetLang(text) {
    if (!text || !text.trim()) return true;
    const lang = targetLang.split('-')[0];
    const re = getLangRegex(lang);
    return re ? re.test(text.trim()) : false;
  }

  function collectTextNodes(root) {
    const nodes = [];
    const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {
      acceptNode(node) {
        if (shouldSkip(node.parentElement)) return NodeFilter.FILTER_REJECT;
        const text = node.textContent.trim();
        if (!text || text.length < 2 || /^\d+$/.test(text)) return NodeFilter.FILTER_REJECT;
        if (isTargetLang(text)) return NodeFilter.FILTER_REJECT;
        if (node.parentElement?.dataset?.translated) return NodeFilter.FILTER_REJECT;
        return NodeFilter.FILTER_ACCEPT;
      }
    });
    while (walker.nextNode()) nodes.push(walker.currentNode);
    return nodes;
  }

  function collectPlaceholders(root) {
    return [...root.querySelectorAll('input[placeholder], textarea[placeholder]')]
      .filter(el => !el.dataset.translated && el.placeholder.trim() && !isTargetLang(el.placeholder));
  }

  // ══════════════════════════════════════════════════════════
  // 翻译执行 — 这里是唯一改动点
  // 原版: node.textContent = results[i]
  // 新增: 双语模式多追加一个span,原文不动
  // ══════════════════════════════════════════════════════════
  let isTranslating = false;
  let pendingRoot = null;

  async function translatePage(root) {
    if (isTranslating) {
      pendingRoot = root || document.body;
      return;
    }
    isTranslating = true;

    try {
      root = root || document.body;

      do {
        pendingRoot = null;
        const textNodes = collectTextNodes(root);
        const placeholders = collectPlaceholders(root);

        if (textNodes.length === 0 && placeholders.length === 0) break;

        const allTexts = [];
        const allMeta = [];

        for (let i = 0; i < textNodes.length; i++) {
          allTexts.push(textNodes[i].textContent.trim());
          allMeta.push({ type: 'text', node: textNodes[i] });
        }
        for (let i = 0; i < placeholders.length; i++) {
          allTexts.push(placeholders[i].placeholder.trim());
          allMeta.push({ type: 'ph', el: placeholders[i] });
        }

        const results = await batchTranslate(allTexts);

        for (let i = 0; i < allMeta.length; i++) {
          if (!results[i]) continue;
          const meta = allMeta[i];
          if (meta.type === 'text') {
            const parent = meta.node.parentElement;
            if (!parent) continue;
            if (!parent.dataset.originalText) parent.dataset.originalText = meta.node.textContent;
            parent.dataset.translated = '1';

            // ★ 这就是唯一的改动 ★
            if (displayMode === 'bilingual') {
              // 双语:原文保留,追加译文span
              const s = document.createElement('span');
              s.className = 'tu-bi';
              s.textContent = results[i];
              if (meta.node.nextSibling) {
                parent.insertBefore(s, meta.node.nextSibling);
              } else {
                parent.appendChild(s);
              }
            } else {
              // 仅译文:原版行为
              meta.node.textContent = results[i];
            }
          } else {
            meta.el.dataset.originalPlaceholder = meta.el.placeholder;
            meta.el.placeholder = results[i];
            meta.el.dataset.translated = '1';
          }
        }

        if (pendingRoot) { root = pendingRoot; }
      } while (pendingRoot);

    } finally {
      isTranslating = false;
    }
  }

  function restorePage() {
    // 移除双语span
    document.querySelectorAll('.tu-bi').forEach(el => el.remove());
    // 恢复原文
    document.querySelectorAll('[data-translated]').forEach(el => {
      if (el.dataset.originalText) {
        for (const child of el.childNodes) {
          if (child.nodeType === Node.TEXT_NODE) { child.textContent = el.dataset.originalText; break; }
        }
        delete el.dataset.originalText;
      }
      if (el.dataset.originalPlaceholder) {
        el.placeholder = el.dataset.originalPlaceholder;
        delete el.dataset.originalPlaceholder;
      }
      delete el.dataset.translated;
    });
  }

  // ══════════════════════════════════════════════════════════
  // 动态内容监听(原封不动)
  // ══════════════════════════════════════════════════════════
  let lastHeight = 0;

  function onScroll() {
    const h = document.documentElement.scrollHeight;
    if (h > lastHeight) {
      lastHeight = h;
      if (autoMode) translatePage();
    }
  }

  let mutationRafId = null;
  const pendingMutationRoots = new Set();

  const observer = new MutationObserver((mutations) => {
    if (!autoMode) return;
    for (const m of mutations) {
      for (const node of m.addedNodes) {
        if (node.nodeType === Node.ELEMENT_NODE && !shouldSkip(node)) {
          pendingMutationRoots.add(node);
        }
      }
    }
    if (pendingMutationRoots.size > 0 && !mutationRafId) {
      mutationRafId = setTimeout(() => {
        mutationRafId = null;
        const roots = [...pendingMutationRoots];
        pendingMutationRoots.clear();
        if (roots.length > 5) {
          translatePage(document.body);
        } else {
          roots.forEach(r => translatePage(r));
        }
      }, 200);
    }
  });

  // ══════════════════════════════════════════════════════════
  // UI
  // ══════════════════════════════════════════════════════════

  function buildLangOptions() {
    let html = '';
    for (const [group, codes] of Object.entries(LANG_GROUPS)) {
      html += '<optgroup label="' + group + '">';
      for (const code of codes) {
        const name = ALL_LANGUAGES[code] || code;
        html += '<option value="' + code + '"' + (code === targetLang ? ' selected' : '') + '>' + name + '</option>';
      }
      html += '</optgroup>';
    }
    return html;
  }

  function isPageInTargetLang() {
    const lang = (document.documentElement.lang || '').split('-')[0].toLowerCase();
    const target = targetLang.split('-')[0].toLowerCase();
    return lang === target;
  }

  function initWhenBodyReady() {
    if (document.body) {
      init();
    } else {
      requestAnimationFrame(initWhenBodyReady);
    }
  }

  let _initialized = false;
  async function init() {
    if (_initialized) return;
    _initialized = true;

    lastHeight = document.documentElement.scrollHeight;

    // 注入CSS
    GM_addStyle(
      '.translate-ui{position:fixed;bottom:20px;right:20px;z-index:999999;font-family:system-ui,-apple-system,sans-serif}' +
      '.translate-ui *{box-sizing:border-box;margin:0;padding:0}' +
      '.tu-btn{width:42px;height:42px;border-radius:50%;border:none;background:rgba(0,0,0,0.5);color:#fff;cursor:pointer;' +
        'display:flex;align-items:center;justify-content:center;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);' +
        'box-shadow:0 2px 8px rgba(0,0,0,0.15);transition:transform .2s,background .2s;touch-action:manipulation}' +
      '.tu-btn:active{transform:scale(0.9)}' +
      '.tu-btn.active{background:rgba(34,128,255,0.8)}' +
      '.tu-panel{position:absolute;bottom:52px;right:0;width:240px;max-height:80vh;overflow-y:auto;' +
        'background:rgba(255,255,255,0.97);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);' +
        'border-radius:12px;box-shadow:0 4px 24px rgba(0,0,0,0.12);padding:12px;display:none;color:#333;font-size:13px}' +
      '.tu-panel.show{display:block}' +
      '.tu-panel label{display:block;margin:8px 0 4px;font-size:11px;color:#888;text-transform:uppercase;letter-spacing:.5px}' +
      '.tu-panel select{width:100%;padding:6px 8px;border:1px solid #ddd;border-radius:6px;font-size:12px;' +
        'background:#fff;color:#333;outline:none;appearance:auto}' +
      '.tu-panel select:focus{border-color:#4a9eff}' +
      '.tu-panel optgroup{font-weight:bold;color:#666;font-size:11px}' +
      '.tu-panel option{font-weight:normal;color:#333;font-size:12px}' +
      '.tu-status{margin-top:8px;padding:6px;background:#f8f8f8;border-radius:6px;font-size:11px;color:#666;text-align:center}' +
      '.tu-modes{display:flex;margin-top:6px;background:#f0f0f0;border-radius:8px;padding:2px;gap:2px}' +
      '.tu-modes button{flex:1;padding:6px 0;border:none;border-radius:6px;font-size:11px;cursor:pointer;' +
        'background:transparent;color:#999;transition:all .15s;font-weight:500;touch-action:manipulation}' +
      '.tu-modes button.on{background:#fff;color:#333;box-shadow:0 1px 3px rgba(0,0,0,0.1)}' +
      '.tu-row{display:flex;gap:6px;margin-top:10px}' +
      '.tu-row button{flex:1;padding:7px 0;border:none;border-radius:6px;font-size:12px;cursor:pointer;' +
        'transition:background .2s;touch-action:manipulation}' +
      '.tu-row .tu-restore{background:#f0f0f0;color:#555}' +
      '.tu-row .tu-restore:active{background:#ddd}' +
      '.tu-row .tu-go{background:#4a9eff;color:#fff}' +
      '.tu-row .tu-go:active{background:#3080dd}' +
      '.tu-row .tu-exclude{background:#ff6b6b;color:#fff;font-size:11px}' +
      '.tu-row .tu-exclude:active{background:#e55}' +
      // 双语span样式
      '.tu-bi{display:block;margin-top:2px;font-size:.9em;line-height:1.5;color:#5a8fb4;' +
        'border-left:2px solid rgba(74,158,255,0.3);padding-left:8px}' +
      // 行内元素内的双语span改为行内显示
      'a .tu-bi,span .tu-bi,em .tu-bi,strong .tu-bi,b .tu-bi,i .tu-bi,label .tu-bi,' +
        'small .tu-bi,sub .tu-bi,sup .tu-bi,u .tu-bi{display:inline;border-left:none;' +
        'padding-left:0;margin-top:0;margin-left:4px;font-size:.88em}' +
      'a .tu-bi::before,span .tu-bi::before,em .tu-bi::before,strong .tu-bi::before,' +
        'b .tu-bi::before,i .tu-bi::before,label .tu-bi::before,small .tu-bi::before,' +
        'sub .tu-bi::before,sup .tu-bi::before,u .tu-bi::before{content:"(";color:#9ab}' +
      'a .tu-bi::after,span .tu-bi::after,em .tu-bi::after,strong .tu-bi::after,' +
        'b .tu-bi::after,i .tu-bi::after,label .tu-bi::after,small .tu-bi::after,' +
        'sub .tu-bi::after,sup .tu-bi::after,u .tu-bi::after{content:")";color:#9ab}' +
      '@media(prefers-color-scheme:dark){' +
        '.tu-panel{background:rgba(30,30,30,0.97);color:#eee}' +
        '.tu-panel select{background:#2a2a2a;color:#eee;border-color:#444}' +
        '.tu-panel optgroup{color:#aaa}' +
        '.tu-panel option{color:#eee}' +
        '.tu-row .tu-restore{background:#333;color:#ccc}' +
        '.tu-status{background:#222;color:#999}' +
        '.tu-modes{background:#333}' +
        '.tu-modes button{color:#777}' +
        '.tu-modes button.on{background:#444;color:#eee;box-shadow:0 1px 3px rgba(0,0,0,0.3)}' +
        '.tu-bi{color:#7babc8;border-left-color:rgba(100,160,220,0.25)}' +
        'a .tu-bi::before,span .tu-bi::before,em .tu-bi::before,strong .tu-bi::before,' +
          'b .tu-bi::before,i .tu-bi::before,a .tu-bi::after,span .tu-bi::after,' +
          'em .tu-bi::after,strong .tu-bi::after,b .tu-bi::after,i .tu-bi::after{color:#5a7a96}' +
      '}'
    );

    // 注入UI
    const ui = document.createElement('div');
    ui.className = 'translate-ui';
    ui.innerHTML =
      '<div class="tu-panel" id="tuPanel">' +
        '<label>翻译引擎 / Engine</label>' +
        '<select id="tuEngine">' +
          '<option value="google">Google (TWP Auto)</option>' +
          '<option value="google_v2">Google (TWP v2 API)</option>' +
          '<option value="google_legacy">Google (Legacy gtx)</option>' +
          '<option value="microsoft">Microsoft</option>' +
          '<option value="tencent">Tencent</option>' +
        '</select>' +
        '<label>目标语言 / Target (' + Object.keys(ALL_LANGUAGES).length + ' languages)</label>' +
        '<select id="tuLang">' + buildLangOptions() + '</select>' +
        '<label>显示模式</label>' +
        '<div class="tu-modes" id="tuModes">' +
          '<button data-m="translated"' + (displayMode === 'translated' ? ' class="on"' : '') + '>仅译文</button>' +
          '<button data-m="bilingual"' + (displayMode === 'bilingual' ? ' class="on"' : '') + '>双语</button>' +
          '<button data-m="original"' + (displayMode === 'original' ? ' class="on"' : '') + '>原文</button>' +
        '</div>' +
        '<div class="tu-status" id="tuStatus">Ready</div>' +
        '<div class="tu-row">' +
          '<button class="tu-restore" id="tuRestore">还原</button>' +
          '<button class="tu-go" id="tuGo">翻译</button>' +
        '</div>' +
        '<div class="tu-row">' +
          '<button class="tu-exclude" id="tuExclude">排除此站</button>' +
        '</div>' +
      '</div>' +
      '<button class="tu-btn' + (autoMode ? ' active' : '') + '" id="tuBtn">' +
        '<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">' +
          '<path d="M3 5h12M9 3v2m1.048 9.5A18.022 18.022 0 016.412 9m6.088 9h7M11 21l5-10 5 10M12.751 5C11.783 10.77 8.07 15.61 3 18.129"/>' +
        '</svg>' +
      '</button>';
    document.body.appendChild(ui);

    const btn = document.getElementById('tuBtn');
    const panel = document.getElementById('tuPanel');
    const engineSelect = document.getElementById('tuEngine');
    const langSelect = document.getElementById('tuLang');
    const statusEl = document.getElementById('tuStatus');
    const modesEl = document.getElementById('tuModes');

    engineSelect.value = currentEngine;
    langSelect.value = targetLang;

    function setStatus(msg) { if (statusEl) statusEl.textContent = msg; }

    btn.addEventListener('click', function(e) { e.stopPropagation(); panel.classList.toggle('show'); });
    document.addEventListener('click', function(e) { if (!ui.contains(e.target)) panel.classList.remove('show'); });

    engineSelect.addEventListener('change', function() {
      currentEngine = engineSelect.value;
      GM_setValue('engine', currentEngine);
      cache.clear();
      setStatus('Engine: ' + (Engine[currentEngine] ? Engine[currentEngine].name : currentEngine));
    });

    langSelect.addEventListener('change', function() {
      targetLang = langSelect.value;
      GM_setValue('targetLang', targetLang);
      cache.clear();
      setStatus('Target: ' + (ALL_LANGUAGES[targetLang] || targetLang));
    });

    // ★ 模式切换 — 走缓存瞬间重渲染,不发网络请求
    modesEl.addEventListener('click', async function(e) {
      var b = e.target.closest('button[data-m]');
      if (!b) return;
      var m = b.dataset.m;
      if (m === displayMode) return;

      modesEl.querySelectorAll('button').forEach(function(x) { x.classList.remove('on'); });
      b.classList.add('on');

      displayMode = m;
      GM_setValue('displayMode', m);

      if (m === 'original') {
        restorePage();
        btn.classList.remove('active');
        setStatus('显示原文');
      } else {
        // 先还原,再用新模式重新渲染(走缓存,秒完成)
        restorePage();
        btn.classList.add('active');
        setStatus(m === 'bilingual' ? '双语翻译中...' : '翻译中...');
        var start = performance.now();
        await translatePage();
        setStatus('完成 (' + ((performance.now() - start) / 1000).toFixed(1) + 's)');
      }
    });

    document.getElementById('tuGo').addEventListener('click', async function() {
      panel.classList.remove('show');
      btn.classList.add('active');
      autoMode = true;
      GM_setValue('autoMode', true);
      restorePage();
      cache.clear();
      lastHeight = document.documentElement.scrollHeight;
      setStatus('翻译中...');
      var start = performance.now();
      await translatePage();
      setStatus('完成 (' + ((performance.now() - start) / 1000).toFixed(1) + 's)');
    });

    document.getElementById('tuRestore').addEventListener('click', function() {
      panel.classList.remove('show');
      btn.classList.remove('active');
      autoMode = false;
      GM_setValue('autoMode', false);
      restorePage();
      setStatus('已还原');
    });

    document.getElementById('tuExclude').addEventListener('click', function() {
      if (!excludedHosts.includes(location.host)) {
        excludedHosts.push(location.host);
        GM_setValue('excludedHosts', JSON.stringify(excludedHosts));
      }
      restorePage();
      ui.remove();
      observer.disconnect();
      window.removeEventListener('scroll', onScroll);
    });

    // 菜单
    GM_registerMenuCommand('翻译当前页面', function() { translatePage(); });
    GM_registerMenuCommand('还原当前页面', function() { restorePage(); });
    GM_registerMenuCommand('切换Google引擎', function() { currentEngine = 'google'; engineSelect.value = 'google'; GM_setValue('engine', 'google'); cache.clear(); });
    GM_registerMenuCommand('切换Microsoft引擎', function() { currentEngine = 'microsoft'; engineSelect.value = 'microsoft'; GM_setValue('engine', 'microsoft'); cache.clear(); });
    GM_registerMenuCommand('切换双语/仅译文', function() {
      var m = displayMode === 'bilingual' ? 'translated' : 'bilingual';
      displayMode = m;
      GM_setValue('displayMode', m);
      modesEl.querySelectorAll('button').forEach(function(b) { b.classList.toggle('on', b.dataset.m === m); });
      restorePage();
      translatePage();
    });

    // 启动监听
    window.addEventListener('scroll', onScroll, { passive: true });
    observer.observe(document.body, { childList: true, subtree: true });

    // 自动翻译
    if (autoMode && !isPageInTargetLang() && displayMode !== 'original') {
      queueMicrotask(async function() {
        setStatus(displayMode === 'bilingual' ? '双语翻译中...' : '自动翻译中...');
        var start = performance.now();
        await translatePage();
        setStatus('完成 (' + ((performance.now() - start) / 1000).toFixed(1) + 's)');
      });
    }
  }

  initWhenBodyReady();

})();