Настройка языка (локали) приложения динамически иногда не меняется - PullRequest
0 голосов
/ 25 апреля 2020

Я написал код для изменения локали приложения:

 public void setLocale(String localeName) {
        if (!localeName.equals(currentLanguage)) {
            currentLanguage = localeName;
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putString(Constant.current_language, localeName);
            editor.apply();
            Toast.makeText(Settings.this, "Language changed. Restarting the app.", Toast.LENGTH_SHORT).show();
            myLocale = new Locale(localeName);
            Resources res = getResources();
            DisplayMetrics dm = res.getDisplayMetrics();
            Configuration conf = res.getConfiguration();
            conf.setLocale(myLocale);
            res.updateConfiguration(conf, dm);
            createConfigurationContext(conf);
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    try{
                        startService(new Intent(getApplicationContext(), LocationService.class));
                    } catch (Exception e){
                        e.printStackTrace();
                    }
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(intent);
                }
            }, 1000);
        } else {
            Toast.makeText(Settings.this, "Language already selected!", Toast.LENGTH_SHORT).show();
        }
    }

Во всех действиях у меня есть следующий код для установки локали:

  @Override
    protected void attachBaseContext(Context newBase) {
        Locale newLocale;
        SharedPreferences sharedPreferences = newBase.getSharedPreferences(
                Constant.app_pref, Context.MODE_PRIVATE);
        newLocale = new Locale(sharedPreferences.getString(Constant.current_language, "en"));
        Context context = ContextWrapper.wrap(newBase, newLocale);
        super.attachBaseContext(context);
    }

Если пользователь меняет язык, приложение перезапускается. Язык изменился отлично. Однако, когда пользователь снова меняет язык, приложение перезапускается, но язык остается прежним. Если пользователь теперь закрывает приложение, удаляет его из недавнего меню приложения, перезапускает приложение, тогда автоматически применяется новый язык.

...