How to get the current locale (API level 24)?

17,229

Solution 1

Check which version you're running on and fallback to the deprecated solution:

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

Solution 2

You could use Locale.getDefault(), which is the Java standard way of getting the current Locale.

Solution 3

In Configuration.java, there is:

/**
 * ...
 * @deprecated Do not set or read this directly. Use {@link #getLocales()} and
 * {@link #setLocales(LocaleList)}. If only the primary locale is needed,
 * <code>getLocales().get(0)</code> is now the preferred accessor.
 */
@Deprecated public Locale locale;
...
configOut.mLocaleList = LocaleList.forLanguageTags(localesStr);
configOut.locale = configOut.mLocaleList.get(0);

So basically using locale basically returns the primary locale the user sets. The accept answer does exactly the same as reading locale directly.

However this locale isn't necessarily the one used when getting resources. It might be the user's secondary locale if the primary locale isn't available.

Here's a more correct version:

Resources resources = context.getResources();
Locale locale = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
        ? resources.getConfiguration().getLocales()
            .getFirstMatch(resources.getAssets().getLocales())
        : resources.getConfiguration().locale;

Solution 4

Here's a one-liner that uses the ConfigurationCompat class:

ConfigurationCompat.getLocales(context.getResources().getConfiguration()).get(0)
Share:
17,229
user3290180
Author by

user3290180

I'm interested in all mobile programming.

Updated on June 22, 2022

Comments

  • user3290180
    user3290180 about 2 years

    I was doing this way:

    context.getResources().getConfiguration().locale
    

    Configuration.locale is deprecated if target is 24. So I made this change:

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

    Now it says that it's only for minSdkVersion 24, so I cannot use it because my min target is lower.

    What's the right method?

  • Peter Serwylo
    Peter Serwylo over 7 years
    This will only return the locale specified in the system settings. Many apps have their own language selector functionality. If that is the case, then the answer from @Egor is preferred.
  • Byte Welder
    Byte Welder over 7 years
    If you select the locale manually, you should call Locale.setDefault()
  • Byte Welder
    Byte Welder over 7 years
    This is very important, because otherwise Java libraries won't pick up the correct Locale correctly.
  • LanDenLabs
    LanDenLabs over 5 years
    Peter states that some apps have their own language selector. If they do, they should call Locale.setDefault as Ken states. So once again this solution will work. This should be the preferred answer.
  • Victor
    Victor over 2 years
    Thanks for this, it should be the accepted answer: Minimal and without warnings.