diff --git a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt index e8c73d887..806efd50b 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt @@ -168,7 +168,6 @@ object Settings : DataStorePreferences(null) { var recentToplist by stringPref("recent_toplist", "11") var userAgent by stringPref("user_agent", CHROME_USER_AGENT) var defaultDownloadLabel by stringOrNullPref("default_download_label", null) - var language by stringPref("app_language", "system").observed { updateWhenLocaleChanges() } var lastUpdateTime by longPref("last_update_time", 0) // Tachiyomi Reader diff --git a/app/src/main/kotlin/com/hippo/ehviewer/SettingsCollector.kt b/app/src/main/kotlin/com/hippo/ehviewer/SettingsCollector.kt index 63f18f4c1..cba6d4a22 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/SettingsCollector.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/SettingsCollector.kt @@ -2,7 +2,6 @@ package com.hippo.ehviewer import android.app.UiModeManager import androidx.appcompat.app.AppCompatDelegate -import androidx.core.os.LocaleListCompat import com.hippo.ehviewer.client.EhCookieStore import com.hippo.ehviewer.client.EhEngine import com.hippo.ehviewer.client.EhTagDatabase @@ -27,15 +26,6 @@ fun > R.observed(func: (Unit) -> Unit) = apply { col fun > R.emitTo(flow: MutableSharedFlow) = apply { collectScope.launch { flowGetter().collect { flow.emit(Unit) } } } fun > R.emitTo(flow: MutableSharedFlow) = apply { collectScope.launch { changesFlow().collect { flow.emit(Unit) } } } -fun updateWhenLocaleChanges() { - val newValue = Settings.language - if ("system" == newValue) { - AppCompatDelegate.setApplicationLocales(LocaleListCompat.getEmptyLocaleList()) - } else { - AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(newValue)) - } -} - fun updateWhenKeepMediaStatusChanges() { collectScope.launchIO { runCatching { diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt index 15793a1ae..9a821a5bf 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt @@ -22,6 +22,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue @@ -43,7 +44,11 @@ import com.hippo.ehviewer.ui.tools.observed import com.hippo.ehviewer.util.AppConfig import com.hippo.ehviewer.util.Crash import com.hippo.ehviewer.util.ReadableTime +import com.hippo.ehviewer.util.getAppLanguage +import com.hippo.ehviewer.util.getLanguages +import com.hippo.ehviewer.util.setAppLanguage import com.hippo.unifile.asUniFile +import com.jamal.composeprefs3.ui.prefs.DropDownPref import com.jamal.composeprefs3.ui.prefs.SwitchPref import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootGraph @@ -135,11 +140,17 @@ fun AdvancedScreen(navigator: DestinationsNavigator) { entryValueRes = R.array.read_cache_size_entry_values, value = Settings::readCacheSize.observed, ) - SimpleMenuPreference( + var currentLanguage by remember { mutableStateOf(getAppLanguage()) } + val languages = remember { context.getLanguages() } + DropDownPref( title = stringResource(id = R.string.settings_advanced_app_language_title), - entry = R.array.app_language_entries, - entryValueRes = R.array.app_language_entry_values, - value = Settings::language, + defaultValue = currentLanguage, + onValueChange = { + setAppLanguage(it) + currentLanguage = it + }, + useSelectedAsSummary = true, + entries = languages, ) SwitchPreference( title = stringResource(id = R.string.preload_thumb_aggressively), diff --git a/app/src/main/kotlin/com/hippo/ehviewer/util/LanguageUtils.kt b/app/src/main/kotlin/com/hippo/ehviewer/util/LanguageUtils.kt new file mode 100644 index 000000000..662a59cd2 --- /dev/null +++ b/app/src/main/kotlin/com/hippo/ehviewer/util/LanguageUtils.kt @@ -0,0 +1,42 @@ +package com.hippo.ehviewer.util + +import android.content.Context +import androidx.appcompat.app.AppCompatDelegate +import androidx.core.os.LocaleListCompat +import com.hippo.ehviewer.R +import org.xmlpull.v1.XmlPullParser + +fun Context.getLanguages(): Map { + val languages = mutableMapOf("system" to getString(R.string.app_language_system)) + resources.getXml(R.xml._generated_res_locale_config).use { parser -> + var event = parser.eventType + while (event != XmlPullParser.END_DOCUMENT) { + if (event == XmlPullParser.START_TAG && parser.name == "locale") { + val tag = parser.getAttributeValue(0).removeSuffix("-US") + LocaleListCompat.forLanguageTags(tag)[0]?.let { locale -> + languages[tag] = locale.getDisplayName(locale).replaceFirstChar { it.uppercase(locale) } + } + } + event = parser.next() + } + } + return languages +} + +fun getAppLanguage(): String { + val locale = AppCompatDelegate.getApplicationLocales()[0] + return when (val language = locale?.language) { + null -> "system" + "zh", "nb" -> "$language-${locale.country}" + else -> language + } +} + +fun setAppLanguage(language: String) { + val locales = if (language == "system") { + LocaleListCompat.getEmptyLocaleList() + } else { + LocaleListCompat.forLanguageTags(language) + } + AppCompatDelegate.setApplicationLocales(locales) +} diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 09ecae1ba..9a517aaac 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -177,38 +177,6 @@ @string/filter_comment - - @string/app_language_system - @string/app_language_de - @string/app_language_en - @string/app_language_es - @string/app_language_fr - @string/app_language_ja - @string/app_language_ko - @string/app_language_tr - @string/app_language_th - @string/app_language_zh_cn - @string/app_language_zh_hk - @string/app_language_zh_tw - @string/app_language_nb_no - - - - system - de - en - es - fr - ja - ko - tr - th - zh-CN - zh-HK - zh-TW - nb-NO - - tag-translations-zh-rCN.json.sha1 https://raw.githubusercontent.com/Ehviewer-Overhauled/EhTagTranslation/tag-translations/tag-translations/tag-translations-zh-rCN.json.sha1 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8ca751b7f..222f7bb2c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -432,18 +432,6 @@ License Can\'t read the file System Language (Default) - Deutsch - English - Español - Français - 日本語 - 한국어 - Turkish - ไทย - 中文(大陆) - 中文(香港) - 中文(臺灣) - Norwegian Bokmål Please wait