diff --git a/app/src/main/java/org/lsposed/manager/App.java b/app/src/main/java/org/lsposed/manager/App.java index 35b5f4e4..c747ccc6 100644 --- a/app/src/main/java/org/lsposed/manager/App.java +++ b/app/src/main/java/org/lsposed/manager/App.java @@ -26,6 +26,7 @@ import android.content.SharedPreferences; import android.os.Build; import android.os.Process; import android.system.Os; +import android.text.TextUtils; import android.util.Log; import androidx.annotation.NonNull; @@ -57,6 +58,7 @@ import okhttp3.Request; import okhttp3.Response; import okhttp3.logging.HttpLoggingInterceptor; import rikka.material.app.DayNightDelegate; +import rikka.material.app.LocaleDelegate; public class App extends Application { @@ -130,6 +132,7 @@ public class App extends Application { } DayNightDelegate.setApplicationContext(this); DayNightDelegate.setDefaultNightMode(ThemeUtil.getDarkTheme()); + LocaleDelegate.setDefaultLocale(getLocale()); loadRemoteVersion(); RepoLoader.getInstance().loadRemoteData(); @@ -211,4 +214,12 @@ public class App extends Application { } return buildTime.atOffset(ZoneOffset.UTC).plusDays(30).toInstant().isBefore(now); } + + public static Locale getLocale() { + String tag = getPreferences().getString("language", null); + if (TextUtils.isEmpty(tag) || "SYSTEM".equals(tag)) { + return Locale.getDefault(); + } + return Locale.forLanguageTag(tag); + } } 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 8141de80..3751e725 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 @@ -23,6 +23,7 @@ import android.content.Context; import android.os.Build; import android.os.Bundle; import android.provider.Settings; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -33,6 +34,7 @@ import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; +import androidx.core.text.HtmlCompat; import androidx.preference.Preference; import androidx.preference.SwitchPreference; import androidx.recyclerview.widget.RecyclerView; @@ -49,10 +51,13 @@ import org.lsposed.manager.util.BackupUtils; import org.lsposed.manager.util.theme.ThemeUtil; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.Locale; import rikka.core.util.ResourceUtils; import rikka.material.app.DayNightDelegate; +import rikka.material.app.LocaleDelegate; +import rikka.preference.SimpleMenuPreference; import rikka.recyclerview.RecyclerViewKt; import rikka.widget.borderview.BorderRecyclerView; @@ -230,6 +235,40 @@ public class SettingsFragment extends BaseFragment { return true; }); } + + SimpleMenuPreference language = findPreference("language"); + if (language != null) { + language.setOnPreferenceChangeListener((preference, newValue) -> { + var locale = "SYSTEM".equals(newValue) ? LocaleDelegate.getSystemLocale() : Locale.forLanguageTag((String) newValue); + LocaleDelegate.setDefaultLocale(locale); + MainActivity activity = (MainActivity) getActivity(); + if (activity != null) { + activity.restart(); + } + return true; + }); + 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]); + } + } + language.setEntries(entries.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); + language.setSummary(!TextUtils.isEmpty(locale.getScript()) ? locale.getDisplayScript(userLocale) : locale.getDisplayName(userLocale)); + } + } } @Override diff --git a/app/src/main/res/values-en-rUS/strings.xml b/app/src/main/res/drawable/ic_baseline_translate_24.xml similarity index 53% rename from app/src/main/res/values-en-rUS/strings.xml rename to app/src/main/res/drawable/ic_baseline_translate_24.xml index 9831094d..4965aafa 100644 --- a/app/src/main/res/values-en-rUS/strings.xml +++ b/app/src/main/res/drawable/ic_baseline_translate_24.xml @@ -1,4 +1,3 @@ - - - - - - - - - - - - + + + + diff --git a/app/src/main/res/drawable/ic_round_assignment_24.xml b/app/src/main/res/drawable/ic_round_assignment_24.xml index 54fb9d76..9bdd9efa 100644 --- a/app/src/main/res/drawable/ic_round_assignment_24.xml +++ b/app/src/main/res/drawable/ic_round_assignment_24.xml @@ -6,6 +6,6 @@ android:tint="?attr/colorControlNormal" android:autoMirrored="true"> diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 0dc2f5d1..cdb425e6 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -30,6 +30,7 @@ 日志 设置 关于 + 报告问题 仓库 模块仓库(Beta) 加入我们的 %2$s 频道]]> @@ -165,6 +166,7 @@ 强制应用在启动器中显示图标 在 Android 10 之后,应用不被允许隐藏启动器图标。关闭本选项可禁用此系统功能。 系统 + 语言 自述文件 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 51899704..0766117f 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -31,4 +31,66 @@ MODE_NIGHT_YES MODE_NIGHT_FOLLOW_SYSTEM + + + @string/follow_system + af-ZA + ar-SA + ca-ES + cs-CZ + da-DK + el-GR + es-ES + fi-FI + fr-FR + hu-HU + it-IT + iw-IL + ja-JP + ko-KR + nl-NL + no-NO + pl-PL + pt-BR + pt-PT + ro-RO + ru-RU + tr-TR + uk-UA + vi-VN + zh-CN + zh-HK + zh-TW + + + + SYSTEM + af-ZA + ar-SA + ca-ES + cs-CZ + da-DK + el-GR + es-ES + fi-FI + fr-FR + hu-HU + it-IT + iw-IL + ja-JP + ko-KR + nl-NL + no-NO + pl-PL + pt-BR + pt-PT + ro-RO + ru-RU + tr-TR + uk-UA + vi-VN + zh-CN + zh-HK + zh-TW + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bf605dc6..6cd76c7f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -165,6 +165,7 @@ Force apps to show launcher icons After Android 10, apps are not allowed to hide their launcher icons. Turn off the toggle to disable this system feature. System + Language Readme diff --git a/app/src/main/res/xml/prefs.xml b/app/src/main/res/xml/prefs.xml index 729cedfd..3adf8159 100644 --- a/app/src/main/res/xml/prefs.xml +++ b/app/src/main/res/xml/prefs.xml @@ -30,6 +30,18 @@ android:title="@string/dns_over_http" /> + + + + +