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:
FooIbar authored and GitHub committed 2024-05-19 10:43:24 +00:00
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)
}
-32
View File
@@ -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>
-12
View File
@@ -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 -->