[app] generate at runtime list of languages supported by app (#1146)

This commit is contained in:
etmatrix 2021-09-20 04:15:10 +02:00 committed by GitHub
parent f364e1cafd
commit d605a84f91
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 38 additions and 73 deletions

View File

@ -20,6 +20,7 @@
package org.lsposed.manager.ui.fragment; package org.lsposed.manager.ui.fragment;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
@ -137,6 +138,8 @@ public class SettingsFragment extends BaseFragment {
@Override @Override
public void onCreatePreferencesFix(Bundle savedInstanceState, String rootKey) { public void onCreatePreferencesFix(Bundle savedInstanceState, String rootKey) {
final String SYSTEM = "SYSTEM";
addPreferencesFromResource(R.xml.prefs); addPreferencesFromResource(R.xml.prefs);
boolean installed = ConfigManager.isBinderAlive(); boolean installed = ConfigManager.isBinderAlive();
@ -240,7 +243,7 @@ public class SettingsFragment extends BaseFragment {
SimpleMenuPreference language = findPreference("language"); SimpleMenuPreference language = findPreference("language");
if (language != null) { if (language != null) {
language.setOnPreferenceChangeListener((preference, newValue) -> { 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); LocaleDelegate.setDefaultLocale(locale);
MainActivity activity = (MainActivity) getActivity(); MainActivity activity = (MainActivity) getActivity();
if (activity != null) { if (activity != null) {
@ -251,19 +254,19 @@ public class SettingsFragment extends BaseFragment {
var tag = language.getValue(); var tag = language.getValue();
var userLocale = App.getLocale(); var userLocale = App.getLocale();
var entries = new ArrayList<CharSequence>(); var entries = new ArrayList<CharSequence>();
for (int i = 0; i < language.getEntries().length; i++) { entries.add(language.getEntries()[0]);
if (i > 0) { var lstLang = getAppLanguages(getContext(), R.string.Settings);
var locale = Locale.forLanguageTag(language.getEntries()[i].toString()); for (var lang : lstLang) {
entries.add(HtmlCompat.fromHtml(String.format("%s - %s", var locale = Locale.forLanguageTag(lang);
!TextUtils.isEmpty(locale.getScript()) ? locale.getDisplayScript(locale) : locale.getDisplayName(locale), entries.add(HtmlCompat.fromHtml(String.format("%s - %s",
!TextUtils.isEmpty(locale.getScript()) ? locale.getDisplayScript(userLocale) : locale.getDisplayName(userLocale) !TextUtils.isEmpty(locale.getScript()) ? locale.getDisplayScript(locale) : locale.getDisplayName(locale),
), HtmlCompat.FROM_HTML_MODE_LEGACY)); !TextUtils.isEmpty(locale.getScript()) ? locale.getDisplayScript(userLocale) : locale.getDisplayName(userLocale)
} else { ), HtmlCompat.FROM_HTML_MODE_LEGACY));
entries.add(language.getEntries()[i]);
}
} }
language.setEntries(entries.toArray(new CharSequence[0])); 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)); language.setSummary(getString(rikka.material.R.string.follow_system));
} else { } else {
var locale = Locale.forLanguageTag(tag); var locale = Locale.forLanguageTag(tag);
@ -303,6 +306,29 @@ public class SettingsFragment extends BaseFragment {
}); });
return recyclerView; return recyclerView;
} }
private ArrayList<String> 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<String>();
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) { public void makeSnackBar(@StringRes int text, @Snackbar.Duration int duration) {

View File

@ -34,65 +34,6 @@
<string-array name="language" translatable="false"> <string-array name="language" translatable="false">
<item>@string/follow_system</item> <item>@string/follow_system</item>
<item>af</item>
<item>ar</item>
<item>ca</item>
<item>cs</item>
<item>da</item>
<item>el</item>
<item>en</item>
<item>es</item>
<item>fi</item>
<item>fr</item>
<item>hu</item>
<item>it</item>
<item>iw</item>
<item>ja</item>
<item>ko</item>
<item>nl</item>
<item>no</item>
<item>pl</item>
<item>pt-BR</item>
<item>pt-PT</item>
<item>ro</item>
<item>ru</item>
<item>tr</item>
<item>uk</item>
<item>vi</item>
<item>zh-CN</item>
<item>zh-HK</item>
<item>zh-TW</item>
</string-array> </string-array>
<string-array name="language_value" translatable="false">
<item>SYSTEM</item>
<item>af</item>
<item>ar</item>
<item>ca</item>
<item>cs</item>
<item>da</item>
<item>el</item>
<item>en</item>
<item>es</item>
<item>fi</item>
<item>fr</item>
<item>hu</item>
<item>it</item>
<item>iw</item>
<item>ja</item>
<item>ko</item>
<item>nl</item>
<item>no</item>
<item>pl</item>
<item>pt-BR</item>
<item>pt-PT</item>
<item>ro</item>
<item>ru</item>
<item>tr</item>
<item>uk</item>
<item>vi</item>
<item>zh-CN</item>
<item>zh-HK</item>
<item>zh-TW</item>
</string-array>
</resources> </resources>

View File

@ -34,7 +34,6 @@
<rikka.preference.SimpleMenuPreference <rikka.preference.SimpleMenuPreference
android:defaultValue="SYSTEM" android:defaultValue="SYSTEM"
android:entries="@array/language" android:entries="@array/language"
android:entryValues="@array/language_value"
android:icon="@drawable/ic_baseline_translate_24" android:icon="@drawable/ic_baseline_translate_24"
android:summary="%s" android:summary="%s"
android:key="language" android:key="language"

View File

@ -35,7 +35,6 @@
<rikka.preference.SimpleMenuPreference <rikka.preference.SimpleMenuPreference
android:defaultValue="SYSTEM" android:defaultValue="SYSTEM"
android:entries="@array/language" android:entries="@array/language"
android:entryValues="@array/language_value"
android:icon="@drawable/ic_baseline_translate_24" android:icon="@drawable/ic_baseline_translate_24"
android:summary="%s" android:summary="%s"
android:key="language" android:key="language"