Search code examples
androidlocalizationlocale

How to apply new Locale in Android to current screen


I have implemented an option to select GUI language in my app, but I can't make it refresh the screen when a new language is selected.
The selection is made through a ListPreference so there are 2 problems : 1. Refresh the Preference page in which the language is selected. 2. When the app starts, I set the Locale on the onCreate() of the MainActivity but the MainActivity layout is never getting updated with the new selected Locale. (all other screens are updated so the set code is good).

Here is the code for setting the new Locale :

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(ctx);

    String langKey = ctx.getString(R.string.shared_options_select_language_key);
    String langDefault = ctx.getString(R.string.shared_options_select_language_default_value);
String appLanguage = preferences.getString(langKey, langDefault);

Locale locale = null;
if (appLanguage.equals(langDefault)) {                
    locale = new Locale(Resources.getSystem().getConfiguration().locale.getLanguage());
} else {
    String[] languageInfo = appLanguage.split("_");
    if (languageInfo.length > 1) {
        locale = new Locale(languageInfo[0], languageInfo[1]);
    } else {
        locale = new Locale(appLanguage);
    }
}
if (appLanguage.contains(currentLang)) {
    return false;
}
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;

act.getBaseContext().getResources().updateConfiguration(config, act.getBaseContext().getResources().getDisplayMetrics());

Thank you


Solution

  • The answer would be to position the call to setLocale right before setting the screen content :

    setLocale();
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);