/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 Ġy vol k Ġ( Y uri ĠVol kov ), Ġhttp :// y ur iv olk ov . com Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġorg . and status . app . context Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Context Wrapper Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Locale List Ċ import Ġorg . ac ra . AC RA Ċ import Ġorg . and status . app . util . I 1 8 n Ċ import Ġorg . and status . app . util . SharedPreferences Util Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ġ@ author Ġy vol k @ y ur iv olk ov . com Ċ Ġ*/ Ċ object ĠMy Locale Ġ{ ĊĠĠĠ Ġprivate Ġval ĠCUSTOM _ LOCAL E _ DEFAULT : ĠString Ġ= Ġ" default " ĊĠĠĠ Ġinternal Ġval ĠMY _ DEFAULT _ LOCAL E : ĠLocale Ġ= ĠLocale . US ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġm Custom Locale : ĠLocale ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġm Device Default Locale : ĠLocale ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġis En Locale (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocale Ġ= Ġget App Locale () ĊĠĠĠĠĠĠĠ Ġreturn Ġlocale . language . isEmpty () Ġ|| Ġlocale . language . startsWith (" en ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget App Locale (): ĠLocale Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Custom Locale Ġ?: Ġget Device Default Locale () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Device Default Locale (): ĠLocale Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocale 1 Ġ= Ġm Device Default Locale ĊĠĠĠĠĠĠĠ Ġif Ġ( locale 1 Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSee Ġhttps :// stackoverflow . com / a / 5 9 2 0 9 9 9 3 / 2 9 7 7 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLocale List . getDefault ()[ 0 ]. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Device Default Locale Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlocale 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Locale ( context Wrapper : ĠContext Wrapper ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstr Locale Ġ= ĠSharedPreferences Util . getString ( My Preferences . KEY _ CUSTOM _ LOCAL E , ĠCUSTOM _ LOCAL E _ DEFAULT ) ĊĠĠĠĠĠĠĠ Ġif Ġ( str Locale Ġ!= ĠCUSTOM _ LOCAL E _ DEFAULT Ġ|| Ġm Custom Locale Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Custom Locale Ġ= Ġif Ġ( str Locale Ġ== ĠCUSTOM _ LOCAL E _ DEFAULT ) Ġnull Ġelse ĠLocale ( I 1 8 n . locale To Language ( str Locale ), ĠI 1 8 n . locale To Country ( str Locale )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocale Ġ= Ġget App Locale () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocale . setDefault ( locale ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġcontext Wrapper . getBase Context (). resources . configuration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . set Locale ( locale ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠA CR A . error Reporter . put Custom Data (" locale ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstr Locale Ġ+ Ġ", Ġ" Ġ+ Ġ( m Custom Locale ?. get DisplayName () Ġ?: Ġ"( Ġcustom Ġnot Ġset )") Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ", Ġdefault =" Ġ+ Ġget Device Default Locale (). get DisplayName ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Configuration Changed ( context Wrapper : ĠContext Wrapper , Ġnew Config : ĠConfiguration ): ĠConfiguration Ġ{ ĊĠĠĠĠĠĠĠ Ġm Device Default Locale Ġ= Ġnew Config . get Locales ()[ 0 ] ĊĠĠĠĠĠĠĠ ĠMy Theme . forget () ĊĠĠĠĠĠĠĠ Ġreturn Ġm Custom Locale ?. let Ġ{ Ġto Custom ized ( new Config , Ġit ) Ġ} Ġ?: Ġnew Config ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠBased Ġon Ġhttps :// stackoverflow . com / questions / 3 9 7 0 5 7 3 9 / android - n - change - language - program matically / 4 0 8 4 9 1 4 2 ĊĠĠĠ Ġfun Ġon Attach Base Context ( context : ĠContext ): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Custom Locale Ġ== Ġnull ) Ġreturn Ġcontext ĊĠĠĠĠĠĠĠ ĠLocale . setDefault ( getApp Locale ()) ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= Ġto Custom ized ( context . getResources (). configuration , Ġget App Locale ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext . create Configuration Context ( configuration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Custom ized ( configuration : ĠConfiguration ?, Ġnew Locale : ĠLocale ?): ĠConfiguration Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcustom Ġ= ĠConfiguration ( configuration ) ĊĠĠĠĠĠĠĠ Ġcustom . set Locale ( new Locale ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcustom ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapply Override Configuration ( base Context : ĠContext , Ġoverride Configuration : ĠConfiguration ?): ĠConfiguration ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( override Configuration Ġ!= Ġnull Ġ&& ĠBuild . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġui Mode Ġ= Ġoverride Configuration . ui Mode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Configuration . set To ( base Context . getResources (). configuration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Configuration . ui Mode Ġ= Ġui Mode ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġoverride Configuration ĊĠĠĠ Ġ} Ċ } Ċ