Changing locale: Force activity to reload resources?

42,579

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);
}
Share:
42,579
pgsandstrom
Author by

pgsandstrom

._.

Updated on July 06, 2020

Comments

  • pgsandstrom
    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
    pgsandstrom about 14 years
    Is this supposed to trigger when I call resource.updateConfiguration()? Im currently not having any success with getting the onConfigurationChanged() to run. :'(
  • Jim Blackler
    Jim Blackler about 14 years
    onConfigurationChanged() 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
    pgsandstrom about 14 years
    Im 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
    Jim Blackler about 14 years
    Aren'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
    pgsandstrom about 14 years
    True :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
    emeraldhieu almost 13 years
    I 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
    himalayagiant over 12 years
    Really 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
    SMR over 10 years
    great thinking. one method for all activities.
  • IgorGanapolsky
    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
    IgorGanapolsky almost 10 years
    What if you have do this in a Fragment - how do you refresh the locale language there?
  • IntoTheDeep
    IntoTheDeep almost 8 years
    Did not reaload fragments at all
  • Hradesh Kumar
    Hradesh Kumar about 7 years
    Use android:configChanges="locale|layoutDirection" in xml if not getting callback to onConfigurationChanged.
  • Nicks
    Nicks over 6 years
    Perfect answer Thanks @3c71
  • Thorbear
    Thorbear over 6 years
    An explanation for downvotes would be much appreciated.
  • loshkin
    loshkin over 5 years
    Deprecated See android.content.Context.createConfigurationContext(Configura‌​tion)
  • loshkin
    loshkin over 5 years
    Deprecated. Use context.createConfigurationContext(Configuration)
  • Văn Quyết
    Văn Quyết over 5 years
    what about: refresh your views here
  • Nguyen
    Nguyen about 3 years
    I 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
    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.