Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the device locale after changing the application locale

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!!!

like image 802
AndroidDev Avatar asked Jan 18 '13 08:01

AndroidDev


3 Answers

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.

like image 116
Bruno Bieri Avatar answered Oct 16 '22 10:10

Bruno Bieri


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.

like image 7
Beppi's Avatar answered Nov 11 '22 06:11

Beppi's


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

like image 6
Daniel Fekete Avatar answered Nov 11 '22 05:11

Daniel Fekete