Изменение языка/локали моего приложения на телефонах Oreo 8.0 не работает должным образом

Я могу идеально изменить язык в своем приложении, и оно работает с любым действием. Никогда не было проблем (с моим S4 и телефонами моего друга). Но когда я делаю это со своим S9 (Oreo 8.0), ничего не работает. Язык меняется для некоторых вещей, но большая часть моего приложения не меняет язык. Я не понимаю, что изменилось с Oreo, что больше не работает с тем, что я сделал?

Вот что я делаю, чтобы изменить его (пример для испанского языка):

   private View.OnClickListener btnLangue3Listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            langue.setBackground(ResourcesCompat.getDrawable(getResources(), R.mipmap.spanishflag, null));
  langueMenu.setVisibility(View.GONE);
            if (Locale.getDefault().getLanguage().equals("fr") || Locale.getDefault().getLanguage().equals("en")) {
                Context context = getApplicationContext();
                changeLang(context ,"es");
                saveLocale("es");
                restartActivity();
  }


        }
    };



private void restartActivity() {
        Intent mStartActivity = new Intent(getApplicationContext(), SplashActivity.class);

        finish();
        CharSequence text = getApplicationContext().getResources().getString(R.string.messageLang);
        int duration = Toast.LENGTH_LONG;

        Toast toast = Toast.makeText(this, text, duration);
        toast.show();


        int secs = 14; // Delay in seconds

        Utils.delay(secs, new Utils.DelayCallback() {
            @Override
            public void afterDelay() {
                Intent mStartActivity = new Intent(getApplicationContext(), SplashActivity.class);
                int mPendingIntentId = 123456;
                PendingIntent mPendingIntent = PendingIntent.getActivity(getApplicationContext(), mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
                AlarmManager mgr = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
                System.exit(0);
            }


        });
    }


 public void loadLocale() {
        String langPref = "Language";
        SharedPreferences prefs = getSharedPreferences("CommonPrefs",
                Activity.MODE_PRIVATE);
        String language = prefs.getString(langPref, "");
        changeLang(getApplicationContext(), language);
    }

    public void changeLang(Context context, String lang) {
        if (lang.equalsIgnoreCase(""))
            return;
        Locale locale = new Locale(lang);
        Locale.setDefault(locale);
        Configuration config = getApplicationContext().getResources().getConfiguration();
        config.setLocale(locale);
        getApplicationContext().createConfigurationContext(config);
        getApplicationContext().getResources().updateConfiguration(config, getApplicationContext().getResources().getDisplayMetrics());
}

    public void saveLocale(String lang) {
        String langPref = "Language";
        SharedPreferences prefs = getSharedPreferences("CommonPrefs",
                Activity.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(langPref, lang);
        editor.commit();
    }

Вкратце: я меняю локаль на «es», перезапускаю действие и приложение (не работало, если я не перезапускал приложение) и сохраняю его в файле sharedpreferences. Как только действие открывается, я получаю общие настройки и использую их в качестве локали следующим образом: Сначала я вызываю loadLocale(); тогда :

  public void loadLocale() {
        String langPref = "Language";
        SharedPreferences prefs = getSharedPreferences("CommonPrefs",
                Activity.MODE_PRIVATE);
        String language = prefs.getString(langPref, "");
        changeLang(language);
    }
    public void changeLang(String lang) {


        if (lang.equalsIgnoreCase(""))
            return;
        Locale myLocale = new Locale(lang);
        saveLocale(lang);
        Locale.setDefault(myLocale);


        Configuration config = getApplicationContext().getResources().getConfiguration();
        config.setLocale(myLocale);
        this.createConfigurationContext(config);
        this.getResources().updateConfiguration(config, getApplicationContext().getResources().getDisplayMetrics());
    }

    public void saveLocale(String lang) {
        String langPref = "Language";
        SharedPreferences prefs = getSharedPreferences("CommonPrefs",
                Activity.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(langPref, lang);
        editor.commit();
    }

Что я делаю неправильно? Есть ли более простой или лучший способ сделать это? Я искал везде, и ничего не получалось...


person Louis Bouchard    schedule 07.04.2018    source источник
comment
Телефон имеет глобальную локаль. Используй это. Вы не должны переопределять язык для каждого приложения.   -  person Gabe Sechan    schedule 07.04.2018
comment
я предлагаю вам использовать lib для изменения языка... может быть, некоторые методы, устаревшие в Oreo, пытаются гарантировать, что   -  person EL TEGANI MOHAMED HAMAD GABIR    schedule 07.04.2018
comment
Какая? Я хочу, чтобы пользователь мог изменить локаль, а что вы имеете в виду под глобальной локалью? Как я могу это использовать? Благодарю вас!   -  person Louis Bouchard    schedule 08.04.2018
comment
Использовать lib для смены языка? Не могли бы вы быть немного более точным или у вас есть ссылка, где кто-то объяснит это, пожалуйста? Благодарю вас!   -  person Louis Bouchard    schedule 08.04.2018