/* Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 2 0 - 2 0 2 1 , ĠSimp lex ion , ĠH ung ary Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ package Ġz ak ad ab ar . core . resource Ċ Ċ import Ġz ak ad ab ar . core . data . String Pair Ċ import Ġkotlin . properties . ReadOnly Property Ċ import Ġkotlin . reflect . K Property Ċ Ċ /** Ċ Ġ* ĠStores Ġconstant Ġstrings Ġmeant Ġto Ġdisplay Ġfor Ġthe Ġuser . ĠOn Ġthe Ġfrontend Ċ Ġ* Ġthis Ġis Ġlabels , Ġmessages Ġetc . Ċ Ġ* Ċ Ġ* Ġ@ property Ġ Ġmap ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠValues Ġin Ġthis Ġstring Ġstore . Ċ Ġ* Ġ@ property Ġ Ġnormalized Key Map Ġ ĠSame Ġvalues Ġas Ġin Ġ[ map ] Ġbut Ġthe Ġkeys Ġare Ġnormalized . Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNormal ization Ġmeans : Ġlowercase , Ġall Ġhy ph ens Ġremoved . Ċ Ġ*/ Ċ open Ġclass ĠZ k String Store ( ĊĠĠĠ Ġval Ġmap : ĠMutable Map < String , ĠString > Ġ= Ġmutable Map Of (), ĊĠĠĠ Ġval Ġnormalized Key Map : ĠMutable Map < String , ĠString > Ġ= Ġmutable Map Of () Ċ ) Ġ{ ĊĊĠĠĠ Ġclass ĠStrings Delegate Ġ: ĠReadOnly Property < Zk String Store , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠZ k String Store , Ġproperty : ĠK Property < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis Ref . map [ property . name ] Ġ!! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠString . provide Delegate ( this Ref : ĠZ k String Store , Ġprop : ĠK Property < *> ): ĠReadOnly Property < Zk String Store , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ref . map [ prop . name ] Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġthis Ref . normalized Key Map [ prop . name . lowercase ()] Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġreturn ĠStrings Delegate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġchild Stores Ġ= Ġmutable ListOf < Zk String Store >() ĊĊĠĠĠ Ġoperator Ġfun Ġplus Assign ( child Store Ġ: ĠZ k String Store ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchild Stores Ġ+= Ġchild Store ĊĠĠĠĠĠĠĠ Ġchild Store . map . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ it . key ] Ġ= Ġit . value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġchild Store . normalized Key Map . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormalized Key Map [ it . key ] Ġ= Ġit . value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMerge Ġa Ġlist Ġof Ġlocale Ġstrings Ġinto Ġthis Ġstring Ġstore . ĠOverrides Ġany ĊĠĠĠĠ Ġ* Ġstrings Ġthat Ġare Ġalready Ġin Ġthe Ġstore . ĠAdds Ġany Ġnew Ġstrings Ġthat Ġare ĊĠĠĠĠ Ġ* Ġnot Ġin Ġthe Ġstore Ġyet . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAlso Ġoverrides Ġchild Ġstores , Ġbut Ġonly Ġthe Ġkeys Ġthat Ġare Ġpresent Ġin Ġthem . ĊĠĠĠĠ Ġ* ĠThis Ġpropag ates Ġthe Ġtranslations Ġbut Ġdoes Ġnot Ġmultiply Ġall Ġstrings . ĊĠĠĠĠ Ġ* ĠWe Ġhave Ġto Ġimprove Ġthis Ġon Ġthe Ġlong Ġrun . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ Ġthe Ġstring Ġstore Ġmerge Ġis Ġcalled Ġon ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmerge ( other : ĠList < String Pair >) Ġ{ ĊĠĠĠĠĠĠĠ Ġother . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġit . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġit . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormalized Key Ġ= Ġnormalize Key ( key ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormalized Key Map [ normalized Key ] Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Stores . forEach Ġ{ Ġchild Store Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Store . map . containsKey ( value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Store . map [ key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Store . normalized Key Map [ normalized Key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġstrings Ġfrom Ġthe Ġother Ġstore Ġif Ġthey Ġdon 't Ġalready Ġexists Ġin Ġthis ĊĠĠĠĠ Ġ* Ġstore . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠDoes Ġnot Ġoverride Ġchild Ġstores . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Missing ( other : ĠZ k String Store ) Ġ{ ĊĠĠĠĠĠĠĠ Ġother . map . forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġin Ġthis . map ) Ġreturn @ forEach ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormalized Key Ġ= Ġnormalize Key ( key ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormalized Key Map [ normalized Key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġa Ġvalue Ġfor Ġthe Ġgiven Ġkey . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠĠ Ġkey Ġ ĠThe Ġkey Ġto Ġlook Ġup . ĊĠĠĠĠ Ġ* Ġ@ return Ġ Ġthe Ġstring Ġvalue Ġthat Ġbelongs Ġto Ġthis Ġkey ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġget ( key : ĠString ) Ġ= Ġmap [ key ] Ġ?: Ġkey ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġa Ġvalue Ġfor Ġthe Ġgiven Ġkey Ġwith Ġa Ġnormalized Ġlook Ġup . ĠThis Ġis Ġused ĊĠĠĠĠ Ġ* Ġfor Ġautomatic Ġlabel ing Ġ/ Ġnaming . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ 1 . Ġtry Ġto Ġget Ġwith Ġthe Ġexact Ġkey , Ġif Ġit Ġexists , Ġreturn Ġwith Ġit . ĊĠĠĠĠ Ġ* Ġ 1 . Ġtry Ġto Ġget Ġthe Ġnormalized Ġkey Ġfrom Ġthe Ġ[ normalized Key Map ]. ĊĠĠĠĠ Ġ* Ġ 1 . Ġreturn Ġwith Ġthe Ġkey Ġitself ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠĠ Ġkey Ġ ĠThe Ġkey Ġto Ġlook Ġup . ĊĠĠĠĠ Ġ* Ġ@ return Ġ Ġthe Ġstring Ġvalue Ġthat Ġbelongs Ġto Ġthis Ġkey ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Normalized ( key : ĠString ) Ġ= Ġmap [ key ] Ġ?: Ġnormalized Key Map [ normalize Key ( key )] Ġ?: Ġkey ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġa Ġvalue Ġfor Ġthe Ġclass Ġname Ġof Ġthe Ġobject Ġwith Ġa Ġnormalized Ġlook Ġup . ĠThis Ġis Ġused ĊĠĠĠĠ Ġ* Ġfor Ġautomatic Ġlabel ing Ġ/ Ġnaming . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ 1 . Ġtry Ġto Ġget Ġwith Ġthe Ġexact Ġkey , Ġif Ġit Ġexists , Ġreturn Ġwith Ġit . ĊĠĠĠĠ Ġ* Ġ 1 . Ġtry Ġto Ġget Ġthe Ġnormalized Ġkey Ġfrom Ġthe Ġ[ normalized Key Map ]. ĊĠĠĠĠ Ġ* Ġ 1 . Ġreturn Ġwith Ġthe Ġkey Ġitself ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠĠ Ġinstance Ġ ĠThe Ġinstance Ġto Ġlook Ġup . ĊĠĠĠĠ Ġ* Ġ@ return Ġ Ġthe Ġstring Ġvalue Ġthat Ġbelongs Ġto Ġthis Ġkey ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Normalized ( instance Ġ: ĠAny ) Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġinstance :: class . simple Name Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġreturn Ġmap [ key ] Ġ?: Ġnormalized Key Map [ normalize Key ( key )] Ġ?: Ġkey ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnormalize Key ( key : ĠString ) Ġ= Ġkey . lowercase (). replace ("- ", Ġ"") Ċ Ċ }