mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
1 line
3.3 KiB
JavaScript
1 line
3.3 KiB
JavaScript
(()=>(e,t)=>{function a(e,t,a){if(t in e){Object.defineProperty(e,t,{value:a,enumerable:true,configurable:true,writable:true})}else{e[t]=a}return e}const s={"日本語":"ja-JP",English:"en-US",Deutsch:"de-DE"};class r{accepts(e){return e.nodeType===Node.ELEMENT_NODE}getValue(e){return e.nodeValue}setValue(e,t){e.nodeValue=t}getElement(e){return e}translate(e){let t=this.getValue(e);if(!t||typeof t!=="string"||t==="*"){return}t=t.trim();const a=r.map.get(t);if(a===undefined){const a=r.regex.find((([e])=>e.test(t)));if(a){const[s,r]=a;this.setValue(e,t.replace(s,r))}}else if(typeof a==="string"){this.setValue(e,a)}else if(Array.isArray(a)){let t=null;for(const r of a){if(typeof r==="string"){t=r}else{var s;const{text:a,selector:n,not:l}=r;if(((s=this.getElement(e))===null||s===void 0?void 0:s.matches(n))!==Boolean(l)){t=a}}}if(t!==null){this.setValue(e,t)}}else{var n;const{text:t,selector:s,not:r}=a;if(((n=this.getElement(e))===null||n===void 0?void 0:n.matches(s))!==Boolean(r)){this.setValue(e,t)}}}static walk(e,t){const a=document.createTreeWalker(e,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null,false);let s=a.nextNode();while(s){t(s);s=a.nextNode()}}static translate(e){if(e.nodeType===Node.TEXT_NODE){r.textNode.translate(e);return}const t=e=>{for(const t of r.sensitiveTranslators){if(t.accepts(e)){t.translate(e)}}};t(e);r.walk(e,t)}static translateCssMatches(){const e=r.map.get("*");if(!e){return}for(const{selector:t,text:a}of e){const e=document.querySelector(t);if(e){[...e.childNodes].filter((e=>e.nodeType===Node.TEXT_NODE)).forEach((e=>e.nodeValue=a))}}}}a(r,"textNode",void 0);a(r,"title",void 0);a(r,"placeholder",void 0);a(r,"settingsDropdown",void 0);a(r,"sensitiveTranslators",void 0);a(r,"map",void 0);a(r,"regex",void 0);class n extends r{accepts(e){return e.nodeType===Node.TEXT_NODE}getElement(e){return e.parentElement}}class l extends r{getValue(e){return e.getAttribute("title")}setValue(e,t){e.setAttribute("title",t)}}class o extends r{getValue(e){return e.getAttribute("placeholder")}setValue(e,t){e.setAttribute("placeholder",t)}}class i extends r{accepts(e){return e instanceof HTMLInputElement&&e.hasAttribute("key")}getValue(e){return e.value}setValue(e,t){e.value=t}}r.textNode=new n;r.title=new l;r.placeholder=new o;r.settingsDropdown=new i;r.sensitiveTranslators=[r.textNode,r.title,r.placeholder];const c=async()=>{const a=s[e.i18nLanguage];const{map:n,regex:l}=await t.importAsync(`i18n.${a}`);document.documentElement.setAttribute("lang",a);r.map=n;r.regex=[...l.entries()];r.translate(document.body);r.translateCssMatches();Observer.observe("body",(e=>{e.forEach((e=>{if(e.type==="childList"){if(e.addedNodes.length>0){r.translateCssMatches()}e.addedNodes.forEach((e=>{r.translate(e)}))}else if(e.type==="characterData"){r.textNode.translate(e.target)}else if(e.type==="attributes"){if(e.attributeName==="title"){r.title.translate(e.target)}else if(e.attributeName==="placeholder"){r.placeholder.translate(e.target)}}}))}),{characterData:true,childList:true,subtree:true,attributes:true});const o=await SpinQuery.select(".gui-settings-icon-panel");o.addEventListener("be:load",(()=>{r.walk(document.querySelector(".gui-settings-box"),(e=>r.settingsDropdown.translate(e)))}),{once:true})};c();return{export:{Translator:r,TextNodeTranslator:n,TitleTranslator:l,PlaceholderTranslator:o}}})(); |