package Ġcom . daniel rb air d . native Strings Ċ Ċ import Ġgro ovy . json . Json Sl ur per Ċ import Ġorg . gradle . api . Default Task Ċ import Ġorg . gradle . api . tasks .* Ċ import Ġjava . io . File Ċ Ċ /** Ċ Ġ* ĠGenerates Ġthe Ġimplementations Ġfor Ġthe Ġstrings Ġinterface . Ċ Ġ* ĠExpect s Ġthere Ġto Ġbe Ġa Ġlocales Ġfile Ġcalled Ġ" locales . txt " Ċ Ġ* ĠOutput Ġwill Ġbe Ġnamed Ġ" Strings Impl . kt " Ċ Ġ*/ Ċ open Ġclass ĠGenerate Implement ations Task Ġ: ĠDefault Task () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġdestination Folder : ĠString ? Ġ= Ġnull ĠĠĠ Ġ// ĠThe Ġmain Ġoutput Ġfolder ĊĠĠĠ Ġprivate Ġvar Ġinput Folder : ĠString ? Ġ= Ġnull ĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġfolder Ġcontaining Ġall Ġof Ġthe Ġjson Ġfor Ġthe Ġstrings ĊĊĠĠĠ Ġ@ Input ĊĠĠĠ Ġvar ĠpackageName : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġset Destination Folder ( destination Folder : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . destination Folder Ġ= Ġdestination Folder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Output Directory ĊĠĠĠ Ġfun Ġget Destination Folder (): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproject . file ( destination Folder !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Input Folder ( input Folder : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . input Folder Ġ= Ġinput Folder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Input Directory ĊĠĠĠ Ġfun Ġget Input Folder (): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproject . file ( input Folder !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Std lib Api ĊĠĠĠ Ġ@ Task Action ĊĠĠĠ Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Folder Ġ= Ġget Input Folder () ĊĠĠĠĠĠĠĠ Ġval Ġoutput Folder Ġ= Ġget Destination Folder () ĊĠĠĠĠĠĠĠ Ġoutput Folder . mkdir () ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġlist Ġof Ġlocale Ġfiles Ġthat Ġalready Ġexist . ĊĠĠĠĠĠĠĠ Ġval Ġlocales Ġ= ĠFile Helper . get Locales ( File ( input Folder , ĠFile Helper . locales FileName )) ĊĠĠĠĠĠĠĠ Ġval Ġlocale Files Ġ= ĠFile Helper . getLocale Files ( input Folder , Ġlocales ) ĊĊĠĠĠĠĠĠĠ Ġval Ġimpl File Ġ= ĠFile Helper . get Implementation File ( output Folder ) ĊĠĠĠĠĠĠĠ Ġimpl File . write Text ("") ĊĊĠĠĠĠĠĠĠ Ġval ĠstringBuilder Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( locale Files . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Locales Ġfile Ġdid Ġnot Ġexist , Ġor Ġdid Ġnot Ġcontain Ġany Ġlanguages .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġexpect Ġthe Ġfirst Ġlanguage Ġlisted Ġto Ġbe Ġthe Ġ" default ", Ġmeaning Ġthe Ġone Ġthat Ġwill Ġbe Ġedited Ġby Ġdevelopers ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġcontain Ġall Ġof Ġthe Ġkeys Ġthat Ġthey Ġare Ġusing Ġlocally . ĊĠĠĠĠĠĠĠ Ġval Ġdefault Language File Ġ= Ġlocale Files . first (). file ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġgets Ġthe Ġlist Ġof Ġall Ġthe Ġkeys Ġso Ġthat Ġwe Ġcan Ġmake Ġsure Ġwe Ġaccount Ġfor Ġall Ġof Ġthem Ġwith Ġeach Ġof Ġthe Ġlanguages . ĊĠĠĠĠĠĠĠ Ġval Ġall Keys Ġ= ĠFile Helper . get Set Of Ids ( default Language File ) ĊĊĠĠĠĠĠĠĠ ĠstringBuilder . append ln (" package Ġ$ packageName \ n ") ĊĊĊĠĠĠĠĠĠĠ Ġval Ġdefault Translation Json : ĠArrayList < Map < String , ĠAny >> Ġ= ĠJson Sl ur per (). parse Text ( default Language File . read Text ()) Ġas ĠArrayList < Map < String , ĠAny >> ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( locale File Ġin Ġlocale Files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunused Keys Ġ= Ġall Keys . to Mutable Set () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGrab Ġthe Ġjson Ġtext Ġout Ġof Ġthe Ġstring Ġfile Ġand Ġget Ġthe Ġarray . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson : ĠArrayList < Map < String , ĠAny >> Ġ= Ġif Ġ( locale File . file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Sl ur per (). parse Text ( locale File . file . read Text ()) Ġas ĠArrayList < Map < String , ĠAny >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ln (" internal Ġclass Ġ${ locale File . name } Strings Ġ: ĠStrings Ġ{ ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( string Object Ġin Ġjson ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġstring Object [ File Helper . id Key ] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtranslation Ġ= Ġstring Object [ File Helper . translation Key ] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunused Keys . remove ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Method Or Property For ( id , Ġtranslation , ĠstringBuilder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġare Ġstrings Ġin Ġthe Ġdefault Ġfile Ġthat Ġdon 't Ġexist Ġin Ġthis Ġone , Ġwe Ġdon 't Ġwant Ġto Ġbreak Ġthings Ġby Ġnot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhaving Ġthe Ġimplementation Ġcomplete , Ġso Ġwe Ġjust Ġneed Ġto Ġuse Ġthe Ġdefault Ġtranslation . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( unused Key Ġin Ġunused Keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse Ġthe Ġdefault Ġlanguage Ġtranslation Ġto Ġpull Ġout Ġthe Ġparams . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Language Object Ġ= Ġdefault Translation Json . find Ġ{ Ġit [ File Helper . id Key ] Ġas ĠString Ġ== Ġunused Key Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtranslation Ġ= Ġdefault Language Object [ File Helper . translation Key ] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Method Or Property For ( unused Key , Ġtranslation , ĠstringBuilder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ln (" }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ln () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġimpl File . write Text ( string Builder . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Std lib Api ĊĠĠĠ Ġfun Ġadd Method Or Property For ( id : ĠString , Ġtranslation : ĠString , ĠstringBuilder : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparam Ranges Ġ= ĠFile Helper . find Param Ranges ( translation ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( param Ranges . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġhave Ġno Ġparameters Ġwe Ġare Ġusing Ġa Ġlazy Ġval . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ln (" ĠĠĠ Ġoverride Ġval Ġ$ id : ĠString Ġby Ġlazy Ġ{ Ġ\"$ translation \" Ġ} ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Names Ġ= ĠFile Helper . find Param Names ( translation , Ġparam Ranges ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġthe Ġcase Ġthat Ġwe Ġhave Ġparameters Ġwe Ġare Ġgenerating Ġthe Ġimplementation Ġof Ġa Ġmethod . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ln (" ĠĠĠ Ġoverride Ġ${ File Helper . generate Parameterized String MethodName ( id , Ġparam Names )} Ġ{ ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ln (" ĠĠĠĠĠĠĠ Ġreturn Ġ\" ${ File Helper . replace Parameter Range sWith Kotlin Params ( translation , Ġparam Ranges , Ġparam Names )} \" ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ln (" ĠĠĠ Ġ} ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }