I am changing the application locale based on user choice. Independent of device locale.
using
public void setDefaultLocale(Context context, String
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.
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.
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
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();