Мое приложение имеет функцию изменения языка приложения на английский, арабский или русский. Это приложение имеет разные вкусы продукта, т.е. 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')
}
}
}
Может кто-нибудь, пожалуйста, помогите мне, я не могу понять, что я делаю здесь неправильно. Любая помощь будет оценена. Заранее спасибо.