diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java index 7e34c93d..d1f6b4d7 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java @@ -20,6 +20,7 @@ package org.lsposed.manager.ui.fragment; import android.content.Context; +import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; import android.provider.Settings; @@ -137,6 +138,8 @@ public class SettingsFragment extends BaseFragment { @Override public void onCreatePreferencesFix(Bundle savedInstanceState, String rootKey) { + final String SYSTEM = "SYSTEM"; + addPreferencesFromResource(R.xml.prefs); boolean installed = ConfigManager.isBinderAlive(); @@ -240,7 +243,7 @@ public class SettingsFragment extends BaseFragment { SimpleMenuPreference language = findPreference("language"); if (language != null) { language.setOnPreferenceChangeListener((preference, newValue) -> { - var locale = "SYSTEM".equals(newValue) ? LocaleDelegate.getSystemLocale() : Locale.forLanguageTag((String) newValue); + var locale = SYSTEM.equals(newValue) ? LocaleDelegate.getSystemLocale() : Locale.forLanguageTag((String) newValue); LocaleDelegate.setDefaultLocale(locale); MainActivity activity = (MainActivity) getActivity(); if (activity != null) { @@ -251,19 +254,19 @@ public class SettingsFragment extends BaseFragment { var tag = language.getValue(); var userLocale = App.getLocale(); var entries = new ArrayList(); - for (int i = 0; i < language.getEntries().length; i++) { - if (i > 0) { - var locale = Locale.forLanguageTag(language.getEntries()[i].toString()); - entries.add(HtmlCompat.fromHtml(String.format("%s - %s", - !TextUtils.isEmpty(locale.getScript()) ? locale.getDisplayScript(locale) : locale.getDisplayName(locale), - !TextUtils.isEmpty(locale.getScript()) ? locale.getDisplayScript(userLocale) : locale.getDisplayName(userLocale) - ), HtmlCompat.FROM_HTML_MODE_LEGACY)); - } else { - entries.add(language.getEntries()[i]); - } + entries.add(language.getEntries()[0]); + var lstLang = getAppLanguages(getContext(), R.string.Settings); + for (var lang : lstLang) { + var locale = Locale.forLanguageTag(lang); + entries.add(HtmlCompat.fromHtml(String.format("%s - %s", + !TextUtils.isEmpty(locale.getScript()) ? locale.getDisplayScript(locale) : locale.getDisplayName(locale), + !TextUtils.isEmpty(locale.getScript()) ? locale.getDisplayScript(userLocale) : locale.getDisplayName(userLocale) + ), HtmlCompat.FROM_HTML_MODE_LEGACY)); } language.setEntries(entries.toArray(new CharSequence[0])); - if (TextUtils.isEmpty(tag) || "SYSTEM".equals(tag)) { + lstLang.add(0, SYSTEM); + language.setEntryValues(lstLang.toArray(new CharSequence[0])); + if (TextUtils.isEmpty(tag) || SYSTEM.equals(tag)) { language.setSummary(getString(rikka.material.R.string.follow_system)); } else { var locale = Locale.forLanguageTag(tag); @@ -303,6 +306,29 @@ public class SettingsFragment extends BaseFragment { }); return recyclerView; } + + private ArrayList getAppLanguages(Context ctx, int id) { + Configuration conf = ctx.getResources().getConfiguration(); + Locale originalLocale = conf.getLocales().get(0); + conf.setLocale(Locale.ENGLISH); + final String reference = ctx.createConfigurationContext(conf).getString(id); + + var lstLang = new ArrayList(); + lstLang.add(Locale.ENGLISH.getLanguage()); + + for (String loc : ctx.getAssets().getLocales()) { + if (loc.isEmpty()) { + continue; + } + Locale locale = Locale.forLanguageTag(loc); + conf.setLocale(locale); + if (!lstLang.contains(loc) && !reference.equals(ctx.createConfigurationContext(conf).getString(id))) { + lstLang.add(loc); + } + } + conf.setLocale(originalLocale); + return lstLang; + } } public void makeSnackBar(@StringRes int text, @Snackbar.Duration int duration) { diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 6a51b76b..70474066 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -34,65 +34,6 @@ @string/follow_system - af - ar - ca - cs - da - el - en - es - fi - fr - hu - it - iw - ja - ko - nl - no - pl - pt-BR - pt-PT - ro - ru - tr - uk - vi - zh-CN - zh-HK - zh-TW - - SYSTEM - af - ar - ca - cs - da - el - en - es - fi - fr - hu - it - iw - ja - ko - nl - no - pl - pt-BR - pt-PT - ro - ru - tr - uk - vi - zh-CN - zh-HK - zh-TW - diff --git a/app/src/main/res/xml-v29/prefs.xml b/app/src/main/res/xml-v29/prefs.xml index d61b1f80..e811a675 100644 --- a/app/src/main/res/xml-v29/prefs.xml +++ b/app/src/main/res/xml-v29/prefs.xml @@ -34,7 +34,6 @@