Changing locale: Force activity to reload resources?
Solution 1
In your AndroidManifest.xml, add this attribute to your Activity
android:configChanges="locale"
In your activity override onConfigurationChanged()
@Override
public void onConfigurationChanged(Configuration newConfig) {
// refresh your views here
super.onConfigurationChanged(newConfig);
}
https://developer.android.com/guide/topics/manifest/activity-element.html#config
Solution 2
I think the question is switching language in runtime for the app and displaying localized messages in UI. android:configChanges="locale"
calls onConfigurationChanged
if the system locale is changed (in setting of your device) while the app is running, and not if you change locale in the code for your app, which I guess is what you want to accomplish. That's why it's not refreshing.
Solution 3
Here is the method I use during every activity onCreate() or onResume() depending on my needs (if my activity will be resuming after user changed language settings or will always be created with language already set):
From there I just refresh the view manually or from onConfigurationChanged() which get called after this method finishes.
public static void changeLocale(Activity activity, String language)
{
final Resources res = activity.getResources();
final Configuration conf = res.getConfiguration();
if (language == null || language.length() == 0)
{
conf.locale = Locale.getDefault();
}
else
{
final int idx = language.indexOf('-');
if (idx != -1)
{
final String[] split = language.split("-");
conf.locale = new Locale(split[0], split[1].substring(1));
}
else
{
conf.locale = new Locale(language);
}
}
res.updateConfiguration(conf, null);
}
Comments
-
pgsandstrom almost 4 years
So I have a language setting in my application. When the language is switched, I would like all the textviews etc to change language immediately. Currently I just change the locale in the configuration, so the language has changed when the user restarts the activity.
An ugly solution to my problem would be to make each textview load the new resources each time the language is changed. Is there a better solution? Perhaps a neat way to discretely restart the activity? Or maybe just force reload of the resources?
-
pgsandstrom about 14 yearsIs this supposed to trigger when I call resource.updateConfiguration()? Im currently not having any success with getting the onConfigurationChanged() to run. :'(
-
Jim Blackler about 14 yearsonConfigurationChanged() should trigger when the language is changed. Actually just looking back there is a red flag in your question which I missed first time, "I have a language setting in my application". Does this mean you are not using the Android device-wide language setting facility?
-
pgsandstrom about 14 yearsIm not sure what you mean? But I do use the locale of the phone when the app first starts, and I have several resources marked for example values-en, values-fr, values-de etc. I just still want to the user to be able to have my app in a different language then the phone. I dont know why, but some users have requested this feature.
-
Jim Blackler about 14 yearsAren't users annoying? I often think we'd be better off without them :-) Anyway if you have rolled your own language selector, why are you having difficulty refreshing your layouts?
-
pgsandstrom about 14 yearsTrue :P I am not using my completely own language support. Im still using resource.updateConfiguration(), and Im not sure why this isnt picked up by onConfigurationChanged().
-
emeraldhieu almost 13 yearsI don't undeststand how to refresh the views. I store locales in shared prefs and load it in onConfigurationChanged but nothing refresh after choosing new locale.
-
himalayagiant over 12 yearsReally sorry, it's my mistake: my activity is an embedded activity of an tabactivity, when add android:configChanges="locale" to the tabactivity, it works well, it will not goes to onDestroy() when change the language, and will call onConfigurationChanged() in the tabactivity, but this method cann't called in the embedded activity.
-
SMR over 10 yearsgreat thinking. one method for all activities.
-
IgorGanapolsky almost 10 years@JimBlackler What do you mean "refresh your views here"? Does that happen automatically using the language resource file, or do I have to do it manually for each view myself?
-
IgorGanapolsky almost 10 yearsWhat if you have do this in a Fragment - how do you refresh the locale language there?
-
IntoTheDeep almost 8 yearsDid not reaload fragments at all
-
Hradesh Kumar about 7 yearsUse android:configChanges="locale|layoutDirection" in xml if not getting callback to onConfigurationChanged.
-
Nicks over 6 yearsPerfect answer Thanks @3c71
-
Thorbear over 6 yearsAn explanation for downvotes would be much appreciated.
-
loshkin over 5 yearsDeprecated See android.content.Context.createConfigurationContext(Configuration)
-
loshkin over 5 yearsDeprecated. Use context.createConfigurationContext(Configuration)
-
Văn Quyết over 5 yearswhat about: refresh your views here
-
Nguyen about 3 yearsI am using this way to switch the app language. but the app doesn't load my 'vi' resource when the system language is in 'en'. Do you know why?
-
Thorbear about 3 years@Nguyen 'vi' as in "U.S. Virgin Islands"? According to Android Studio the correct locale for that is 'en-rVI'. Where are your resources saved? And in order for the app to load those resources, you'll need the locale to be 'en-rVI', not just 'en', otherwise it will go with normal 'en' resources or the default ones.