package Ġco . vol ight . soft . impl . lang Ċ Ċ import Ġco . vol ight . soft . Mod Id Ċ import Ġco . vol ight . soft . Soft Ċ import Ġco . vol ight . soft . api . lang . Lang Handle Ċ import Ġco . vol ight . soft . api . lang . Lang Str Ċ import Ġcom . google . gson . Gson Ċ import Ġnet . fabric mc . loader . api . Fabric Loader Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Path Matcher Ċ Ċ type alias ĠText Name Ġ= ĠString Ċ type alias ĠLang Name Ġ= ĠString Ċ type alias ĠLang Text Map Ġ= ĠMap < Text Name , ĠLang Str > Ċ type alias ĠLang Map Ġ= ĠMap < Lang Name , ĠLang Text Map > Ċ type alias ĠMod Lang Map Ġ= ĠMutable Map < Mod Id , ĠLang Handle > Ċ Ċ internal Ġconst Ġval Ġlog Name Ġ= Ġ"[ Soft API : Lang ]" Ċ Ċ internal Ġobject ĠLang Impl Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlang s : ĠMod Lang Map Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġfun Ġget ( mode Name : ĠMod Id ): ĠLang Handle ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlang s [ mode Name ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreg ( mode Name : ĠMod Id , Ġpath : ĠString ? Ġ= Ġnull ): ĠLang Handle ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= ĠFabric Loader . getInstance (). get Mod Container ( mode Name ). orElse Throw Ġ{ Ġthrow ĠRuntimeException (" Mod Ġ\" ${ mode Name }\" Ġnot Ġloaded ") Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlang Dir Ġ= Ġcontainer . getPath ( path Ġ?: Ġ" assets /${ mode Name }/ lang /") ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlang Map Ġ= Ġload Lang Map ( mode Name , Ġlang Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandle Ġ= ĠLang Handle ( mode Name , Ġlang Map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlang s [ mode Name ] Ġ= Ġhandle ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSoft . LOGGER . info ("$ log Name ĠLanguage Ġfiles Ġof Ġmod Ġ\" ${ mode Name }\" Ġloaded ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSoft . LOGGER . error ("$ log Name ĠFailed Ġto Ġload Ġthe Ġlanguage Ġfile Ġof Ġmod Ġ\" ${ mode Name } \"", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Lang Map ( mod name : ĠMod Id , Ġlang Dir : ĠPath ): ĠLang Map Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson File : ĠPath Matcher Ġ= Ġlang Dir . file System . getPath Matcher (" glob :** /*. json ") ĊĠĠĠĠĠĠĠ Ġreturn Ġsequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . walk ( lang Dir ). use Ġ{ Ġpaths Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( path Ġin Ġpaths . filter Ġ{ Ġ! Files . isDirectory ( it ) Ġ&& Ġjson File . matches ( it ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSoft . LOGGER . debug ("$ log Name Ġloading Ġ$ path ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Map Ġ= Ġload Text Map ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw M ame Ġ= Ġpath . fileName . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġraw M ame . substring ( 0 , Ġraw M ame . length Ġ- Ġ 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSoft . LOGGER . info ("$ log Name Ġmod Ġ\" ${ mod name }\" Ġloaded Ġlang Ġ\" ${ name }\" ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( Pair ( name , Ġtext Map )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Text Map ( path : ĠPath ): ĠLang Text Map Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgson Ġ= ĠGson () ĊĠĠĠĠĠĠĠ Ġval Ġstr Map Ġ= Ġgson . fromJson < Map < String , ĠString >>( Files . new BufferedReader ( path ), ĠMap :: class . java ) ĊĠĠĠĠĠĠĠ Ġreturn Ġstr Map . map Values Ġ{ ĠLang Str . parse ( it . value ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ