Bilibili-Evolved/min/i18n.min.js
2019-05-24 17:51:41 +08:00

1 line
2.9 KiB
JavaScript

(()=>{return(e,t)=>{const s={"日本語":"ja-JP",English:"en-US",Deutsch:"de-DE"};class a{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 s=a.map.get(t);if(s===undefined){const s=a.regex.find(([e])=>e.test(t));if(s){const[a,r]=s;this.setValue(e,t.replace(a,r))}}else if(typeof s==="string"){this.setValue(e,s)}else if(Array.isArray(s)){let t=null;for(const a of s){if(typeof a==="string"){t=a}else{const{text:s,selector:r,not:n}=a;if(this.getElement(e).matches(r)!==Boolean(n)){t=s}}}if(t!==null){this.setValue(e,t)}}else{const{text:t,selector:a,not:r}=s;if(this.getElement(e).matches(a)!==Boolean(r)){this.setValue(e,t)}}}static walk(e,t){const s=document.createTreeWalker(e,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null,false);let a=s.nextNode();while(a){t(a);a=s.nextNode()}}static translate(e){if(e.nodeType===Node.TEXT_NODE){a.textNode.translate(e);return}const t=e=>{for(const t of a.sensitiveTranslators){if(t.accepts(e)){t.translate(e)}}};t(e);a.walk(e,t)}static translateCssMatches(){const e=a.map.get("*");if(!e){return}for(const{selector:t,text:s}of e){const e=document.querySelector(t);if(e){[...e.childNodes].filter(e=>e.nodeType===Node.TEXT_NODE).forEach(e=>e.nodeValue=s)}}}}class r extends a{accepts(e){return e.nodeType===Node.TEXT_NODE}getElement(e){return e.parentElement}}class n extends a{getValue(e){return e.getAttribute("title")}setValue(e,t){e.setAttribute("title",t)}}class l extends a{getValue(e){return e.getAttribute("placeholder")}setValue(e,t){e.setAttribute("placeholder",t)}}class o extends a{accepts(e){return e instanceof HTMLInputElement&&e.hasAttribute("key")}getValue(e){return e.value}setValue(e,t){e.value=t}}a.textNode=new r;a.title=new n;a.placeholder=new l;a.settingsDropdown=new o;a.sensitiveTranslators=[a.textNode,a.title,a.placeholder];const i=async()=>{const r=s[e.i18nLanguage];const{map:n,regex:l}=await t.importAsync(`i18n.${r}`);document.documentElement.setAttribute("lang",r);a.map=n;a.regex=[...l.entries()];a.translate(document.body);a.translateCssMatches();Observer.observe("body",e=>{e.forEach(e=>{if(e.type==="childList"){if(e.addedNodes.length>0){a.translateCssMatches()}e.addedNodes.forEach(e=>{a.translate(e)})}else if(e.type==="characterData"){a.textNode.translate(e.target)}else if(e.type==="attributes"){if(e.attributeName==="title"){a.title.translate(e.target)}else if(e.attributeName==="placeholder"){a.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",()=>{a.walk(document.querySelector(".gui-settings-box"),e=>a.settingsDropdown.translate(e))},{once:true})};i();return{export:{Translator:a,TextNodeTranslator:r,TitleTranslator:n,PlaceholderTranslator:l},dropdown:{key:"i18nLanguage",items:[`日本語`]}}}})();