Fix app language out of sync with system settings (#1221)
* Fix app language out of sync with system settings * Manually update current language Recomposition may not happen when current language is the same as system default.
This commit is contained in:
1 parent
e63bd49a4c
commit
00b1be879d
6 files changed
+57
-59
No files matched your search
@@ -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
|
||||
|
||||
@@ -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 <T, R : Settings.Delegate<T>> R.observed(func: (Unit) -> Unit) = apply { col
|
||||
fun <T, R : Settings.Delegate<T>> R.emitTo(flow: MutableSharedFlow<Unit>) = apply { collectScope.launch { flowGetter().collect { flow.emit(Unit) } } }
|
||||
fun <T, R : PrefDelegate<T>> R.emitTo(flow: MutableSharedFlow<Unit>) = 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 {
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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<String, String> {
|
||||
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)
|
||||
}
|
||||
@@ -177,38 +177,6 @@
|
||||
<item>@string/filter_comment</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="app_language_entries">
|
||||
<item>@string/app_language_system</item>
|
||||
<item>@string/app_language_de</item>
|
||||
<item>@string/app_language_en</item>
|
||||
<item>@string/app_language_es</item>
|
||||
<item>@string/app_language_fr</item>
|
||||
<item>@string/app_language_ja</item>
|
||||
<item>@string/app_language_ko</item>
|
||||
<item>@string/app_language_tr</item>
|
||||
<item>@string/app_language_th</item>
|
||||
<item>@string/app_language_zh_cn</item>
|
||||
<item>@string/app_language_zh_hk</item>
|
||||
<item>@string/app_language_zh_tw</item>
|
||||
<item>@string/app_language_nb_no</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="app_language_entry_values">
|
||||
<item>system</item>
|
||||
<item>de</item>
|
||||
<item>en</item>
|
||||
<item>es</item>
|
||||
<item>fr</item>
|
||||
<item>ja</item>
|
||||
<item>ko</item>
|
||||
<item>tr</item>
|
||||
<item>th</item>
|
||||
<item>zh-CN</item>
|
||||
<item>zh-HK</item>
|
||||
<item>zh-TW</item>
|
||||
<item>nb-NO</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="tag_translation_metadata" tools:ignore="InconsistentArrays">
|
||||
<item>tag-translations-zh-rCN.json.sha1</item>
|
||||
<item>https://raw.githubusercontent.com/Ehviewer-Overhauled/EhTagTranslation/tag-translations/tag-translations/tag-translations-zh-rCN.json.sha1</item>
|
||||
|
||||
@@ -432,18 +432,6 @@
|
||||
<string name="license">License</string>
|
||||
<string name="cant_read_the_file">Can\'t read the file</string>
|
||||
<string name="app_language_system">System Language (Default)</string>
|
||||
<string name="app_language_de" translatable="false">Deutsch</string>
|
||||
<string name="app_language_en" translatable="false">English</string>
|
||||
<string name="app_language_es" translatable="false">Español</string>
|
||||
<string name="app_language_fr" translatable="false">Français</string>
|
||||
<string name="app_language_ja" translatable="false">日本語</string>
|
||||
<string name="app_language_ko" translatable="false">한국어</string>
|
||||
<string name="app_language_tr" translatable="false">Turkish</string>
|
||||
<string name="app_language_th" translatable="false">ไทย</string>
|
||||
<string name="app_language_zh_cn" translatable="false">中文(大陆)</string>
|
||||
<string name="app_language_zh_hk" translatable="false">中文(香港)</string>
|
||||
<string name="app_language_zh_tw" translatable="false">中文(臺灣)</string>
|
||||
<string name="app_language_nb_no" translatable="false">Norwegian Bokmål</string>
|
||||
<!-- ExcludedLanguagesScene -->
|
||||
<string name="please_wait">Please wait</string>
|
||||
<!-- License -->
|
||||
|
||||
Reference in new issue
Block a user