Get the current language in device
Asked Answered
M

32

721

How can we get the current language selected in the Android device?

Microsporophyll answered 18/11, 2010 at 6:49 Comment(3)
The majority of answers here get the language of the application. Given that you can set the default locale of the application in code, the correct answer is the answer given by Sarpe - that gives you the device's locale.Tarazi
@VictorIonescu thank you for the comment. Sarpe's answer is correct answer to fetch device's locale. Please refer it. https://mcmap.net/q/63416/-get-the-current-language-in-deviceRoadrunner
Does this answer your question? How to identify device language from the App language in Android 13?Lesbian
C
947

If you want to get the selected language of your device, this might help you:

Locale.getDefault().getDisplayLanguage();

You can use Locale.getDefault().getLanguage(); to get the usual language code (e.g. "de", "en")

Clarita answered 18/11, 2010 at 7:7 Comment(18)
use "Locale.getDefault()" only if you wanna get instance of LocaleWatchful
getDisplayLanguage() will localise the language. If you're interested in just getting the ISO code (e.g. for if or switch statements) use 'Locale.getDefault().getISO3Language();'Composure
getISO3Language() returns things like "deu" for Deutschland (germany) instead of de ...Albertalberta
You can use Locale.getDefault().getLanguage(); to get the usual language code (e.g. "de", "en").Aslant
And also refer this link for more variant methods developer.android.com/reference/java/util/Locale.htmlDemagogy
@DeRagan, This will not always gives you language for your device, but for your app only. For example, if I call Locale.setDefault("ru"), and language in system settings is set to English, then method Locale.getDefault().getLanguage() will return "ru", but not "en". Is there another method of getting real SYSTEM locale/language? I found not documented solution here, but is there more elegant solution?Splat
I prefer Locale.getDefault().toString() which gives a string that fully identifies the locale, e.g. "en_US".Ogre
@Patrick is it fair to copy paste from my answer: #4212820Hieroglyphic
@Hieroglyphic you are right it isn't fair. all i tried was helping people to get correct answers (thought that is what stackoverflow is about). sorry for not getting that it is about competing with others for points before helping people getting answers...Antinomian
really Tom's answer is best, thanks @Tom. Locale.getDefault().toString()Barred
@Splat this post will help you https://mcmap.net/q/63416/-get-the-current-language-in-device ,use Resources.getSystem().getConfiguration().locale;Mabelmabelle
Downvoted the answer because it is not fully true as is specified in the comment to the initial question. The right one is given by Sarpe: you should use Resources to get system default language.Splat
I'd recommend against parsing a toString implementation to solve this problem, as recommended above. The Locale documentation "strongly discourages" this, but admits the implementation is stable enough that it shouldn't cause problems. In general, though, developers typically don't guarantee implementations of toString will remain stable.Mercier
Locale.getLanguage(), write locale.getLanguage().equals(new Locale("he").getLanguage()) instead of, if (locale.getLanguage().equals("he")) // BAD!Copulative
Resources.getSystem().getConfiguration().locale works properly on Android 9. Locale.getDefault() always returns English! Beware!Quicktempered
It is not working properly always return "English".Gimlet
I thought I read somewhere in Apple docs that there is a signal upon app launch/foregrounding which alerts the programmer if the locale changed while the app was away. Is this true? Can somebody help jog my memory?Caprifig
If you want to get language of your current application then you can try this : context.getResources().getConfiguration().locale.getLanguage()Selfsustaining
H
1061

I've checked the Locale methods on my Android 4.1.2 device, and the results:

Locale.getDefault().getLanguage()       ---> en      
Locale.getDefault().getISO3Language()   ---> eng 
Locale.getDefault().getCountry()        ---> US 
Locale.getDefault().getISO3Country()    ---> USA 
Locale.getDefault().getDisplayCountry() ---> United States 
Locale.getDefault().getDisplayName()    ---> English (United States) 
Locale.getDefault().toString()          ---> en_US
Locale.getDefault().getDisplayLanguage()---> English
Locale.getDefault().toLanguageTag()     ---> en-US
Hieroglyphic answered 19/4, 2014 at 9:36 Comment(2)
Thanks, nice with a list of possibilities. Could you please add "Locale.getDefault().toString()", as suggested in a comment by "Tom".Ferriter
there is also Locale.getDefault().getDisplayLanguage() which returns "English"Molar
C
947

If you want to get the selected language of your device, this might help you:

Locale.getDefault().getDisplayLanguage();

You can use Locale.getDefault().getLanguage(); to get the usual language code (e.g. "de", "en")

Clarita answered 18/11, 2010 at 7:7 Comment(18)
use "Locale.getDefault()" only if you wanna get instance of LocaleWatchful
getDisplayLanguage() will localise the language. If you're interested in just getting the ISO code (e.g. for if or switch statements) use 'Locale.getDefault().getISO3Language();'Composure
getISO3Language() returns things like "deu" for Deutschland (germany) instead of de ...Albertalberta
You can use Locale.getDefault().getLanguage(); to get the usual language code (e.g. "de", "en").Aslant
And also refer this link for more variant methods developer.android.com/reference/java/util/Locale.htmlDemagogy
@DeRagan, This will not always gives you language for your device, but for your app only. For example, if I call Locale.setDefault("ru"), and language in system settings is set to English, then method Locale.getDefault().getLanguage() will return "ru", but not "en". Is there another method of getting real SYSTEM locale/language? I found not documented solution here, but is there more elegant solution?Splat
I prefer Locale.getDefault().toString() which gives a string that fully identifies the locale, e.g. "en_US".Ogre
@Patrick is it fair to copy paste from my answer: #4212820Hieroglyphic
@Hieroglyphic you are right it isn't fair. all i tried was helping people to get correct answers (thought that is what stackoverflow is about). sorry for not getting that it is about competing with others for points before helping people getting answers...Antinomian
really Tom's answer is best, thanks @Tom. Locale.getDefault().toString()Barred
@Splat this post will help you https://mcmap.net/q/63416/-get-the-current-language-in-device ,use Resources.getSystem().getConfiguration().locale;Mabelmabelle
Downvoted the answer because it is not fully true as is specified in the comment to the initial question. The right one is given by Sarpe: you should use Resources to get system default language.Splat
I'd recommend against parsing a toString implementation to solve this problem, as recommended above. The Locale documentation "strongly discourages" this, but admits the implementation is stable enough that it shouldn't cause problems. In general, though, developers typically don't guarantee implementations of toString will remain stable.Mercier
Locale.getLanguage(), write locale.getLanguage().equals(new Locale("he").getLanguage()) instead of, if (locale.getLanguage().equals("he")) // BAD!Copulative
Resources.getSystem().getConfiguration().locale works properly on Android 9. Locale.getDefault() always returns English! Beware!Quicktempered
It is not working properly always return "English".Gimlet
I thought I read somewhere in Apple docs that there is a signal upon app launch/foregrounding which alerts the programmer if the locale changed while the app was away. Is this true? Can somebody help jog my memory?Caprifig
If you want to get language of your current application then you can try this : context.getResources().getConfiguration().locale.getLanguage()Selfsustaining
B
163

What worked for me was:

Resources.getSystem().getConfiguration().locale;

Resources.getSystem() returns a global shared Resources object that provides access to only system resources (no application resources), and is not configured for the current screen (can not use dimension units, does not change based on orientation, etc).

Because getConfiguration.locale has now been deprecated, the preferred way to get the primary locale in Android Nougat is:

Resources.getSystem().getConfiguration().getLocales().get(0);

To guarantee compatibility with the previous Android versions a possible solution would be a simple check:

Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale = Resources.getSystem().getConfiguration().getLocales().get(0);
} else {
    //noinspection deprecation
    locale = Resources.getSystem().getConfiguration().locale;
}

Update

Starting with support library 26.1.0 you don't need to check the Android version as it offers a convenient method backward compatible getLocales().

Simply call:

ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());
Bueschel answered 13/2, 2015 at 11:1 Comment(6)
getConfiguration().locale is currently deprecated, use getConfiguration().getLocales().get(0) insteadAdipose
This is the correct answer to this question. other answers get local of the app, not the device.Mainmast
I don't know if this existed when the answer was written, but the support library has backwards compatible versions of this, there is no need to write backwards compatibility yourself. ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())Ioannina
As @Ioannina pointed out, now using the new support library method getLocales is the way to go. I've updated my answer.Bueschel
This is right answer. Others return the language of application not of system.Compander
Kotlin version of @Thorbear's answer: ConfigurationCompat.getLocales(Resources.getSystem().configuration) (Just posting this coz I can't find anything about whether CC-BY-SA 4.0 (which Stackoverflow's user content is under) considers "converting Java to Kotlin" as adaptation thus requiring such change to be published...)Hester
A
51

You can 'extract' the language from the current locale. You can extract the locale via the standard Java API, or by using the Android Context. For instance, the two lines below are equivalent:

String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();
Aam answered 18/11, 2010 at 7:51 Comment(8)
this is not true. They are different. The first can change if the user switches the Locale. The second is the one that is pre-installed on the phone. It never changes no matter what the user does.Strapless
Comment by gregm might be false. See answer by airewyre.Harlotry
@gregm's comment is wrong. Just try it out yourself and you will see, that Locale.getDefault() will change when you change the language in settings.Antinomian
Should see #10658247Blameworthy
Although @gregm's comment is wrong, he still is right those two lines do not need to return the same locale. Just call Locale.setDefault() with some other locale beforehand and you get different results.Qp
Doesn't work on Android 9, always returns English. Only this works: https://mcmap.net/q/63416/-get-the-current-language-in-deviceQuicktempered
This is not a solution that works always. There is difference between the app and the device language. If the device e.g. is set to Italian but the app does only supporting English (as default) and French, Locale will report English and not Italian. You can also manually set the app language using Configuration. Sarpe's answer is the better choice!Minor
Just wanted to add that, at least on my case it seems like the Locale.getDefault() option was more accurate in general for whatever reason. For most languages I picked, both options were giving the same codes, but when I changed the phone's language to Indonesian for example, I got "in_ID" using Locale.getDefault(), whereas with Android's resources config, I got "en_US".Headship
P
39

To save others time and/or confusion I wanted to share that I have tried the two alternatives proposed by Johan Pelgrim above and on my device they are equivalent - whether or not the default location is changed.

So my device's default setting is English(United Kindom) and in this state as expected both Strings in Johan's answer give the same result. If I then change the locale in the phone settings (say to italiano(Italia)) and re-run then both Strings in Johan's answer give the locale as italiano(Italia).

Therefore I believe Johan's original post to be correct and gregm's comment to be incorrect.

Porfirioporgy answered 19/11, 2011 at 8:53 Comment(0)
K
19

As described in Locale reference the best way to get language is:

Locale.getDefault().getLanguage()

this method returns string with language id according to ISO 639-1 standart

Kilmer answered 12/7, 2013 at 7:41 Comment(0)
C
17

You can use this

boolean isLang = Locale.getDefault().getLanguage().equals("xx");

when "xx" is any language code like "en", "fr", "sp", "ar" .... and so on

Cottingham answered 15/9, 2013 at 16:24 Comment(2)
if (Locale.ENGLISH.equals(Locale.getDefault().getLanguage())) { ...}Segarra
@ClementMartino your suggestion is OK in case of Pre-defined Locales like ENGLISH, but for other locales like Arabic, we have to parse it using the lang codeCottingham
I
15

if API level is 24 or above, use LocaleList.getDefault().get(0).getLanguage() else use Locale.getDefault.getLanguage()

private fun getSystemLocale() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    LocaleList.getDefault().get(0).language
} else {
    Locale.getDefault().language
}

reference: https://developer.android.com/guide/topics/resources/multilingual-support

Incus answered 25/6, 2018 at 10:42 Comment(0)
H
7

This solution worked for me. This will return you the android device's language (not the app's local language)

String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();

This will return "en" or "de" or "fr" or whatever your device language is set to.

Holozoic answered 21/2, 2019 at 17:54 Comment(0)
R
6

To add to Johan Pelgrim's answer

context.getResources().getConfiguration().locale
Locale.getDefault()

are equivalent because android.text.format.DateFormat class uses both interchangeably, e.g.

private static String zeroPad(int inValue, int inMinDigits) {
    return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
}

and

public static boolean is24HourFormat(Context context) {
    String value = Settings.System.getString(context.getContentResolver(),
            Settings.System.TIME_12_24);

    if (value == null) {
        Locale locale = context.getResources().getConfiguration().locale;

    // ... snip the rest ...
}
Rickyrico answered 7/12, 2012 at 6:26 Comment(0)
L
6

You can try to get locale from system resources:

PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();
Lick answered 20/8, 2014 at 11:24 Comment(1)
This is THE answer in case you've overridden any part of the configurationAbsinthism
J
6

If you want to check a current language, use the answer of @Sarpe (@Thorbear):

val language = ConfigurationCompat.getLocales(Resources.getSystem().configuration)?.get(0)?.language
// Check here the language.
val format = if (language == "ru") "d MMMM yyyy г." else "d MMMM yyyy"
val longDateFormat = SimpleDateFormat(format, Locale.getDefault())
Jabber answered 21/5, 2019 at 9:7 Comment(1)
If you want to apply user's local date format, use DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date()).Jabber
C
6
public void GetDefaultLanguage( ) {
    try {
        String langue = Locale.getDefault().toString(); //        ---> en_US
        /*
        Log.i("TAG", Locale.getDefault().getLanguage() ); //       ---> en
        Log.i("TAG", Locale.getDefault().getISO3Language()  ); //  ---> eng
        Log.i("TAG", Locale.getDefault().getCountry()  ); //       ---> US
        Log.i("TAG", Locale.getDefault().getISO3Country()  ); //   ---> USA
        Log.i("TAG", Locale.getDefault().getDisplayCountry() ); // ---> United States
        Log.i("TAG", Locale.getDefault().getDisplayName() ); //    ---> English (United States)
        Log.i("TAG", Locale.getDefault().toString()   ); //        ---> en_US
        Log.i("TAG", Locale.getDefault().getDisplayLanguage() ); //---> English 
        */

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            langue = Locale.getDefault().toLanguageTag(); //     ---> en-US
            url_Api = getUrlMicrosoftLearn(langue);
            Log.i("TAG", url_Api );
            Log.i("TAG", langue );
        }else{
            langue = langue.replace("_","-"); //     ---> en-US
            url_Api = getUrlMicrosoftLearn(langue);
            Log.i("TAG", url_Api );
            Log.i("TAG", langue );
        }
    }catch (Exception ex) {
        Log.i("TAG", "Exception:GetDefaultLanguage()", ex);
    }
}

public String getUrlMicrosoftLearn(String langue) {
    return "https://learn.microsoft.com/"+langue+"/learn";
}
Calm answered 26/2, 2020 at 0:6 Comment(1)
It would be better if you could add more instructions to the answer, rather than just pasting the code.Evangelia
S
4

Answers above don't distinguish between simple chinese and traditinal chinese. Locale.getDefault().toString() works which returns "zh_CN", "zh_TW", "en_US" and etc.

References to : https://developer.android.com/reference/java/util/Locale.html, ISO 639-1 is OLD.

Spoonful answered 4/9, 2015 at 8:23 Comment(0)
D
4

The others have given good answers for the device language,

if you wish the app language the easiest way to do it is by adding an app_lang key to your strings.xml file, and specify the lang for each of the langs as well.

That way, if your app's default language is different from the device language, you can chose to send that as parameter for your services.

Divisibility answered 1/7, 2019 at 15:12 Comment(1)
I can't believe there's no framework support for giving you the language the AssetManager is currently using. In fact, the String format helpers in Resources.java use the default locale[0] so if the string from the AssetManager comes from a locale that does not match the device's default locale (because your app does not support it but supports e.g. the next on the list) then there's a bug.Teilo
I
4

Basic Kotlin answer:

Locale.getDefault().language
Isoline answered 22/11, 2021 at 17:7 Comment(2)
https://mcmap.net/q/63416/-get-the-current-language-in-device ?Increasing
According to my tests, you do not need checking version control.Isoline
G
4

Please be careful, most of the answers here provides the language of the application. There can be cases where this application can have/set a different language than the device.

To get the actual device languages (Yes, if the user have multiple languages added in the settings, it will return all of it!)

Kotlin:

// Will return something like ["en_US", "de_DE"]
val deviceLanguages: LocaleListCompat = ConfigurationCompat.getLocales(Resources.getSystem().configuration)
// Will return the actual language in use, like "en" or "de". The first language in the above code will be the default language
val currentActiveDeviceLanguage = languages.get(0).language 
Guardian answered 6/4, 2022 at 13:22 Comment(0)
D
3

You can use this code to find out keyboard current

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodSubtype ims = imm.getCurrentInputMethodSubtype();
String locale = ims.getLocale();
Drover answered 11/9, 2013 at 5:21 Comment(0)
D
3

If you choose a language you can't type this Greek may be helpful.

getDisplayLanguage().toString() = English
getLanguage().toString() = en 
getISO3Language().toString() = eng
getDisplayLanguage()) = English
getLanguage() = en
getISO3Language() = eng

Now try it with Greek

getDisplayLanguage().toString() = Ελληνικά
getLanguage().toString() = el
getISO3Language().toString() = ell
getDisplayLanguage()) = Ελληνικά
getLanguage() = el
getISO3Language() = ell
Damsel answered 17/5, 2017 at 15:17 Comment(0)
D
3
public class LocalUtils {

    private static final String LANGUAGE_CODE_ENGLISH = "en";


    // returns application language eg: en || fa ...
    public static String getAppLanguage() {
        return Locale.getDefault().getLanguage();
    }

    // returns device language eg: en || fa ...
    public static String getDeviceLanguage() {
        return ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getLanguage();
    }

    public static boolean isDeviceEnglish() {
        return getDeviceLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
    }

    public static boolean isAppEnglish() {
        return getAppLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
    }


}

Log.i("AppLanguage: ",     LocalUtils.getAppLanguage());
Log.i("DeviceLanguage: ",  LocalUtils.getDeviceLanguage());
Log.i("isDeviceEnglish: ", String.valueOf(LocalUtils.isDeviceEnglish()));
Log.i("isAppEnglish: ",    String.valueOf(LocalUtils.isAppEnglish()));
Devito answered 12/2, 2019 at 7:56 Comment(0)
A
3

Locale.getDefault().getLanguage() is VM language

Locale.getDefault().getLanguage()

It is the language of the current VM instance that is running your app. It is consumed by java classes such as DateFormat etc. You may need to modify this when changing app locale if you use certain java classes. If you have modified this during changing your App locale it is not the same as the language of android.

context.getConfiguration().locale.getLanguage() is Activity language

context.getConfiguration().locale.getLanguage()

This is the language set at your activity. In the latest SDK versions following is preferable

context.getConfiguration().getLocales().get(0).getLanguage()

Resources.getSystem().getConfiguration().getLocales() gives all locales that user has added at system level

This will give you the first locale that user has set at the system level.

Resources.getSystem().getConfiguration().getLocales().get(0).getLanguage()

A great number of users are multilingual so you may want to loop through Locales.

Asbestos answered 29/5, 2022 at 6:14 Comment(0)
D
2

There are two languages.

Default language of OS:

Locale.getDefault().getDisplayLanguage();

Current language of Application:

getResources().getConfiguration().locale.getDisplayLanguage();//return string
Dandruff answered 18/11, 2014 at 16:47 Comment(1)
thats not true, if you change locale in your app even first give you changed value and not system valueAssuasive
P
2
Locale.getDefault().getDisplayLanguage()

will give you Written name for the Language, for example, English, Dutch, French

Locale.getDefault().getLanguage()

will give you language code, for instance: en, nl, fr

Both methods return String

Pulpiteer answered 10/7, 2018 at 10:18 Comment(0)
S
1

The correct way of getting the language of your device is the following:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    return context.getResources().getConfiguration().getLocales().get(0);
} else {
    return context.getResources().getConfiguration().locale;
}

Hope it helps.

Semblable answered 11/7, 2017 at 16:9 Comment(0)
B
1

My solution is like this

@SuppressWarnings("deprecation")
public String getCurrentLocale2() {
    return Resources.getSystem().getConfiguration().locale.getLanguage();
}

@TargetApi(Build.VERSION_CODES.N)
public Locale getCurrentLocale() {
    getResources();
    return Resources.getSystem().getConfiguration().getLocales().get(0);
}

and then

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                Log.e("Locale", getCurrentLocale().getLanguage());
            } else {
                Log.e("Locale", getCurrentLocale2().toString());
            }

shown ---> en

Bootery answered 9/10, 2017 at 20:30 Comment(0)
B
1

The code bellow will return you the country code like US

Locale.getDefault().getCountry()
Boscage answered 18/5, 2023 at 15:22 Comment(0)
E
0

here is code to get device country. Compatible with all versions of android even oreo.

Solution: if user does not have sim card than get country he is used during phone setup , or current language selection.

public static String getDeviceCountry(Context context) {
    String deviceCountryCode = null;

    final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

        if(tm != null) {
            deviceCountryCode = tm.getNetworkCountryIso();
        }

    if (deviceCountryCode != null && deviceCountryCode.length() <=3) {
        deviceCountryCode = deviceCountryCode.toUpperCase();
    }
    else {
        deviceCountryCode = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getCountry().toUpperCase();
    }

  //  Log.d("countryCode","  : " + deviceCountryCode );
    return deviceCountryCode;
}
Eskisehir answered 24/8, 2018 at 10:45 Comment(0)
T
0

If you use jetpack compose

In side of composable functional

Context.applicationContext.resources.configuration.locales.get(0).language 
Terryterrye answered 17/9, 2022 at 12:30 Comment(0)
P
0

you can use .setLanguage(Locale.forLanguageTag(Locale.getDefault().getLanguage())); it is good

Palmary answered 29/10, 2022 at 22:48 Comment(1)
Locale.getDefault().getLanguage() ---> en Locale.getDefault().getISO3Language() ---> eng Locale.getDefault().getCountry() ---> US Locale.getDefault().getISO3Country() ---> USA Locale.getDefault().getDisplayCountry() ---> United States Locale.getDefault().getDisplayName() ---> English (United States) Locale.getDefault().toString() ---> en_US Locale.getDefault().getDisplayLanguage()---> English Locale.getDefault().toLanguageTag() ---> en-USPalmary
C
0

An updated answer for Jetpack compose, from within a @Composable

val locale = Locale.current
// locale.language
Curbstone answered 3/7, 2023 at 18:1 Comment(0)
O
-1
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
    // your code here
}
Overeager answered 24/11, 2015 at 12:53 Comment(3)
Please add some details about why this answers the question - just code snippet will not help readers to understand the solutionOshinski
Locale.getDefault().getDisplayName() gives the current language of your device. and we are checking whether Device language is Hindi or not .. If current Device language is Hindi, then do what you want in the block.Overeager
This is hard coding. That is not how it should be handled. Whatever difference want to have across languages you need to do it via properties in the values-LL folders.Asbestos
I
-2

If you want to do specific task for users resides in India who speaks Hindi then use below if condition

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
 //Block executed only for the users resides in India who speaks Hindi 
}
Intellectual answered 29/3, 2018 at 7:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.