Конвертация локали не работает со вкусами продукта - PullRequest
0 голосов
/ 15 ноября 2018

Мое приложение имеет функцию изменения языка приложения на английский, арабский или русский. Это приложение имеет разные вкусы продукта, т.е. Flavor1, Flavor2. Каждое приложение для ароматов будет иметь эту опцию для преобразования языка приложения в английский, арабский, русский. Я поместил строковые файлы в оба варианта по отдельности и не поместил ни одного строкового файла в main. Но когда я меняю язык с опции, он просто меняет направление, предполагаемое справа налево для арабского, но строки не переводятся.

Ниже приведена иерархия файлов строк.

     Flavor1 
      values
        strings.xml [Contains all english strings]
      values-ar
        strings.xml [Contains all arabic strings]
       values-ru
         strings.xml [Contains all russian strings]
     main 
      values
        Contains colors,dimens but no strings file
    Flavor2 
      values
        strings.xml [Contains all english strings]
      values-ar
        strings.xml [Contains all arabic strings]
       values-ru
         strings.xml [Contains all russian strings]

Ниже приведен код фрагмента настроек, в котором изменен язык приложения.

public class SettingsFragment extends PreferenceFragmentCompat implements
        SharedPreferences.OnSharedPreferenceChangeListener, Preference.OnPreferenceChangeListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e("OnCreate:", "Preference Fragment");
        LanguageLocale.getInstance().getResources().updateConfiguration(LanguageLocale.getInstance().getConfiguration(), LanguageLocale.getInstance().getResources().getDisplayMetrics());
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onResume() {
        LanguageLocale.getInstance().getResources().updateConfiguration(LanguageLocale.getInstance().getConfiguration(), LanguageLocale.getInstance().getResources().getDisplayMetrics());
        Log.e("OnResume:", "Preference Fragment");
        super.onResume();
    }

    @Override
    public void onDestroy() {
        Log.e("OnDestroy:", "Preference Fragment");
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
        super.onDestroy();
    }

    @Override
    public void onCreatePreferences(Bundle bundle, String s) {

        Log.e("OnCreatePreference:", "Preference Fragment");
        addPreferencesFromResource(R.xml.pref_include);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
        Preference preference = findPreference(s);
        Log.e("PF", "In OnSharedPreferenceChanged");
        if (null != preference) {
            if (preference instanceof ListPreference) {
                String selectedlang = null;
                Log.e("Key: ", preference.getKey());

                sharedPreferences = PreferenceManager.getDefaultSharedPreferences(Objects.requireNonNull(getContext()));
                LanguageLocale.getInstance().setContext(getContext());
                LanguageLocale.getInstance().setResources(Objects.requireNonNull(getActivity()).getResources());
                LanguageLocale.getInstance().setConfiguration(LanguageLocale.getInstance().getResources().getConfiguration());
                String value = sharedPreferences.getString(preference.getKey(), null);

                assert value != null;
                if (value.equals(getString(R.string.TEXT_LABEL_ENGLISH))) {
                    ((ListPreference) preference).setDefaultValue(getContext().getResources().getString(R.string.TEXT_LABEL_ENGLISH));
                    LanguageLocale.getInstance().setLocale(new Locale("en"));
                    Locale.setDefault(LanguageLocale.getInstance().getLocale());
                    LanguageLocale.getInstance().setConfiguration(new Configuration());
                    LanguageLocale.getInstance().getConfiguration().setLocale(LanguageLocale.getInstance().getLocale());
                    LanguageLocale.getInstance().getContext().getResources().updateConfiguration(LanguageLocale.getInstance().getConfiguration(), LanguageLocale.getInstance().getContext().getResources().getDisplayMetrics());
                } else if (value.equals(getString(R.string.TEXT_LABEL_RUSSIAN))) {
                    ((ListPreference) preference).setDefaultValue(getContext().getResources().getString(R.string.TEXT_LABEL_RUSSIAN));
                    LanguageLocale.getInstance().setLocale(new Locale("ru"));
                    Locale.setDefault(LanguageLocale.getInstance().getLocale());
                    LanguageLocale.getInstance().setConfiguration(new Configuration());
                    LanguageLocale.getInstance().getConfiguration().setLocale(LanguageLocale.getInstance().getLocale());
                    LanguageLocale.getInstance().getContext().getResources().updateConfiguration(LanguageLocale.getInstance().getConfiguration(), LanguageLocale.getInstance().getContext().getResources().getDisplayMetrics());
                }

                // Arabic Language setting added internalization
                else if (value.equals(getString(R.string.TEXT_LABEL_ARABIC))) {
                    ((ListPreference) preference).setDefaultValue(getContext().getResources().getString(R.string.TEXT_LABEL_ARABIC));
                    LanguageLocale.getInstance().setLocale(new Locale("ar"));
                    Locale.setDefault(LanguageLocale.getInstance().getLocale());
                    LanguageLocale.getInstance().setConfiguration(new Configuration());
                    LanguageLocale.getInstance().getConfiguration().setLocale(LanguageLocale.getInstance().getLocale());
                    LanguageLocale.getInstance().getContext().getResources().updateConfiguration(LanguageLocale.getInstance().getConfiguration(), LanguageLocale.getInstance().getContext().getResources().getDisplayMetrics());
                }
                preference.setSummary(value);
                getActivity().finish();
                setPreferenceSummary(preference, value);

            }

        }
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object o) {
        return true;
    }

    private void setPreferenceSummary(Preference preference, String value) {
        if (preference instanceof ListPreference) {
            ListPreference listPreference = (ListPreference) preference;
            listPreference.setSummary(value);
        }
    }

    @Override
    public void onDisplayPreferenceDialog(Preference preference) {
        try {
            if (preference.getKey().equalsIgnoreCase("password_dialog")) {
                startActivity(new Intent(getActivity(), ChangePassword.class));
            } else {
                super.onDisplayPreferenceDialog(preference);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    @Override
    public void onPause() {
        LanguageLocale.getInstance().getResources().updateConfiguration(LanguageLocale.getInstance().getConfiguration(), LanguageLocale.getInstance().getResources().getDisplayMetrics());
        Log.e("OnPause:", "Preference Fragment");
        super.onPause();
    }
}

Ниже приведено описание продукта и определение исходного набора в файле сборки

productFlavors {
        Flavor1 {

        }
        Flavor2 {}

    }
    sourceSets {
        main{
            java {
                srcDirs('src/Flavor1/java/src', 'src/Flavor2/java/src','src/main/java/src')
            }
            res {
                srcDirs('src/Flavor1/res/src', 'src/Flavor2/res/src','src/main/res/src')
            }
        }
        Syriatel {
            java {
                srcDirs('src/Flavor1/java/src', 'src/main/java/src')
            }
            res {
                srcDirs('src/Flavor1/res/src', 'src/main/res/src')
            }
        }
        FMFI {
            java {
                srcDirs('src/Flavor2/java/src', 'src/main/java/src')
            }
            res {
                srcDirs('src/Flavor2/res/src', 'src/main/res/src')
            }
        }

    }

Может кто-нибудь, пожалуйста, помогите мне, я не могу понять, что я делаю здесь неправильно. Любая помощь будет оценена. Заранее спасибо.

1 Ответ

0 голосов
/ 16 ноября 2018

Я использую этот класс, чтобы он работал:

object LocaleManager {

    val LANGUAGE_RUSSIAN = "ru"
    val LANGUAGE_UZBEK = "uz"
    val INITIALIZATED = "inited"
    private val LANGUAGE_KEY = "language_key"

    fun setLocale(c: Context): Context {
        return updateResources(c, getLanguage(c))
    }

    fun setNewLocale(c: Context, language: String): Context {
        initial(c)
        persistLanguage(c, language)
        return updateResources(c, language)
    }

    fun getLanguage(c: Context): String {
        val prefs = PreferenceManager.getDefaultSharedPreferences(c)
        return prefs.getString(LANGUAGE_KEY, LANGUAGE_RUSSIAN) ?: LANGUAGE_RUSSIAN
    }
    fun initial(c: Context){
        val prefs = PreferenceManager.getDefaultSharedPreferences(c)
        prefs.edit().putBoolean(INITIALIZATED,true).apply()
    }
    fun isInitialed(c: Context):Boolean{
        val prefs = PreferenceManager.getDefaultSharedPreferences(c)
        return prefs.getBoolean(INITIALIZATED,false)
    }
    fun restoreLang(c: Context){
        val prefs = PreferenceManager.getDefaultSharedPreferences(c)
        prefs.edit().putBoolean(INITIALIZATED,false).apply()
    }
    @SuppressLint("ApplySharedPref")
    private fun persistLanguage(c: Context, language: String) {
        val prefs = PreferenceManager.getDefaultSharedPreferences(c)
        prefs.edit().putString(LANGUAGE_KEY, language).commit()
    }

    private fun updateResources(context: Context, language: String): Context {
        var context = context
        val locale = Locale(language)
        Locale.setDefault(locale)

        val res = context.resources
        val config = Configuration(res.configuration)
        if (Build.VERSION.SDK_INT >= 17) {
            config.setLocale(locale)
            context = context.createConfigurationContext(config)
        } else {
            config.locale = locale
            res.updateConfiguration(config, res.displayMetrics)
        }
        return context
    }

    fun getLocale(res: Resources): Locale {
        val config = res.configuration
        return if (Build.VERSION.SDK_INT >= 24) config.locales.get(0) else config.locale
    }
}

А затем просто добавьте следующий метод в свой класс BaseActivity:

override fun attachBaseContext(base: Context) {
    super.attachBaseContext(LocaleManager.setLocale(base))
}
...