package Ġcom . le ov p . android base . utils . system Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . content . res . Resources Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Locale List Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . local broadcast manager . content . Local Broadcast Manager Ċ import Ġcom . le ov p . android base . ext s . android . shared Prefs Ċ import Ġcom . le ov p . min _ base _ sdk . fail Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠAtt ention : Ċ Ġ* ĠFor ĠChinese Ġlanguage ( Simpl ified ĠChinese , ĠTr ad itional ĠChinese ), Ċ Ġ* Ġ- ĠIf Ġyou Ġset Ġlanguage Ġin Ġ` zh _ CN `, Ġyou Ġshould Ġcreate Ġ` values - zh - r CN ` Ġfolder Ġin Ġ` values ` Ġfolder . Ċ Ġ* Ġ- ĠIf Ġyou Ġset Ġlanguage Ġin Ġ` zh `, Ġyou Ġshould Ġcreate Ġ` values - zh ` Ġfolder Ġin Ġ` values ` Ġfolder . Ċ Ġ* Ċ Ġ* Ġ- ĠLocale . getDefault (). get Language () ĠĠĠĠĠĠ Ġ---> Ġen Ċ Ġ* Ġ- ĠLocale . getDefault (). get ISO 3 Language () ĠĠ Ġ---> Ġeng Ċ Ġ* Ġ- ĠLocale . getDefault (). get Country () ĠĠĠĠĠĠĠ Ġ---> ĠUS Ċ Ġ* Ġ- ĠLocale . getDefault (). get ISO 3 Country () ĠĠĠ Ġ---> ĠUSA Ċ Ġ* Ġ- ĠLocale . getDefault (). getDisplay Country () Ġ---> ĠUnited ĠStates Ċ Ġ* Ġ- ĠLocale . getDefault (). get DisplayName () ĠĠĠ Ġ---> ĠEnglish Ġ( United ĠStates ) Ċ Ġ* Ġ- ĠLocale . getDefault (). toString () ĠĠĠĠĠĠĠĠĠ Ġ---> Ġen _ US Ċ Ġ* Ġ- ĠLocale . getDefault (). getDisplay Language () ---> ĠEnglish Ċ Ġ* Ġ- ĠLocale . getDefault (). to Language Tag () ĠĠĠĠ Ġ---> Ġen - US Ċ Ġ* Ċ Ġ* Ġ** HOW ĠTO ĠUSE ** Ċ Ġ* Ċ Ġ* ĠAdd Ġthese Ġcodes Ġin Ġyour Ġcustom ĠApplication : Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġoverride Ġfun Ġattach Base Context ( base : ĠContext ) Ġ{ Ċ Ġ* ĠĠĠĠĠ Ġsuper . attach Base Context ( Lang Util . set Locale ( base )) Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġoverride Ġfun Ġon Configuration Changed ( new Config : ĠConfiguration ) Ġ{ Ċ Ġ* ĠĠĠĠĠ Ġsuper . on Configuration Changed ( new Config ) Ċ Ġ* ĠĠĠĠĠ ĠLang Util . set Locale ( this ) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠAdd Ġthe Ġfollowing Ġcodes Ġinto Ġyour Ġbase Ġactivity : Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġprivate Ġval Ġapp Lang Change Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ Ċ Ġ* ĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ?) Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġrecreate () Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġoverride Ġfun Ġattach Base Context ( base : ĠContext ) Ġ{ Ċ Ġ* ĠĠĠĠĠ Ġsuper . attach Base Context ( Lang Util . set Locale ( base )) Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ Ċ Ġ* ĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) Ċ Ġ* ĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( this ). register Receiver ( app Lang Change Receiver , ĠIntent Filter ( Lang Util . INT ENT _ APP _ LANG _ CHANGE )) Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġoverride Ġfun Ġon Destroy () Ġ{ Ċ Ġ* ĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( this ). unregister Receiver ( app Lang Change Receiver ) Ċ Ġ* ĠĠĠĠ Ġsuper . on Destroy () Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠIf Ġyou Ġuse Ġtext Ġstring Ġin Ġyour ĠService , Ġadd Ġthese Ġlines Ġin Ġit : Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġoverride Ġfun Ġattach Base Context ( base : ĠContext ) Ġ{ Ċ Ġ* ĠĠĠĠ Ġsuper . attach Base Context ( Lang Util . set Locale ( base )) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠWhen Ġyou Ġwant Ġto Ġchange Ġapp Ġlanguage , Ġit 's Ġeasy : Ċ Ġ* Ġ``` kotlin Ċ Ġ* ĠLang Util . set Locale ( context , ĠLang Util . getLocale (" zh _ CN ") !! , Ġrefresh UI Ġ= Ġtrue ) Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠAuthor : ĠMichael ĠLe o Ċ Ġ* ĠDate : Ġ 2 0 2 1 / 6 / 4 Ġ 1 3 : 0 5 Ċ Ġ*/ Ċ object ĠLang Util Ġ{ ĊĠĠĠ Ġconst Ġval ĠINTENT _ APP _ LANG _ CHANGE Ġ= Ġ" app - lang - change - broadcast " ĊĠĠĠ Ġprivate Ġconst Ġval ĠP REF _ KEY _ LANGUAGE Ġ= Ġ" language " ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġcurrent App Lang : ĠLocale ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMost Ġof Ġtime , Ġjust Ġcall Ġthis Ġmethod Ġis Ġenough . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġset Locale ( ctx : ĠContext , Ġtarget Locale : ĠLocale Ġ= Ġget App Language ( ctx ), Ġrefresh UI : ĠBoolean Ġ= Ġfalse ): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġsave Language ( ctx , Ġtarget Locale ) ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġupdate Resources ( ctx , Ġtarget Locale ) ĊĠĠĠĠĠĠĠ Ġif Ġ( refresh UI ) ĠLocal Broadcast Manager . getInstance ( ctx ). send Broadcast ( Intent ( INT ENT _ APP _ LANG _ CHANGE )) ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġshould Ġbe Ġcalled Ġon Ġ` onCreate `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġctx ĠMost Ġof Ġtime , Ġthis Ġcontext Ġshould Ġbe Ġ` Activity ` Ġcontext . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Resources ( ctx : ĠContext , Ġtarget Locale : ĠLocale ): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres : ĠResources Ġ= Ġctx . resources ĊĠĠĠĠĠĠĠ Ġval Ġconf Ġ= Ġres . configuration ĊĠĠĠĠĠĠĠ Ġ// ĠThere Ġtwo Ġline Ġcodes ( alth ough Ġthey Ġhave Ġalready Ġdeprecated ) Ġare Ġthe Ġmagic . ĊĠĠĠĠĠĠĠ Ġ// ĠIf ĠI Ġcomment Ġthem , Ġthe Ġtext Ġstring Ġin ĠService Ġwill Ġnot Ġbe Ġshown Ġin Ġcorrect Ġlanguage . ĊĠĠĠĠĠĠĠ Ġconf . locale Ġ= Ġtarget Locale ĊĠĠĠĠĠĠĠ Ġres . update Configuration ( conf , Ġres . display Metrics ) ĊĠĠĠĠĠĠĠ ĠLocale . setDefault ( target Locale ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Locale For Api 2 4 ( conf , Ġtarget Locale ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġctx . create Configuration Context ( conf ) ĊĠĠĠĠĠĠĠ Ġreturn Ġctx ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( api Ġ= ĠBuild . VERSION _ CODES . N ) ĊĠĠĠ Ġprivate Ġfun Ġset Locale For Api 2 4 ( config : ĠConfiguration , Ġtarget Locale : ĠLocale ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġset : ĠMutable Set < Locale > Ġ= ĠLinked HashSet () ĊĠĠĠĠĠĠĠ Ġ// ĠB ring Ġthe Ġtarget Ġlocale Ġto Ġthe Ġfront Ġof Ġthe Ġlist ĊĠĠĠĠĠĠĠ Ġset . add ( target Locale ) ĊĠĠĠĠĠĠĠ Ġval Ġall Ġ= ĠLocale List . getDefault () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġall . size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAppend Ġother Ġlocales Ġsupported Ġby Ġthe Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset . add ( all [ i ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlocales Ġ= Ġset . to Typed Array () ĊĠĠĠĠĠĠĠ Ġconfig . set Locales ( Locale List (* locales )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ================= =============== ĊĊĠĠĠ Ġfun Ġget Locale ( language And Country : ĠString ): ĠLocale ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( language And Country . contains ("_ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlang Country Ġ= Ġlanguage And Country . split ("_ ". to Regex ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocale ( lang Country [ 0 ], Ġlang Country [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocale ( language And Country ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. get OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Language CountryCode ( locale : ĠLocale ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcountry Ġ= Ġlocale . country ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( country . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocale . language ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ locale . language }_ $ country " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġresult Ġis Ġlike : Ġ` zh _ CN ` Ġor Ġ` zh _ CN _ # H ans `. ĠPlease Ġnotice Ġthe Ġdifference Ġwith Ġ[ getDevice Language CountryCode ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetDefault Language Full Code (): ĠString Ġ= ĠLocale . getDefault (). toString () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġresult Ġis Ġonly Ġcontains Ġlanguage Ġand Ġcountry , Ġjust Ġlike Ġthis : Ġ` zh _ CN `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetDefault Language CountryCode (): ĠString Ġ= Ġget Language CountryCode ( Locale . getDefault ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġresult Ġis Ġlike : Ġ` ä¸Ńæĸĩ ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetDefault Display Language (): ĠString Ġ= ĠLocale . getDefault (). display Language ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return ĠIf Ġyou Ġcall Ġ` toString ()` Ġon Ġresult , Ġyou Ġwill Ġget Ġsomething Ġlike : Ġzh _ CN _ # H ans ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Device Locale (): ĠLocale Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResources . getSystem (). configuration . locales [ 0 ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResources . getSystem (). configuration . locale ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġresult Ġis Ġonly Ġcontains Ġlanguage Ġand Ġcountry , Ġjust Ġlike Ġthis : Ġ` zh _ CN `. ĠPlease Ġnotice Ġthe Ġdifference Ġwith Ġ[ getDefault Language Full Code ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Device Language CountryCode (): ĠString Ġ= Ġget Language CountryCode ( getDevice Locale ()) ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġsave Language ( ctx : ĠContext , Ġlanguage : ĠLocale ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUse Ġcommit () Ġinstead Ġof Ġapply (), Ġbecause Ġsometimes Ġwe Ġkill Ġthe Ġapplication Ġprocess ĊĠĠĠĠĠĠĠ Ġ// Ġimmediately Ġthat Ġprevents Ġapply () Ġfrom Ġfinish ing ĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// github . com / Y ar ik S Office / Language Test / blob / master / app / src / main / java / com / yar ik so ff ice / lang ua get est / Locale Manager . java ĊĠĠĠĠĠĠĠ Ġctx . shared Prefs . edit (). run Ġ{ Ġput String ( PRE F _ KEY _ LANGUAGE , Ġlanguage . toString ()); Ġcommit () Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent App Lang Ġ= Ġlanguage ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġget App Language ( ctx : ĠContext ): ĠLocale Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current App Lang Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent App Lang Ġ= Ġget Locale ( ctx . shared Prefs . getString ( PRE F _ KEY _ LANGUAGE , Ġ" en ") Ġ?: Ġ" en ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent App Lang Ġ?: Ġfail (" Unexpected Ġexception Ġon Ġget Language From Preference () ") ĊĠĠĠ Ġ} Ċ }