package Ġc afe . ad riel . ly ric ist . processor . xml . internal Ċ Ċ import Ġc afe . ad riel . ly ric ist . processor . xml . internal . k tx . IND ENT ATION Ċ import Ġc afe . ad riel . ly ric ist . processor . xml . internal . k tx . filter Xml String Files Ċ import Ġc afe . ad riel . ly ric ist . processor . xml . internal . k tx . formatted Ċ import Ġc afe . ad riel . ly ric ist . processor . xml . internal . k tx . get Xml Strings Ċ import Ġc afe . ad riel . ly ric ist . processor . xml . internal . k tx . language Tag Ċ import Ġc afe . ad riel . ly ric ist . processor . xml . internal . k tx . normalized Ċ import Ġc afe . ad riel . ly ric ist . processor . xml . internal . k tx . params Ċ import Ġcom . f le sh gr inder . extensions . kotlin . to Lower Camel Case Ċ import Ġcom . f le sh gr inder . extensions . kotlin . to Upper Camel Case Ċ import Ġcom . google . devtools . k sp . processing . Code Generator Ċ import Ġcom . google . devtools . k sp . processing . Dependencies Ċ import Ġcom . google . devtools . k sp . processing . K SP Logger Ċ import Ġcom . google . devtools . k sp . processing . Resolver Ċ import Ġcom . google . devtools . k sp . processing . Symbol Processor Ċ import Ġcom . google . devtools . k sp . symbol . KS Annotated Ċ import Ġjava . io . File Ċ Ċ internal Ġclass ĠL y ric ist Xml Symbol Processor ( ĊĠĠĠ Ġprivate Ġval Ġconfig : ĠL y ric ist Xml Config , ĊĠĠĠ Ġprivate Ġval Ġcode Generator : ĠCode Generator , ĊĠĠĠ Ġprivate Ġval Ġlogger : ĠK SP Logger Ċ ) Ġ: ĠSymbol Processor Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġstrings Ġ= Ġmutable Map Of < Language Tag , ĠString Resources >() ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( resolver : ĠResolver ): ĠList < KS Annotated > Ġ{ ĊĠĠĠĠĠĠĠ Ġstrings Ġ+= ĠFile ( config . resources Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. walk () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Xml String Files () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlanguage Tag Ġ= Ġfile . language Tag ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( language Tag . isBlank ()) Ġconfig . default Language Tag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġlanguage Tag ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Values Ġ{ Ġ(_, Ġfiles ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . map Ġ{ Ġit . get Xml Strings () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatten () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfinish () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( strings . isEmpty ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġ"${ config . moduleName . to Upper Camel Case ()} Strings " ĊĊĠĠĠĠĠĠĠ Ġstrings [ config . default Language Tag ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġwrite Strings Class File ( fileName , Ġit , Ġstrings . keys ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġlogger . error (" Default Ġlanguage Ġtag Ġnot Ġfound ") ĊĊĠĠĠĠĠĠĠ Ġstrings . forEach Ġ{ Ġ( language Tag , Ġstrings ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Strings Property File ( fileName , Ġlanguage Tag , Ġstrings ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Strings Class File ( fileName : ĠString , Ġstrings : ĠString Resources , Ġlanguage Tags : ĠSet < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġstrings ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Resource . Plain String Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġvalue . value . params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( params . isEmpty ()) Ġ" String " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ" (${ params . join ToString () }) Ġ-> ĠString " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Resource . String Array Ġ-> Ġ" List < String >" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Resource . Pl urals Ġ-> Ġ"( quantity : ĠInt ) Ġ-> ĠString " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" val Ġ${ key . to Lower Camel Case ()} : Ġ$ type " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString (", \ n ") Ġ{ Ġ"$ IND ENT ATION $ it " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtranslation Mapping Output Ġ= Ġlanguage Tags ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġlanguage Tag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Tag Ġto Ġ"${ language Tag . to Upper Camel Case ()} $ fileName " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. join ToString (", \ n ") Ġ{ Ġ( language Tag , Ġproperty ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ IND ENT ATION } Locales .${ language Tag . to Upper Camel Case ()} Ġto Ġ$ property " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlocales Output Ġ= Ġlanguage Tags ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ("\ n ") Ġ{ Ġlanguage Tag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ IND ENT ATION } val Ġ${ language Tag . to Upper Camel Case ()} Ġ= Ġ\"$ language Tag \"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdefault Strings Output Ġ= Ġ"${ config . default Language Tag . to Upper Camel Case ()} $ fileName " ĊĊĠĠĠĠĠĠĠ Ġcode Generator . createNew File ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ= ĠDependencies ( aggreg ating Ġ= Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName Ġ= Ġconfig . packageName , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName Ġ= ĠfileName ĊĠĠĠĠĠĠĠ Ġ). use Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| package Ġ${ config . packageName } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġandroidx . compose . runtime . Composable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġandroidx . compose . runtime . static Composition Local Of ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġandroidx . compose . ui . text . intl . Locale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġc afe . ad riel . ly ric ist . Ly ric ist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġc afe . ad riel . ly ric ist . Language Tag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġc afe . ad riel . ly ric ist . remember Strings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġc afe . ad riel . ly ric ist . Provide Strings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| data Ġclass Ġ$ fileName ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| $ values ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| object ĠLoc ales Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| $ locales Output ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| private Ġval Ġstrings Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| $ translation Mapping Output ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| val ĠLocal $ fileName Ġ= Ġstatic Composition Local Of Ġ{ Ġ$ default Strings Output Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Composable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| public Ġfun Ġremember $ fileName ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġlanguage Tag : ĠLanguage Tag Ġ= ĠLocale . current . to Language Tag () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ): ĠL y ric ist <$ fileName > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġremember Strings ( strings , Ġlanguage Tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Composable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| public Ġfun ĠProvide $ fileName ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġly ric ist : ĠL y ric ist <$ fileName >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġcontent : Ġ@ Composable Ġ() Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ ĠProvide Strings ( ly ric ist , ĠLocal $ fileName , Ġcontent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin (). toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Strings Property File ( fileName : ĠString , Ġlanguage Tag : ĠString , Ġstrings : ĠString Resources ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠpropertyName Ġ= Ġlanguage Tag . to Upper Camel Case () Ġ+ ĠfileName ĊĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġstrings ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresource Value Ġ= Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Resource . Plain String Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġvalue . value . params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġi , Ġ_ Ġ-> Ġ" p $ i " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( params . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\" ${ value . value . normalized }\ "" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" { Ġ$ params Ġ-> ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ"${ value . value . normalized }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠ Ġ. format ($ params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Resource . String Array Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ${ value . value . formatted } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Resource . Pl urals Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" { Ġquantity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġwhen Ġ( quantity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ${ value . value . formatted } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ}. format ( quantity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ key . to Lower Camel Case ()} Ġ= Ġ$ resource Value " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString (", \ n \ n ") Ġ{ Ġ"$ IND ENT ATION $ it " Ġ} ĊĊĠĠĠĠĠĠĠ Ġcode Generator . createNew File ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ= ĠDependencies ( aggreg ating Ġ= Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName Ġ= Ġconfig . packageName , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName Ġ= ĠpropertyName ĊĠĠĠĠĠĠĠ Ġ). use Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| package Ġ${ config . packageName } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| val Ġ$ propertyName Ġ= Ġ$ fileName ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| $ values ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin (). toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ