Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
280 views
in Technique[技术] by (71.8m points)

android - Automatically change drawer language when app resume from backstack

I have implemented two language in my app "English" and "French" and both of them are working fine individually. When I am trying to check the language change with device language that time getting problem.

Recently my app and device language are "French". Now I am changing the device language from "French" to "English" and then open the app from backstack, app language is still in "French" thats right but In the app, navigation drawer related content changed to "English"

Below is the code for changing language which I have done in GlobalClass

public void changelanguage(String languageToLoad, Context context) {

            Locale locale = new Locale(languageToLoad);
            Locale.setDefault(locale);
            Configuration config = new Configuration();
            config.locale = locale;
            context.getResources().updateConfiguration(config,
                    context.getResources().getDisplayMetrics());

        }

And below is the code for comparing language on MainActivity and Splashscreen

gc = GlobalClass.getInstance()
prefsWrapper = PreferencesWrapper(applicationContext)
sel_langague = prefsWrapper.getPreferenceStringValue(SipConfigManager.LANGUAGE)
println("Language Main : " + sel_langague)
var languageToLoad = ""
if (sel_langague == "0") {
     languageToLoad ="en"
} else {
     languageToLoad ="fr"
}
gc!!.changelanguage(languageToLoad, baseContext)

Does any one have idea for how can I resolve that problem?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Check this,

String language = preferences.getString("language", null);

and this is my onclick listener of button

 llChangeLanguage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {


            if (language == null) {
                LocaleHelper.setLocale(BaseActivity.this, "de");
                Intent intent = new Intent(BaseActivity.this, HomeActivity.class);
                storeLanguageInPref("en");
                startActivity(intent);
                finish();
            } else if ("kn".contentEquals(language)) {
                LocaleHelper.setLocale(BaseActivity.this, "de");
                Intent intent = new Intent(BaseActivity.this, HomeActivity.class);
                startActivity(intent);
                storeLanguageInPref("en");
                finish();
            } else {
                LocaleHelper.setLocale(BaseActivity.this, "kn");
                Intent intent = new Intent(BaseActivity.this, HomeActivity.class);
                storeLanguageInPref("kn");
                startActivity(intent);

                finish();
            }

        }
    });

and here i am storing the selected language to preference

 private void storeLanguageInPref(String language) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(BaseActivity.this);
    SharedPreferences.Editor editor = preferences.edit();

    editor.putString("language", language);
    editor.apply();
}

LocaleHelper class

public class LocaleHelper {

public static Context onAttach(Context context) {
    String locale = getPersistedLocale(context);
    return setLocale(context, locale);
}

public static String getPersistedLocale(Context context) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(SettingsFragment.KEY_PREF_LANGUAGE, "");
}

/**
 * Set the app's locale to the one specified by the given String.
 *
 * @param context
 * @param localeSpec a locale specification as used for Android resources (NOTE: does not
 *                   support country and variant codes so far); the special string "system" sets
 *                   the locale to the locale specified in system settings
 * @return
 */
public static Context setLocale(Context context, String localeSpec) {
    Locale locale;
    if (localeSpec.equals("system")) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            locale = Resources.getSystem().getConfiguration().getLocales().get(0);
        } else {
            //noinspection deprecation
            locale = Resources.getSystem().getConfiguration().locale;
        }
    } else {
        locale = new Locale(localeSpec);
    }
    Locale.setDefault(locale);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        return updateResources(context, locale);
    } else {
        return updateResourcesLegacy(context, locale);
    }
}

@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, Locale locale) {
    Configuration configuration = context.getResources().getConfiguration();
    configuration.setLocale(locale);
    configuration.setLayoutDirection(locale);

    return context.createConfigurationContext(configuration);
}

@SuppressWarnings("deprecation")
private static Context updateResourcesLegacy(Context context, Locale locale) {
    Resources resources = context.getResources();

    Configuration configuration = resources.getConfiguration();
    configuration.locale = locale;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        configuration.setLayoutDirection(locale);
    }

    resources.updateConfiguration(configuration, resources.getDisplayMetrics());

    return context;
}
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...