9

I am changing the application locale based on user choice. Independent of device locale.

using

public void setDefaultLocale(Context context, String locale) {
        Locale appLoc = new Locale(locale);
        Locale.setDefault(appLoc);
        Configuration appConfig = new Configuration();
        appConfig.locale = appLoc;
        context.getResources().updateConfiguration(appConfig,
                context.getResources().getDisplayMetrics());
    }

But I want to know what will be the device locale also.

When I am trying to get this I always getting the locale which I have set to application.

ex: applictaion is in ENGLISH and device is in CHINESE. I am always getting english.

for getting locale using,

option 1.

String locale = context.getResources().getConfiguration().locale.getCountry();

option 2.

String local_country = ((Activity) context).getBaseContext().getResources().getConfiguration().locale.getCountry();

Any help will be highly appreciated!!!

AndroidDev
  • 888
  • 3
  • 13
  • 27

4 Answers4

7

I asked something similar and found this answer, sorry if it is late:

To find the system locale use:

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

It gets the system locale, no matter which default locale is set for the app/activity.

Beppi's
  • 2,089
  • 1
  • 21
  • 38
6

I am absolutely unsure how portable this is to different devices:

try {
    Process exec = Runtime.getRuntime().exec(new String[]{"getprop", "persist.sys.language"});
    String locale = new BufferedReader(new InputStreamReader(exec.getInputStream())).readLine();
    exec.destroy();
    Log.e("", "Device locale: "+locale);
} catch (IOException e) {
    e.printStackTrace();
}

And if you want the country part: persist.sys.country

Daniel Fekete
  • 4,988
  • 3
  • 23
  • 23
1

If you need to support below Android 7.0 - Nougat (API level 24) you can use something like this:

@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
// ToDo: Adjust this method once the target API is 24 or higher!
private Locale getLocale()
{
  if(Build.VERSION.SDK_INT >= 24)
  {
    return Resources.getSystem().getConfiguration().getLocales().get(0);
  }

  else
  {
    return Resources.getSystem().getConfiguration().locale;
  }
}

Note the annotation regarding deprecation and NewApi. Adjust this method once you target API 24 or higher. Inspired by this answer.

Bruno Bieri
  • 9,724
  • 11
  • 63
  • 92
0

for those whom are using Daniel Fekete 's solution which is :

Process exec = Runtime.getRuntime().exec(new String[]{"getprop", "persist.sys.language"});
String locale = new BufferedReader(new InputStreamReader(exec.getInputStream())).readLine();
exec.destroy();

Be aware of that locale might be EMPTY on latest Android Api(+21)! instead of using persist.sys.language use persist.sys.locale

exec = Runtime.getRuntime().exec(new String[]{"getprop", "persist.sys.locale"});
locale = new BufferedReader(new InputStreamReader(exec.getInputStream())).readLine();
exec.destroy();
Arash GM
  • 10,316
  • 6
  • 58
  • 76