// package Ġio . github . g math i . no vel library . util . system Ċ // Ċ // import Ġandroid . app . Application Ċ // import Ġandroid . content . Context Ċ // import Ġandroid . content . res . Configuration Ċ // import Ġandroid . os . Build Ċ // import Ġandroid . view . Context Theme Wrapper Ċ // import Ġandroidx . core . os . Configuration Compat Ċ // import Ġu y . ko hes ive . in jekt . inject Lazy Ċ // import Ġjava . util . Locale Ċ // Ċ // /** Ċ // Ġ* ĠUtility Ġclass Ġto Ġchange Ġthe Ġapplication 's Ġlanguage Ġin Ġruntime . Ċ // Ġ*/ Ċ //@ Suppress (" DE PREC ATION ") Ċ // object ĠLocale Helper Ġ{ Ċ // Ċ // ĠĠĠ Ġprivate Ġval Ġpreferences : ĠPreferences Helper Ġby Ġinject Lazy () Ċ // Ċ // ĠĠĠ Ġprivate Ġvar Ġsystem Locale : ĠLocale ? Ġ= Ġnull Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠThe Ġapplication 's Ġlocale . ĠWhen Ġit 's Ġnull , Ġthe Ġsystem Ġlocale Ġis Ġused . Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġprivate Ġvar Ġapp Locale Ġ= Ġget Locale FromString ( preferences . lang ()) Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠThe Ġcurrently Ġapplied Ġlocale . ĠUsed Ġto Ġavoid Ġlo sing Ġthe Ġselected Ġlanguage Ġafter Ġa Ġnon Ġlocale Ċ // ĠĠĠĠ Ġ* Ġconfiguration Ġchange Ġto Ġthe Ġapplication . Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġprivate Ġvar Ġcurrent Locale : ĠLocale ? Ġ= Ġnull Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠReturns Ġthe Ġlocale Ġfor Ġthe Ġvalue Ġstored Ġin Ġpreferences , Ġor Ġnull Ġif Ġit 's Ġsystem Ġlanguage . Ċ // ĠĠĠĠ Ġ* Ċ // ĠĠĠĠ Ġ* Ġ@ param Ġpref Ġthe Ġstring Ġvalue Ġstored Ġin Ġpreferences . Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġfun Ġget Locale FromString ( pref : ĠString ?): ĠLocale ? Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( pref . isNull OrEmpty ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġget Locale ( pref ) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠReturns ĠDisplay Ġname Ġof Ġa Ġstring Ġlanguage Ġcode Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġfun Ġget Source DisplayName ( lang : ĠString ?, Ġcontext : ĠContext ): ĠString Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( lang ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ"" Ġ-> Ġcontext . getString ( R . string . other _ source ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠSource Presenter . LAST _ USED _ KEY Ġ-> Ġcontext . getString ( R . string . last _ used _ source ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠSource Presenter . PIN N ED _ KEY Ġ-> Ġcontext . getString ( R . string . pinned _ sources ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" all " Ġ-> Ġcontext . getString ( R . string . all _ lang ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġget DisplayName ( lang ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠReturns ĠDisplay Ġname Ġof Ġa Ġstring Ġlanguage Ġcode Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġfun Ġget DisplayName ( lang : ĠString ?): ĠString Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( lang ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ"" Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ"" Ġ-> Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsystem Locale !!. get DisplayName ( system Locale ). capitalize () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocale Ġ= Ġget Locale ( lang ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocale . get DisplayName ( locale ). capitalize () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠReturn ĠLocale Ġfrom Ġstring Ġlanguage Ġcode Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġprivate Ġfun Ġget Locale ( lang : ĠString ): ĠLocale Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġsp Ġ= Ġlang . split ("_ ", Ġ"- ") Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( sp . size ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠLocale ( sp [ 0 ], Ġsp [ 1 ]) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> ĠLocale ( sp [ 0 ], Ġsp [ 1 ], Ġsp [ 2 ]) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLocale ( lang ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠChanges Ġthe Ġapplication 's Ġlocale Ġwith Ġa Ġnew Ġpreference . Ċ // ĠĠĠĠ Ġ* Ċ // ĠĠĠĠ Ġ* Ġ@ param Ġpref Ġthe Ġnew Ġvalue Ġstored Ġin Ġpreferences . Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġfun Ġchange Locale ( pref : ĠString ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġapp Locale Ġ= Ġget Locale FromString ( pref ) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠUpdates Ġthe Ġapp 's Ġlanguage Ġto Ġan Ġactivity . Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġfun Ġupdate Configuration ( wrapper : ĠContext Theme Wrapper ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( app Locale Ġ!= Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfiguration ( preferences . context . resources . configuration ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . set Locale ( app Locale ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġwrapper . apply Override Configuration ( config ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠUpdates Ġthe Ġapp 's Ġlanguage Ġto Ġthe Ġapplication . Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġfun Ġupdate Configuration ( app : ĠApplication , Ġconfig : ĠConfiguration , Ġconfig Change : ĠBoolean Ġ= Ġfalse ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( system Locale Ġ== Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġsystem Locale Ġ= ĠConfiguration Compat . get Locales ( config )[ 0 ] Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( config Change ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Locale Ġ= ĠConfiguration Compat . get Locales ( config )[ 0 ] Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Locale Ġ== Ġconfig Locale ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġsystem Locale Ġ= Ġconfig Locale Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġcurrent Locale Ġ= Ġapp Locale Ġ?: Ġsystem Locale Ġ?: ĠLocale . getDefault () Ċ // ĠĠĠĠĠĠĠ Ġval Ġnew Config Ġ= Ġupdate Config Locale ( config , Ġcurrent Locale !! ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġresources Ġ= Ġapp . resources Ċ // ĠĠĠĠĠĠĠ Ġresources . update Configuration ( new Config , Ġresources . display Metrics ) Ċ // Ċ // ĠĠĠĠĠĠĠ ĠLocale . setDefault ( current Locale ) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠReturns Ġa Ġnew Ġconfiguration Ġwith Ġthe Ġgiven Ġlocale Ġapplied . Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġprivate Ġfun Ġupdate Config Locale ( config : ĠConfiguration , Ġlocale : ĠLocale ): ĠConfiguration Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġnew Config Ġ= ĠConfiguration ( config ) Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . N ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġnew Config . locale Ġ= Ġlocale Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġnew Config . set Locale ( locale ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġnew Config Ċ // ĠĠĠ Ġ} Ċ //} Ċ