Android языковой стандарт не (полностью) изменяется во время выполнения - PullRequest
0 голосов
/ 29 апреля 2020

Я создаю приложение Android, в котором необходимо изменить языковой стандарт во время выполнения. Я воссоздаю всю активность и некоторые строки меняются, что связано с моим viewmodel, но другие строки (strings. xml) остаются непереведенными. В своей деятельности я использовал следующий класс для перевода:

    public class Language {
        private static String PREFS_LANGUAGE = "LANGUAGE";

        public static void setLanguage(Context context, String language, Activity activity) {
            // Save selected language
            persist(language);

            // Update language
            Locale locale = new Locale(language);
            Locale.setDefault(locale);
            Configuration config = new Configuration();
            config.locale = Locale.UK;
            context.getResources().updateConfiguration(config, MainApplication.getContext().getResources().getDisplayMetrics());
            activity.onConfigurationChanged(config);
        }

        private static SharedPreferences getSharedPrefs(Context context) {
            return context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE);
        }

        private static void persist(String language) {
            SharedPreferences.Editor editor = getSharedPrefs(MainApplication.getContext()).edit();
            editor.putString(PREFS_LANGUAGE, language);
            editor.apply();
        }
    }

и в своей деятельности:

       fun setLanguage(language: String){
            Language.setLanguage(MainApplication.getContext(),language, this)
        }

         override fun onConfigurationChanged(newConfig: Configuration) {
            super.onConfigurationChanged(newConfig)
             recreate()
        }

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Я только что скопировал это из моего старого источника, основываясь на Java.

Переопределите это в вашем классе приложения и Mainactvity.

  @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(LocaleHelper.onAttach(base));
        Log.e(TAG, "attachBaseContext: ");
    }

Как использовать: всякий раз, когда вы нажимаете что-то, вызывайте вот так.

Здесь

язык привет (хинди), а регион - Индия (IN)

Например:

LocaleHelper.setLocale (this, "hi", "IN");
пересоздать (); // теперь перезапускаем.

A Local Helper class

 public class LocaleHelper {
    private static final String TAG = "DAFT_PUNK_LH : ";


    private static final String SELECTED_LANGUAGE = "en";
    private static final String SELECTED_LANGUAGE_COUNTRY = "US";


    public static Context onAttach(Context context) {
        Log.d(TAG, "onAttach:");
        String lang = getPersistedData(context, Locale.getDefault().getLanguage());
        String langCountry = getPersistedCountryData(context, Locale.getDefault().getCountry());
        return setLocale(context, lang, langCountry);
    }


    public static String getLanguage(Context context) {
        return getPersistedData(context, Locale.getDefault().getLanguage());
    }

    public static String getLanguageCountry(Context context) {
        return getPersistedCountryData(context, Locale.getDefault().getCountry());
    }

    public static Context setLocale(Context context, String language, String langCountry) {
        Log.d(TAG, "setLocale:  ");
        persist(context, language, langCountry);

        return updateResources(context, language, langCountry);


    }

    private static String getPersistedData(Context context, String defaultLanguage) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
    }

    private static String getPersistedCountryData(Context context, String defaultLangCountry) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        return preferences.getString(SELECTED_LANGUAGE_COUNTRY, defaultLangCountry);
    }

    private static void persist(Context context, String language, String langCountry) {
        Log.d(TAG, "persist:  ");
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = preferences.edit();

        editor.putString(SELECTED_LANGUAGE, language);
        editor.putString(SELECTED_LANGUAGE_COUNTRY, langCountry);
        editor.apply();
    }


    @TargetApi(Build.VERSION_CODES.N)
    private static Context updateResources(Context context, String language, String langCountry) {
        Log.d(TAG, "updateResources:  ");
        Locale locale = new Locale(language, langCountry);
        Locale.setDefault(locale);

        Configuration configuration = context.getResources().getConfiguration();
        configuration.setLocale(locale);
        configuration.setLayoutDirection(locale);

        return context.createConfigurationContext(configuration);
    }
}
0 голосов
/ 29 апреля 2020

Ответ notTdar помог мне найти решение, но я также обнаружил ошибку в моей модели:

change: getContext (). GetResources (). GetString (R.string.str)

to: Mainapplication.getContext (). GetResources (). GetString (R.string.str)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...