Android проблема с программным изменением языка приложения - PullRequest
0 голосов
/ 21 января 2020

Я создал приложение android (используя Xamarin c#), и оно содержит экран настроек, где пользователи могут менять язык приложения. Этот языковой параметр сохраняется также на сервере путем вызова API. После смены языка я перевожу sh тексты на экран настроек и в другие открытые действия, и все кажется работающим.

Проблема в том, что когда я закрываю и снова открываю приложение: я вхожу в систему пользователя и читаю язык данные с сервера. Я программно изменяю язык локали приложения в свою основную деятельность: например, я установил язык, отличный от языка смартфона по умолчанию. Это действие содержит 4 фрагмента в ViewPager, но иногда эти фрагменты написаны на «старом» языке, и «новый» язык применяется неправильно. Итак, когда я открываю новое действие, показанный язык является «старым», а не «новым».

Я что-то не так делаю? Кто-нибудь может мне помочь?

Следуя моему коду:

В моем классе AppBaseActivity, событие OnCreate:

base.OnCreate(bundle);

if (UserSettings != null
    && !string.IsNullOrWhiteSpace(UserSettings.LanguageCode))
{
    LocaleManager.ChangeAppLanguage(this, UserSettings.LanguageCode);
}

В моем классе AppBaseActivity, событие OnResume:

base.OnResume();

if (UserSettings != null
    && !string.IsNullOrWhiteSpace(UserSettings.LanguageCode))
{
    LocaleManager.ChangeAppLanguage(this, UserSettings.LanguageCode);
}

Мой метод LocaleManager.ChangeAppLanguage:

public static bool ChangeAppLanguage(Context context, String lang, bool saveInSharedPreferences)
        {
            Locale newLocale = new Locale(lang);

            if (Locale.Default.Language != newLocale.Language)
            {
                Locale.Default = newLocale;
                Android.Content.Res.Configuration config = new Android.Content.Res.Configuration();

                if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                {
                    config.SetLocale(newLocale);
                }
                else
                {
                    config.Locale = newLocale;
                }

                context.Resources.UpdateConfiguration(config, context.Resources.DisplayMetrics);

                if (saveInSharedPreferences)
                    return Helper.SaveInSharedPreferences(context, context.ApplicationContext.PackageName + ".languageCode", lang);

                return true;
            }

            return false;
        }

1 Ответ

0 голосов
/ 22 января 2020

вы должны загрузить новый Context в методе AttachBaseContext вашей AppBaseActivity, вы можете сослаться на здесь

...