/* ============================================================
   語言庫 — 繁體 / 簡體中文切換
   字表與詞組來自 OpenCC (TSCharacters / TSPhrases, Apache-2.0)。
   策略:源碼文本為繁體,真正需要的轉換方向是「繁→簡」(多對一,平表正確)。
   切回繁體時 React 從繁體源重渲染,故繁向為近似還原(盡力)。
   MutationObserver 捕捉異步渲染/彈窗新插入的文本,確保無殘留繁體。
   注意:打包字串僅含 BMP(單 code unit)字元,逐 2 解析才正確。
   ============================================================ */
const I18N_STORE_KEY = "mk3-language";
const I18N_DEFAULT_LANG = "zh-Hant";

/* 領域專用詞組:確保特定術語整體一致(在逐字轉換之前套用) */
const I18N_PHRASES = [
  ["超高壓倉儲智能管理系統", "超高压仓储智能管理系统"],
  ["智能倉儲管理平台", "智能仓储管理平台"],
];


/* OpenCC 繁→簡 單字表(打包為 "繁簡繁簡…",每字單 code unit)+ 詞組表 */
const I18N_CHAR_PACKED = "㑯㑔㑳㑇㑶㐹㓨刾㘚㘎㜄㚯㜏㛣㠏㟆㥮㤘㩜㨫㩳㧐㩵擜䁻䀥䃮鿎䊷䌶䋙䌺䋚䌻䋹䌿䋻䌾䍦䍠䎱䎬䙡䙌䜀䜧䝼䞍䥇䦂䥑鿏䥱䥾䦛䦶䦟䦷䯀䯅䰾鲃䱷䲣䱽䲝䲁鳚䲘鳤䴉鹮丟丢並并乾干亂乱亙亘亞亚佇伫佈布佔占併并來来侖仑侶侣侷局俁俣係系俔伣俠侠俥伡俬私倀伥倆俩倈俫倉仓個个們们倖幸倫伦倲㑈偉伟偑㐽側侧偵侦偽伪傌㐷傑杰傖伧傘伞備备傢家傭佣傯偬傳传傴伛債债傷伤傾倾僂偻僅仅僉佥僑侨僕仆僞伪僥侥僨偾僱雇價价儀仪儁俊儂侬億亿儈侩儉俭儎傤儐傧儔俦儕侪儘尽償偿優优儲储儷俪儸㑩儺傩儻傥儼俨兇凶兌兑兒儿兗兖內内兩两冊册冑胄冪幂凈净凍冻凜凛凱凯別别刪删剄刭則则剋克剎刹剗刬剛刚剝剥剮剐剴剀創创剷铲劃划劇剧劉刘劊刽劌刿劍剑劏㓥劑剂劚㔉勁劲動动務务勛勋勝胜勞劳勢势勩勚勱劢勳勋勵励勸劝勻匀匭匦匯汇匱匮區区協协卹恤卻却卽即厙厍厠厕厤历厭厌厲厉厴厣參参叄叁叢丛吒咤吳吴吶呐呂吕咼呙員员唄呗唸念問问啓启啞哑啟启啢唡喎㖞喚唤喪丧喫吃喬乔單单喲哟嗆呛嗇啬嗊唝嗎吗嗚呜嗩唢嗶哔嘆叹嘍喽嘓啯嘔呕嘖啧嘗尝嘜唛嘩哗嘮唠嘯啸嘰叽嘵哓嘸呒嘽啴噁恶噓嘘噚㖊噝咝噠哒噥哝噦哕噯嗳噲哙噴喷噸吨噹当嚀咛嚇吓嚌哜嚐尝嚕噜嚙啮嚥咽嚦呖嚨咙嚮向嚲亸嚳喾嚴严嚶嘤囀啭囁嗫囂嚣囅冁囈呓囉啰囌苏囑嘱囪囱圇囵國国圍围園园圓圆圖图團团坏坯垻坝埡垭埰采執执堅坚堊垩堖垴堝埚堯尧報报場场塊块塋茔塏垲塒埘塗涂塚冢塢坞塤埙塵尘塹堑墊垫墜坠墮堕墰坛墳坟墶垯墻墙墾垦壇坛壋垱壎埙壓压壘垒壙圹壚垆壜坛壞坏壟垄壠垅壢坜壩坝壪塆壯壮壺壶壼壸壽寿夠够夢梦夥伙夾夹奐奂奧奥奩奁奪夺奬奖奮奋奼姹妝妆姍姗姦奸娛娱婁娄婦妇婭娅媧娲媯妫媰㛀媼媪媽妈嫋袅嫗妪嫵妩嫺娴嫻娴嫿婳嬀妫嬃媭嬈娆嬋婵嬌娇嬙嫱嬡嫒嬤嬷嬪嫔嬰婴嬸婶孃娘孋㛤孌娈孫孙學学孿孪宮宫寀采寢寝實实寧宁審审寫写寬宽寵宠寶宝將将專专尋寻對对導导尷尴屆届屍尸屓屃屜屉屢屡層层屨屦屬属岡冈峯峰峴岘島岛峽峡崍崃崑昆崗岗崙仑崢峥崬岽嵐岚嵗岁嵾㟥嶁嵝嶄崭嶇岖嶔嵚嶗崂嶠峤嶢峣嶧峄嶨峃嶮崄嶸嵘嶺岭嶼屿嶽岳巋岿巒峦巔巅巖岩巰巯巹卺帥帅師师帳帐帶带幀帧幃帏幓㡎幗帼幘帻幟帜幣币幫帮幬帱幹干幾几庫库廁厕廂厢廄厩廈厦廎庼廕荫廚厨廝厮廟庙廠厂廡庑廢废廣广廩廪廬庐廳厅弒弑弔吊弳弪張张強强彆别彈弹彌弥彎弯彔录彙汇彠彟彥彦彫雕彲彨彿佛後后徑径從从徠徕復复徵征徹彻恆恒恥耻悅悦悞悮悵怅悶闷悽凄惡恶惱恼惲恽惻恻愛爱愜惬愨悫愴怆愷恺愾忾慄栗態态慍愠慘惨慚惭慟恸慣惯慤悫慪怄慫怂慮虑慳悭慶庆慺㥪慼戚慾欲憂忧憊惫憐怜憑凭憒愦憖慭憚惮憤愤憫悯憮怃憲宪憶忆懇恳應应懌怿懍懔懞蒙懟怼懣懑懤㤽懨恹懲惩懶懒懷怀懸悬懺忏懼惧懾慑戀恋戇戆戔戋戧戗戩戬戰战戱戯戲戏戶户拋抛挩捝挱挲挾挟捨舍捫扪捱挨捲卷掃扫掄抡掆㧏掗挜掙挣掛挂採采揀拣揚扬換换揮挥揯搄損损搖摇搗捣搵揾搶抢摑掴摜掼摟搂摯挚摳抠摶抟摺折摻掺撈捞撏挦撐撑撓挠撝㧑撟挢撣掸撥拨撫抚撲扑撳揿撻挞撾挝撿捡擁拥擄掳擇择擊击擋挡擓㧟擔担據据擠挤擡抬擣捣擬拟擯摈擰拧擱搁擲掷擴扩擷撷擺摆擻擞擼撸擽㧰擾扰攄摅攆撵攏拢攔拦攖撄攙搀攛撺攜携攝摄攢攒攣挛攤摊攪搅攬揽敎教敓敚敗败敘叙敵敌數数斂敛斃毙斆敩斕斓斬斩斷断於于旂旗旣既昇升時时晉晋晝昼暈晕暉晖暘旸暢畅暫暂曄晔曆历曇昙曉晓曏向曖暧曠旷曨昽曬晒書书會会朧胧朮术東东枴拐柵栅柺拐査查桿杆梔栀梘枧條条梟枭梲棁棄弃棊棋棖枨棗枣棟栋棡㭎棧栈棲栖棶梾椏桠椲㭏楊杨楓枫楨桢業业極极榘矩榦干榪杩榮荣榲榅榿桤構构槍枪槓杠槤梿槧椠槨椁槮椮槳桨槶椢槼椝樁桩樂乐樅枞樑梁樓楼標标樞枢樢㭤樣样樧榝樫㭴樳桪樸朴樹树樺桦樿椫橈桡橋桥機机橢椭橫横檁檩檉柽檔档檜桧檟槚檢检檣樯檮梼檯台檳槟檸柠檻槛櫃柜櫓橹櫚榈櫛栉櫝椟櫞橼櫟栎櫥橱櫧槠櫨栌櫪枥櫫橥櫬榇櫱蘖櫳栊櫸榉櫻樱欄栏欅榉權权欏椤欒栾欖榄欞棂欽钦歎叹歐欧歟欤歡欢歲岁歷历歸归歿殁殘残殞殒殤殇殨㱮殫殚殭僵殮殓殯殡殰㱩殲歼殺杀殻壳殼壳毀毁毆殴毿毵氂牦氈毡氌氇氣气氫氢氬氩氳氲氾泛汎泛汙污決决沒没沖冲況况泝溯洩泄洶汹浹浃涇泾涗涚涼凉淒凄淚泪淥渌淨净淩凌淪沦淵渊淶涞淺浅渙涣減减渢沨渦涡測测渾浑湊凑湞浈湧涌湯汤溈沩準准溝沟溫温溮浉溳涢溼湿滄沧滅灭滌涤滎荥滙汇滬沪滯滞滲渗滷卤滸浒滻浐滾滚滿满漁渔漊溇漚沤漢汉漣涟漬渍漲涨漵溆漸渐漿浆潁颍潑泼潔洁潙沩潚㴋潛潜潤润潯浔潰溃潷滗潿涠澀涩澆浇澇涝澐沄澗涧澠渑澤泽澦滪澩泶澮浍澱淀澾㳠濁浊濃浓濄㳡濕湿濘泞濚溁濛蒙濜浕濟济濤涛濧㳔濫滥濰潍濱滨濺溅濼泺濾滤瀂澛瀅滢瀆渎瀇㲿瀉泻瀋沈瀏浏瀕濒瀘泸瀝沥瀟潇瀠潆瀦潴瀧泷瀨濑瀰弥瀲潋瀾澜灃沣灄滠灑洒灕漓灘滩灝灏灡㳕灣湾灤滦灧滟灩滟災灾為为烏乌烴烃無无煉炼煒炜煙烟煢茕煥焕煩烦煬炀煱㶽熅煴熒荧熗炝熱热熲颎熾炽燁烨燈灯燉炖燒烧燙烫燜焖營营燦灿燬毁燭烛燴烩燶㶶燻熏燼烬燾焘爍烁爐炉爛烂爭争爲为爺爷爾尔牀床牆墙牘牍牽牵犖荦犛牦犢犊犧牺狀状狹狭狽狈猙狰猶犹猻狲獁犸獃呆獄狱獅狮獎奖獨独獪狯獫猃獮狝獰狞獱㺍獲获獵猎獷犷獸兽獺獭獻献獼猕玀猡現现琱雕琺珐琿珲瑋玮瑒玚瑣琐瑤瑶瑩莹瑪玛瑲玱璉琏璡琎璣玑璦瑷璫珰璯㻅環环璵玙璸瑸璽玺璿璇瓊琼瓏珑瓔璎瓚瓒甌瓯甕瓮產产産产甦苏甯宁畝亩畢毕畫画異异畵画當当疇畴疊叠痙痉痠酸痾疴瘂痖瘋疯瘍疡瘓痪瘞瘗瘡疮瘧疟瘮瘆瘲疭瘺瘘瘻瘘療疗癆痨癇痫癉瘅癒愈癘疠癟瘪癡痴癢痒癤疖癥症癧疬癩癞癬癣癭瘿癮瘾癰痈癱瘫癲癫發发皁皂皚皑皰疱皸皲皺皱盃杯盜盗盞盏盡尽監监盤盘盧卢盪荡眞真眥眦眾众睏困睜睁睞睐瞘眍瞜䁖瞞瞒瞶瞆瞼睑矇蒙矓眬矚瞩矯矫硃朱硜硁硤硖硨砗硯砚碕埼碩硕碭砀碸砜確确碼码碽䂵磑硙磚砖磠硵磣碜磧碛磯矶磽硗磾䃅礄硚礆硷礎础礙碍礦矿礪砺礫砾礬矾礱砻祕秘祿禄禍祸禎祯禕祎禡祃禦御禪禅禮礼禰祢禱祷禿秃秈籼稅税稈秆稏䅉稜棱稟禀種种稱称穀谷穇䅟穌稣積积穎颖穠秾穡穑穢秽穩稳穫获穭穞窩窝窪洼窮穷窯窑窵窎窶窭窺窥竄窜竅窍竇窦竈灶竊窃竪竖競竞筆笔筍笋筧笕筴䇲箇个箋笺箏筝節节範范築筑篋箧篔筼篠筿篤笃篩筛篳筚簀箦簍篓簑蓑簞箪簡简簣篑簫箫簹筜簽签簾帘籃篮籌筹籔䉤籙箓籛篯籜箨籟籁籠笼籤签籩笾籪簖籬篱籮箩籲吁粵粤糉粽糝糁糞粪糧粮糰团糲粝糴籴糶粜糹纟糾纠紀纪紂纣約约紅红紆纡紇纥紈纨紉纫紋纹納纳紐纽紓纾純纯紕纰紖纼紗纱紘纮紙纸級级紛纷紜纭紝纴紡纺紬䌷紮扎細细紱绂紲绁紳绅紵纻紹绍紺绀紼绋紿绐絀绌終终絃弦組组絅䌹絆绊絎绗結结絕绝絛绦絝绔絞绞絡络絢绚給给絨绒絰绖統统絲丝絳绛絶绝絹绢綁绑綃绡綆绠綈绨綉绣綌绤綏绥綐䌼綑捆經经綜综綞缍綠绿綢绸綣绻綫线綬绶維维綯绹綰绾綱纲網网綳绷綴缀綵彩綸纶綹绺綺绮綻绽綽绰綾绫綿绵緄绲緇缁緊紧緋绯緑绿緒绪緓绬緔绱緗缃緘缄緙缂線线緝缉緞缎締缔緡缗緣缘緦缌編编緩缓緬缅緯纬緱缑緲缈練练緶缏緹缇緻致緼缊縈萦縉缙縊缢縋缒縐绉縑缣縕缊縗缞縛缚縝缜縞缟縟缛縣县縧绦縫缝縭缡縮缩縱纵縲缧縳䌸縴纤縵缦縶絷縷缕縹缥總总績绩繃绷繅缫繆缪繒缯織织繕缮繚缭繞绕繡绣繢缋繩绳繪绘繫系繭茧繮缰繯缳繰缲繳缴繸䍁繹绎繼继繽缤繾缱繿䍀纇颣纈缬纊纩續续纍累纏缠纓缨纔才纖纤纘缵纜缆缽钵罃䓨罈坛罌罂罎坛罰罚罵骂罷罢羅罗羆罴羈羁羋芈羣群羥羟羨羡義义羶膻習习翫玩翬翚翹翘翽翙耬耧耮耢聖圣聞闻聯联聰聪聲声聳耸聵聩聶聂職职聹聍聽听聾聋肅肃脅胁脈脉脛胫脣唇脩修脫脱脹胀腎肾腖胨腡脶腦脑腫肿腳脚腸肠膃腽膕腘膚肤膞䏝膠胶膩腻膽胆膾脍膿脓臉脸臍脐臏膑臘腊臚胪臟脏臠脔臢臜臥卧臨临臺台與与興兴舉举舊旧舘馆艙舱艤舣艦舰艫舻艱艰艷艳芻刍苧苎茲兹荊荆莊庄莖茎莢荚莧苋華华菴庵菸烟萇苌萊莱萬万萴荝萵莴葉叶葒荭葤荮葦苇葯药葷荤蒐搜蒓莼蒔莳蒕蒀蒞莅蒼苍蓀荪蓆席蓋盖蓮莲蓯苁蓴莼蓽荜蔔卜蔘参蔞蒌蔣蒋蔥葱蔦茑蔭荫蕁荨蕆蒇蕎荞蕒荬蕓芸蕕莸蕘荛蕢蒉蕩荡蕪芜蕭萧蕷蓣薀蕰薈荟薊蓟薌芗薑姜薔蔷薘荙薟莶薦荐薩萨薳䓕薴苧薵䓓薹苔薺荠藍蓝藎荩藝艺藥药藪薮藭䓖藴蕴藶苈藹蔼藺蔺蘀萚蘄蕲蘆芦蘇苏蘊蕴蘋苹蘚藓蘞蔹蘢茏蘭兰蘺蓠蘿萝虆蔂處处虛虚虜虏號号虧亏虯虬蛺蛱蛻蜕蜆蚬蝕蚀蝟猬蝦虾蝨虱蝸蜗螄蛳螞蚂螢萤螮䗖螻蝼螿螀蟄蛰蟈蝈蟎螨蟣虮蟬蝉蟯蛲蟲虫蟶蛏蟻蚁蠁蚃蠅蝇蠆虿蠍蝎蠐蛴蠑蝾蠔蚝蠟蜡蠣蛎蠨蟏蠱蛊蠶蚕蠻蛮衆众衊蔑術术衕同衚胡衛卫衝冲袞衮裊袅裏里補补裝装裡里製制複复褌裈褘袆褲裤褳裢褸褛褻亵襇裥襉裥襏袯襖袄襝裣襠裆襤褴襪袜襬摆襯衬襲袭襴襕覈核見见覎觃規规覓觅視视覘觇覡觋覥觍覦觎親亲覬觊覯觏覲觐覷觑覺觉覽览覿觌觀观觴觞觶觯觸触訁讠訂订訃讣計计訊讯訌讧討讨訐讦訒讱訓训訕讪訖讫託托記记訛讹訝讶訟讼訢䜣訣诀訥讷訩讻訪访設设許许訴诉訶诃診诊註注証证詁诂詆诋詎讵詐诈詒诒詔诏評评詖诐詗诇詘诎詛诅詞词詠咏詡诩詢询詣诣試试詩诗詫诧詬诟詭诡詮诠詰诘話话該该詳详詵诜詼诙詿诖誄诔誅诛誆诓誇夸誌志認认誑诳誒诶誕诞誘诱誚诮語语誠诚誡诫誣诬誤误誥诰誦诵誨诲說说説说誰谁課课誶谇誹诽誼谊誾訚調调諂谄諄谆談谈諉诿請请諍诤諏诹諑诼諒谅論论諗谂諛谀諜谍諝谞諞谝諡谥諢诨諤谔諦谛諧谐諫谏諭谕諮咨諱讳諳谙諶谌諷讽諸诸諺谚諼谖諾诺謀谋謁谒謂谓謄誊謅诌謊谎謎谜謐谧謔谑謖谡謗谤謙谦謚谥講讲謝谢謠谣謡谣謨谟謫谪謬谬謭谫謳讴謹谨謾谩譁哗證证譎谲譏讥譖谮識识譙谯譚谭譜谱譟噪譫谵譭毁譯译議议譴谴護护譸诪譽誉譾谫讀读讅谉變变讋詟讌䜩讎雠讒谗讓让讕谰讖谶讚赞讜谠讞谳豈岂豎竖豐丰豔艳豬猪豶豮貍狸貓猫貙䝙貝贝貞贞貟贠負负財财貢贡貧贫貨货販贩貪贪貫贯責责貯贮貰贳貲赀貳贰貴贵貶贬買买貸贷貺贶費费貼贴貽贻貿贸賀贺賁贲賂赂賃赁賄贿賅赅資资賈贾賊贼賑赈賒赊賓宾賕赇賙赒賚赉賜赐賞赏賠赔賡赓賢贤賣卖賤贱賦赋賧赕質质賫赍賬账賭赌賰䞐賴赖賵赗賺赚賻赙購购賽赛賾赜贄贽贅赘贇赟贈赠贊赞贋赝贍赡贏赢贐赆贓赃贔赑贖赎贗赝贛赣贜赃赬赪趕赶趙赵趨趋趲趱跡迹踐践踰逾踴踊蹌跄蹕跸蹟迹蹠跖蹣蹒蹤踪蹺跷躂跶躉趸躊踌躋跻躍跃躎䟢躑踯躒跞躓踬躕蹰躚跹躡蹑躥蹿躦躜躪躏軀躯車车軋轧軌轨軍军軑轪軒轩軔轫軛轭軟软軤轷軫轸軲轱軸轴軹轵軺轺軻轲軼轶軾轼較较輅辂輇辁輈辀載载輊轾輒辄輓挽輔辅輕轻輛辆輜辎輝辉輞辋輟辍輥辊輦辇輩辈輪轮輬辌輯辑輳辏輸输輻辐輼辒輾辗輿舆轀辒轂毂轄辖轅辕轆辘轉转轍辙轎轿轔辚轟轰轡辔轢轹轤轳辦办辭辞辮辫辯辩農农迴回逕迳這这連连週周進进遊游運运過过達达違违遙遥遜逊遞递遠远遡溯適适遲迟遷迁選选遺遗遼辽邁迈還还邇迩邊边邏逻邐逦郟郏郵邮鄆郓鄉乡鄒邹鄔邬鄖郧鄧邓鄭郑鄰邻鄲郸鄴邺鄶郐鄺邝酇酂酈郦醃腌醖酝醜丑醞酝醟蒏醣糖醫医醬酱醱酦釀酿釁衅釃酾釅酽釋释釐厘釒钅釓钆釔钇釕钌釗钊釘钉釙钋針针釣钓釤钐釦扣釧钏釩钒釵钗釷钍釹钕釺钎釾䥺鈀钯鈁钫鈃钘鈄钭鈅钥鈈钚鈉钠鈍钝鈎钩鈐钤鈑钣鈒钑鈔钞鈕钮鈞钧鈡钟鈣钙鈥钬鈦钛鈧钪鈮铌鈰铈鈳钶鈴铃鈷钴鈸钹鈹铍鈺钰鈽钸鈾铀鈿钿鉀钾鉅巨鉆钻鉈铊鉉铉鉋铇鉍铋鉑铂鉕钷鉗钳鉚铆鉛铅鉞钺鉢钵鉤钩鉦钲鉬钼鉭钽鉳锫鉶铏鉸铰鉺铒鉻铬鉿铪銀银銃铳銅铜銍铚銑铣銓铨銖铢銘铭銚铫銛铦銜衔銠铑銣铷銥铱銦铟銨铵銩铥銪铕銫铯銬铐銱铞銳锐銷销銹锈銻锑銼锉鋁铝鋃锒鋅锌鋇钡鋌铤鋏铗鋒锋鋙铻鋝锊鋟锓鋣铘鋤锄鋥锃鋦锔鋨锇鋩铓鋪铺鋭锐鋮铖鋯锆鋰锂鋱铽鋶锍鋸锯鋼钢錁锞錄录錆锖錇锫錈锩錏铔錐锥錒锕錕锟錘锤錙锱錚铮錛锛錟锬錠锭錡锜錢钱錦锦錨锚錩锠錫锡錮锢錯错録录錳锰錶表錸铼錼镎鍀锝鍁锨鍃锪鍅钫鍆钔鍇锴鍈锳鍊炼鍋锅鍍镀鍔锷鍘铡鍚钖鍛锻鍠锽鍤锸鍥锲鍩锘鍬锹鍰锾鍵键鍶锶鍺锗鍼针鍾钟鎂镁鎄锿鎇镅鎊镑鎌镰鎔镕鎖锁鎘镉鎚锤鎛镈鎡镃鎢钨鎣蓥鎦镏鎧铠鎩铩鎪锼鎬镐鎭镇鎮镇鎰镒鎲镋鎳镍鎵镓鎶鿔鎸镌鎿镎鏃镞鏇旋鏈链鏌镆鏍镙鏐镠鏑镝鏗铿鏘锵鏜镗鏝镘鏞镛鏟铲鏡镜鏢镖鏤镂鏨錾鏰镚鏵铧鏷镤鏹镪鏺䥽鏽锈鐃铙鐋铴鐐镣鐒铹鐓镦鐔镡鐘钟鐙镫鐝镢鐠镨鐥䦅鐦锎鐧锏鐨镄鐫镌鐮镰鐯䦃鐲镯鐳镭鐵铁鐶镮鐸铎鐺铛鐿镱鑄铸鑊镬鑌镔鑑鉴鑒鉴鑔镲鑕锧鑞镴鑠铄鑣镳鑥镥鑭镧鑰钥鑱镵鑲镶鑷镊鑹镩鑼锣鑽钻鑾銮鑿凿钁镢钂镋長长門门閂闩閃闪閆闫閈闬閉闭開开閌闶閎闳閏闰閑闲閒闲間间閔闵閘闸閡阂閣阁閤合閥阀閨闺閩闽閫阃閬阆閭闾閱阅閲阅閶阊閹阉閻阎閼阏閽阍閾阈閿阌闃阒闆板闇暗闈闱闊阔闋阕闌阑闍阇闐阗闒阘闓闿闔阖闕阙闖闯關关闞阚闠阓闡阐闢辟闤阛闥闼陘陉陝陕陞升陣阵陰阴陳陈陸陆陽阳隉陧隊队階阶隕陨際际隨随險险隯陦隱隐隴陇隸隶隻只雋隽雖虽雙双雛雏雜杂雞鸡離离難难雲云電电霑沾霢霡霧雾霽霁靂雳靄霭靆叇靈灵靉叆靚靓靜静靝靔靦腼靨靥鞏巩鞝绱鞦秋鞽鞒韁缰韃鞑韆千韉鞯韋韦韌韧韍韨韓韩韙韪韜韬韝鞲韞韫韻韵響响頁页頂顶頃顷項项順顺頇顸須须頊顼頌颂頎颀頏颃預预頑顽頒颁頓顿頗颇領领頜颌頡颉頤颐頦颏頭头頮颒頰颊頲颋頴颕頷颔頸颈頹颓頻频頽颓顆颗題题額额顎颚顏颜顒颙顓颛顔颜願愿顙颡顛颠類类顢颟顥颢顧顾顫颤顬颥顯显顰颦顱颅顳颞顴颧風风颭飐颮飑颯飒颱台颳刮颶飓颸飔颺飏颻飖颼飕飀飗飄飘飆飙飈飚飛飞飠饣飢饥飣饤飥饦飩饨飪饪飫饫飭饬飯饭飱飧飲饮飴饴飼饲飽饱飾饰飿饳餃饺餄饸餅饼餈糍餉饷養养餌饵餎饹餏饻餑饽餒馁餓饿餕馂餖饾餘余餚肴餛馄餜馃餞饯餡馅館馆餬糊餱糇餳饧餵喂餶馉餷馇餺馎餼饩餾馏餿馊饁馌饃馍饅馒饈馐饉馑饊馓饋馈饌馔饑饥饒饶饗飨饜餍饞馋饢馕馬马馭驭馮冯馱驮馳驰馴驯馹驲駁驳駐驻駑驽駒驹駔驵駕驾駘骀駙驸駛驶駝驼駟驷駡骂駢骈駭骇駰骃駱骆駸骎駿骏騁骋騂骍騅骓騌骔騍骒騎骑騏骐騖骛騙骗騤骙騧䯄騫骞騭骘騮骝騰腾騶驺騷骚騸骟騾骡驀蓦驁骜驂骖驃骠驄骢驅驱驊骅驌骕驍骁驏骣驕骄驗验驚惊驛驿驟骤驢驴驤骧驥骥驦骦驪骊驫骉骯肮髏髅髒脏體体髕髌髖髋髮发鬆松鬍胡鬚须鬢鬓鬥斗鬧闹鬨哄鬩阋鬮阄鬱郁鬹鬶魎魉魘魇魚鱼魛鱽魢鱾魨鲀魯鲁魴鲂魷鱿魺鲄鮁鲅鮃鲆鮊鲌鮋鲉鮍鲏鮎鲇鮐鲐鮑鲍鮒鲋鮓鲊鮚鲒鮜鲘鮝鲞鮞鲕鮣䲟鮦鲖鮪鲔鮫鲛鮭鲑鮮鲜鮳鲓鮶鲪鮺鲝鯀鲧鯁鲠鯇鲩鯉鲤鯊鲨鯒鲬鯔鲻鯕鲯鯖鲭鯗鲞鯛鲷鯝鲴鯡鲱鯢鲵鯤鲲鯧鲳鯨鲸鯪鲮鯫鲰鯰鲶鯴鲺鯷鳀鯽鲫鯿鳊鰁鳈鰂鲗鰃鳂鰆䲠鰈鲽鰉鳇鰌䲡鰍鳅鰏鲾鰐鳄鰒鳆鰓鳃鰛鳁鰜鳒鰟鳑鰠鳋鰣鲥鰥鳏鰧䲢鰨鳎鰩鳐鰭鳍鰮鳁鰱鲢鰲鳌鰳鳓鰵鳘鰷鲦鰹鲣鰺鲹鰻鳗鰼鳛鰾鳔鱂鳉鱅鳙鱈鳕鱉鳖鱒鳟鱔鳝鱖鳜鱗鳞鱘鲟鱝鲼鱟鲎鱠鲙鱣鳣鱤鳡鱧鳢鱨鲿鱭鲚鱯鳠鱷鳄鱸鲈鱺鲡鳥鸟鳧凫鳩鸠鳬凫鳲鸤鳳凤鳴鸣鳶鸢鳾䴓鴆鸩鴇鸨鴉鸦鴒鸰鴕鸵鴛鸳鴝鸲鴞鸮鴟鸱鴣鸪鴦鸯鴨鸭鴯鸸鴰鸹鴴鸻鴷䴕鴻鸿鴿鸽鵁䴔鵂鸺鵃鸼鵐鹀鵑鹃鵒鹆鵓鹁鵜鹈鵝鹅鵠鹄鵡鹉鵪鹌鵬鹏鵮鹐鵯鹎鵰雕鵲鹊鵷鹓鵾鹍鶄䴖鶇鸫鶉鹑鶊鹒鶓鹋鶖鹙鶘鹕鶚鹗鶡鹖鶥鹛鶩鹜鶪䴗鶬鸧鶯莺鶲鹟鶴鹤鶹鹠鶺鹡鶻鹘鶼鹣鶿鹚鷀鹚鷁鹢鷂鹞鷄鸡鷉䴘鷊鹝鷓鹧鷖鹥鷗鸥鷙鸷鷚鹨鷥鸶鷦鹪鷫鹔鷯鹩鷲鹫鷳鹇鷴鹇鷸鹬鷹鹰鷺鹭鷽鸴鸂㶉鸇鹯鸊䴙鸌鹱鸏鹲鸕鸬鸘鹴鸚鹦鸛鹳鸝鹂鸞鸾鹵卤鹹咸鹺鹾鹼碱鹽盐麗丽麥麦麩麸麪面麫面麯曲麴曲麵面麼么麽么黃黄黌黉點点黨党黲黪黴霉黶黡黷黩黽黾黿鼋鼂鼌鼉鼍鼕冬鼴鼹齊齐齋斋齎赍齏齑齒齿齔龀齕龁齗龂齙龅齜龇齟龃齠龆齡龄齣出齦龈齧啮齪龊齬龉齲龋齶腭齷龌龍龙龎厐龐庞龑䶮龔龚龕龛龜龟鿁䜤鿓鿒";
const I18N_OPENCC_PHRASES = [["一坏", "一坯"], ["一目瞭然", "一目了然"], ["上鍊", "上链"], ["不瞭解", "不了解"], ["么麼", "幺麽"], ["么麽", "幺麽"], ["乾乾淨淨", "干干净净"], ["乾乾脆脆", "干干脆脆"], ["乾佑縣", "乾佑县"], ["乾圖", "乾图"], ["乾坤一擲", "乾坤一掷"], ["乾安縣", "乾安县"], ["乾安鎮", "乾安镇"], ["乾斷", "乾断"], ["乾清宮", "乾清宫"], ["乾紅", "乾红"], ["乾綱", "乾纲"], ["乾縣", "乾县"], ["乾隆年間", "乾隆年间"], ["以免藉口", "以免借口"], ["以功覆過", "以功复过"], ["侔德覆載", "侔德复载"], ["傢俱", "家具"], ["傷亡枕藉", "伤亡枕藉"], ["凌藉", "凌借"], ["出醜狼藉", "出丑狼藉"], ["函覆", "函复"], ["千鍾粟", "千锺粟"], ["反反覆覆", "反反复复"], ["反覆", "反复"], ["反覆思維", "反复思维"], ["反覆思量", "反复思量"], ["反覆性", "反复性"], ["名覆金甌", "名复金瓯"], ["回覆", "回复"], ["土坏", "土坯"], ["坏土", "坯土"], ["坏子", "坯子"], ["坏布", "坯布"], ["坏戶", "坯户"], ["壺裏乾坤", "壶里乾坤"], ["大目乾連冥間救母變文", "大目乾连冥间救母变文"], ["幺麼", "幺麽"], ["幺麼小丑", "幺麽小丑"], ["幺麼小醜", "幺麽小丑"], ["張法乾", "张法乾"], ["彷彿", "仿佛"], ["徵絃", "徵弦"], ["徵聲", "徵声"], ["徵調", "徵调"], ["情有獨鍾", "情有独钟"], ["慰藉著", "慰藉着"], ["憑藉", "凭借"], ["憑藉着", "凭借着"], ["手鍊", "手链"], ["打坏", "打坯"], ["扭轉乾坤", "扭转乾坤"], ["找藉口", "找借口"], ["拉坏", "拉坯"], ["拉鍊", "拉链"], ["拉鍊工程", "拉链工程"], ["拜覆", "拜复"], ["捏坏", "捏坯"], ["據瞭解", "据了解"], ["文錦覆阱", "文锦复阱"], ["於倫", "於伦"], ["於則", "於则"], ["於單", "於单"], ["於戲", "於戏"], ["於梨華", "於梨华"], ["於潛", "於潜"], ["旋乾轉坤", "旋乾转坤"], ["旋轉乾坤", "旋转乾坤"], ["旋轉乾坤之力", "旋转乾坤之力"], ["明瞭", "明了"], ["明覆", "明复"], ["書中自有千鍾粟", "书中自有千锺粟"], ["李澤鉅", "李泽钜"], ["李鍊福", "李链福"], ["李鍾郁", "李锺郁"], ["毛坏", "毛坯"], ["沈沒", "沉没"], ["沈沒成本", "沉没成本"], ["沈積", "沉积"], ["沈船", "沉船"], ["沈默", "沉默"], ["浪蕩乾坤", "浪荡乾坤"], ["滑藉", "滑借"], ["無序", "无序"], ["牴牾", "抵牾"], ["牴觸", "抵触"], ["狐藉虎威", "狐借虎威"], ["珍珠項鍊", "珍珠项链"], ["甚鉅", "甚钜"], ["申覆", "申复"], ["畢昇", "毕昇"], ["發覆", "发复"], ["瞭如", "了如"], ["瞭如指掌", "了如指掌"], ["瞭然", "了然"], ["瞭然於心", "了然于心"], ["瞭若指掌", "了若指掌"], ["瞭解", "了解"], ["瞭解到", "了解到"], ["磚坏", "砖坯"], ["示覆", "示复"], ["稟覆", "禀复"], ["答覆", "答复"], ["篤麼", "笃麽"], ["簡單明瞭", "简单明了"], ["籌畫", "筹划"], ["素藉", "素借"], ["老態龍鍾", "老态龙钟"], ["肘手鍊足", "肘手链足"], ["脫坏", "脱坯"], ["茵藉", "茵借"], ["萬鍾", "万锺"], ["蕓薹", "芸薹"], ["蕩覆", "荡复"], ["蕭乾", "萧乾"], ["藉代", "借代"], ["藉以", "借以"], ["藉助", "借助"], ["藉助於", "借助于"], ["藉卉", "借卉"], ["藉口", "借口"], ["藉喻", "借喻"], ["藉寇兵", "借寇兵"], ["藉寇兵齎盜糧", "借寇兵赍盗粮"], ["藉手", "借手"], ["藉據", "借据"], ["藉故", "借故"], ["藉故推辭", "借故推辞"], ["藉方", "借方"], ["藉條", "借条"], ["藉槁", "借槁"], ["藉機", "借机"], ["藉此", "借此"], ["藉此機會", "借此机会"], ["藉甚", "借甚"], ["藉由", "借由"], ["藉着", "借着"], ["藉端", "借端"], ["藉端生事", "借端生事"], ["藉箸代籌", "借箸代筹"], ["藉草枕塊", "借草枕块"], ["藉詞", "借词"], ["藉讀", "借读"], ["藉資", "借资"], ["衹得", "只得"], ["衹見樹木", "只见树木"], ["衹見樹木不見森林", "只见树木不见森林"], ["袖裏乾坤", "袖里乾坤"], ["覆上", "复上"], ["覆住", "复住"], ["覆信", "复信"], ["覆冒", "复冒"], ["覆呈", "复呈"], ["覆命", "复命"], ["覆墓", "复墓"], ["覆宗", "复宗"], ["覆帳", "复帐"], ["覆幬", "复帱"], ["覆成", "复成"], ["覆按", "复按"], ["覆文", "复文"], ["覆杯", "复杯"], ["覆校", "复校"], ["覆瓿", "复瓿"], ["覆盂", "复盂"], ["覆盤", "覆盘"], ["覆育", "复育"], ["覆蕉尋鹿", "复蕉寻鹿"], ["覆逆", "复逆"], ["覆醢", "复醢"], ["覆醬瓿", "复酱瓿"], ["覆電", "复电"], ["覆露", "复露"], ["覆鹿尋蕉", "复鹿寻蕉"], ["覆鹿遺蕉", "复鹿遗蕉"], ["覆鼎", "复鼎"], ["見覆", "见复"], ["計畫", "计划"], ["變徵", "变徵"], ["變徵之聲", "变徵之声"], ["變徵之音", "变徵之音"], ["貂覆額", "貂复额"], ["買臣覆水", "买臣复水"], ["踅門瞭戶", "踅门了户"], ["躪藉", "躏借"], ["酒逢知己千鍾少", "酒逢知己千锺少"], ["醞藉", "酝借"], ["重覆", "重复"], ["金鍊", "金链"], ["鈞覆", "钧复"], ["鉅子", "钜子"], ["鉅萬", "钜万"], ["鉅防", "钜防"], ["鉸鍊", "铰链"], ["銀鍊", "银链"], ["鋼坏", "钢坯"], ["錢鍾書", "钱锺书"], ["鍊墜", "链坠"], ["鍊子", "链子"], ["鍊形", "链形"], ["鍊條", "链条"], ["鍊錘", "链锤"], ["鍊鎖", "链锁"], ["鍛鍾", "锻锺"], ["鍾繇", "钟繇"], ["鍾萬梅", "锺万梅"], ["鍾重發", "锺重发"], ["鍾鍛", "锺锻"], ["鍾馗", "锺馗"], ["鎖鍊", "锁链"], ["鐵鍊", "铁链"], ["鑽石項鍊", "钻石项链"], ["鑿坏", "凿坯"], ["陶坏", "陶坯"], ["雁杳魚沈", "雁杳鱼沉"], ["雖覆能復", "虽覆能复"], ["電覆", "电复"], ["露覆", "露复"], ["項鍊", "项链"], ["頗覆", "颇复"], ["頸鍊", "颈链"], ["顛乾倒坤", "颠乾倒坤"], ["顛倒乾坤", "颠倒乾坤"], ["顧藉", "顾借"], ["麼些族", "麽些族"], ["黄鍾公", "黄锺公"], ["龍鍾", "龙钟"]];

const I18N_CHAR_MAP = (() => {
  const m = new Map();
  for (let i = 0; i + 1 < I18N_CHAR_PACKED.length; i += 2) {
    m.set(I18N_CHAR_PACKED[i], I18N_CHAR_PACKED[i + 1]);
  }
  return m;
})();

/* 重要:繁體是源文(JSX 內文本即繁體),故「繁→簡」是唯一需要的轉換方向。
   絕不做「簡→繁」逆轉換 —— 簡→繁是一對多(如 出/齣、表/錶、台/檯/臺 均簡作一字),
   逆轉換會把本就正確的繁體源文誤改(出→齣、表→錶)。切回繁體時依賴 React 從繁體源重渲染還原。 */

/* 合併詞組:領域詞組優先,其次 OpenCC;按繁體長度降序(長詞先替換) */
const I18N_ALL_PHRASES = [...I18N_PHRASES, ...I18N_OPENCC_PHRASES]
  .sort((a, b) => b[0].length - a[0].length);

const I18N_SKIP_TAGS = new Set(["SCRIPT", "STYLE", "TEXTAREA", "CODE", "PRE", "INPUT"]);

/* 僅繁→簡:先套用詞組,再逐字轉換 */
const i18nToSimplified = (text) => {
  let out = text;
  for (const [trad, simp] of I18N_ALL_PHRASES) {
    if (out.indexOf(trad) === -1) continue;
    out = out.split(trad).join(simp);
  }
  let res = "";
  for (const ch of out) res += I18N_CHAR_MAP.get(ch) || ch;
  return res;
};

const i18nTranslateText = (text, lang) => {
  if (!text) return text;
  if (lang === I18N_DEFAULT_LANG) return text; // 繁體=源文,恆等(不做逆轉換)
  return i18nToSimplified(text);
};

/* 我們直接改寫 DOM 文本(繞過 React),React 看不到此變更,故切回繁體時不會自動還原。
   因此轉簡時把繁體原文緩存在節點上(__i18nT=繁原文, __i18nS=我們寫入的簡體),
   切回繁體時從緩存還原 —— 不做有歧義的「簡→繁」逆轉換。 */
const I18N_ATTRS = ["placeholder", "title", "aria-label"];

const i18nConvertText = (node) => {
  const v = node.nodeValue;
  if (!v || !v.trim()) return;
  if (v === node.__i18nS) return;        // 已是我們寫入的簡體且未被 React 重置
  const simp = i18nToSimplified(v);
  if (simp !== v) { node.__i18nT = v; node.__i18nS = simp; node.nodeValue = simp; }
};
const i18nRestoreText = (node) => {
  if (node.__i18nT !== undefined && node.nodeValue === node.__i18nS) node.nodeValue = node.__i18nT;
};
const i18nConvertAttrs = (el) => {
  if (!el || !el.getAttribute) return;
  I18N_ATTRS.forEach((attr) => {
    const v = el.getAttribute(attr);
    if (v == null || v === "") return;
    const kS = "__i18nS_" + attr, kT = "__i18nT_" + attr;
    if (v === el[kS]) return;
    const simp = i18nToSimplified(v);
    if (simp !== v) { el[kT] = v; el[kS] = simp; el.setAttribute(attr, simp); }
  });
};
const i18nRestoreAttrs = (el) => {
  if (!el || !el.getAttribute) return;
  I18N_ATTRS.forEach((attr) => {
    const kS = "__i18nS_" + attr, kT = "__i18nT_" + attr;
    if (el[kT] !== undefined && el.getAttribute(attr) === el[kS]) el.setAttribute(attr, el[kT]);
  });
};

const i18nTranslateNode = (root, lang) => {
  if (!root) return;
  const toSimp = lang !== I18N_DEFAULT_LANG;
  const onText = toSimp ? i18nConvertText : i18nRestoreText;
  const onAttrs = toSimp ? i18nConvertAttrs : i18nRestoreAttrs;
  if (root.nodeType === Node.TEXT_NODE) {
    const parent = root.parentElement;
    if (parent && !I18N_SKIP_TAGS.has(parent.tagName)) onText(root);
    return;
  }
  const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {
    acceptNode(node) {
      const parent = node.parentElement;
      if (!parent || I18N_SKIP_TAGS.has(parent.tagName)) return NodeFilter.FILTER_REJECT;
      if (!node.nodeValue || !node.nodeValue.trim()) return NodeFilter.FILTER_REJECT;
      return NodeFilter.FILTER_ACCEPT;
    },
  });
  const nodes = [];
  while (walker.nextNode()) nodes.push(walker.currentNode);
  nodes.forEach(onText);
  if (root.querySelectorAll) {
    onAttrs(root);
    root.querySelectorAll("[placeholder], [title], [aria-label]").forEach(onAttrs);
  }
};

/* MutationObserver:簡體模式下,React 重渲染會把節點還原成繁體源,
   觀察器即時把新插入/變更的文本轉成簡體,確保無殘留。 */
let I18N_OBSERVER = null;
let I18N_CURRENT_LANG = I18N_DEFAULT_LANG;

const i18nStopObserver = () => {
  if (I18N_OBSERVER) { I18N_OBSERVER.disconnect(); I18N_OBSERVER = null; }
};

const i18nStartObserver = (root, lang) => {
  i18nStopObserver();
  if (!root || lang === I18N_DEFAULT_LANG) return; // 繁體模式無需觀察(源即繁體)
  I18N_OBSERVER = new MutationObserver((records) => {
    if (I18N_CURRENT_LANG === I18N_DEFAULT_LANG) return;
    for (const rec of records) {
      if (rec.type === "characterData" || rec.type === "attributes") {
        i18nTranslateNode(rec.target, I18N_CURRENT_LANG);
      } else if (rec.addedNodes) {
        rec.addedNodes.forEach((n) => {
          if (n.nodeType === Node.TEXT_NODE || n.nodeType === Node.ELEMENT_NODE) {
            i18nTranslateNode(n, I18N_CURRENT_LANG);
          }
        });
      }
    }
  });
  I18N_OBSERVER.observe(root, {
    subtree: true,
    childList: true,
    characterData: true,
    attributes: true,
    attributeFilter: ["placeholder", "title", "aria-label"],
  });
};

const I18N = {
  languages: [
    { id: "zh-Hant", label: "繁" },
    { id: "zh-Hans", label: "简" },
  ],
  getInitialLanguage() {
    return localStorage.getItem(I18N_STORE_KEY) || I18N_DEFAULT_LANG;
  },
  saveLanguage(lang) {
    I18N_CURRENT_LANG = lang;
    localStorage.setItem(I18N_STORE_KEY, lang);
    document.documentElement.lang = lang;
    document.title = "WAREHOUSE OS 2.0";
  },
  t(text, lang) {
    return i18nTranslateText(text, lang || this.getInitialLanguage());
  },
  translateTree(root, lang) {
    const l = lang || this.getInitialLanguage();
    I18N_CURRENT_LANG = l;
    i18nTranslateNode(root, l);
    i18nStartObserver(root, l); // 簡體:啟動觀察器;繁體:停止
  },
};

Object.assign(window, { I18N });
