diff --git a/app/src/main/java/io/github/fate_grand_automata/ui/main/MainScreen.kt b/app/src/main/java/io/github/fate_grand_automata/ui/main/MainScreen.kt index dc579e3de..44a638ada 100644 --- a/app/src/main/java/io/github/fate_grand_automata/ui/main/MainScreen.kt +++ b/app/src/main/java/io/github/fate_grand_automata/ui/main/MainScreen.kt @@ -36,7 +36,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringArrayResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel @@ -58,7 +57,6 @@ import io.github.fate_grand_automata.ui.prefs.LanguagePref import io.github.fate_grand_automata.ui.prefs.ListPreference import io.github.fate_grand_automata.ui.prefs.Preference import io.github.fate_grand_automata.util.OpenDocTreePersistable -import java.util.Locale @Composable @OptIn(ExperimentalPermissionsApi::class) @@ -275,8 +273,7 @@ private fun MainScreenContent( LanguagePref().ListPreference( title = stringResource(R.string.p_app_language), icon = icon(Icons.Default.Language), - entries = stringArrayResource(id = R.array.available_languages) - .associateWith { Locale.forLanguageTag(it).displayName } + entries = LanguagePref.availableLanguages() ) Divider() diff --git a/app/src/main/java/io/github/fate_grand_automata/ui/onboarding/OnboardingItems.kt b/app/src/main/java/io/github/fate_grand_automata/ui/onboarding/OnboardingItems.kt index ac814645d..151c7d859 100644 --- a/app/src/main/java/io/github/fate_grand_automata/ui/onboarding/OnboardingItems.kt +++ b/app/src/main/java/io/github/fate_grand_automata/ui/onboarding/OnboardingItems.kt @@ -23,7 +23,6 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringArrayResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.os.LocaleListCompat @@ -31,6 +30,7 @@ import io.github.fate_grand_automata.BuildConfig import io.github.fate_grand_automata.R import io.github.fate_grand_automata.ui.Heading import io.github.fate_grand_automata.ui.openLinkIntent +import io.github.fate_grand_automata.ui.prefs.LanguagePref import io.github.fate_grand_automata.util.OpenDocTreePersistable import io.github.fate_grand_automata.util.SupportImageExtractor import kotlinx.coroutines.Dispatchers @@ -72,8 +72,8 @@ class PickLanguage(vm: OnboardingViewModel) : OnboardingItem(vm, true) { @Composable fun LocaleDropdownMenu() { - val locales = stringArrayResource(R.array.available_languages) - .map { Locale.forLanguageTag(it) } + val locales = LanguagePref.availableLanguages() + .mapKeys { Locale.forLanguageTag(it.key) } // boilerplate: https://developer.android.com/reference/kotlin/androidx/compose/material/package-summary#ExposedDropdownMenuBox(kotlin.Boolean,kotlin.Function1,androidx.compose.ui.Modifier,kotlin.Function1) var expanded by remember { mutableStateOf(false) } @@ -84,15 +84,18 @@ fun LocaleDropdownMenu() { } ) { val selectedLocales = AppCompatDelegate.getApplicationLocales() - val locale: Locale = if (!selectedLocales.isEmpty) { - selectedLocales.get(0)!! + val locale: String = if (!selectedLocales.isEmpty) { + locales[selectedLocales.get(0)!!]!! } else { - val defaultLocale = Locale.getDefault() - if (locales.contains(defaultLocale)) defaultLocale else locales[0] + val currentLocale = Locale.getDefault() + locales.filterKeys { + // set correct default if system language matches one of the offered languages + it.language == currentLocale.language && (it.country.isEmpty() || it.country == currentLocale.country) + }.values.firstOrNull() ?: locales.values.first() } TextField( readOnly = true, - value = locale.displayName, + value = locale, onValueChange = { }, trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon( @@ -114,11 +117,11 @@ fun LocaleDropdownMenu() { // set app locale given the user's selected locale AppCompatDelegate.setApplicationLocales( LocaleListCompat.forLanguageTags( - selectionLocale.toLanguageTag() + selectionLocale.key.toLanguageTag() ) ) }, - text = { Text(selectionLocale.displayName) } + text = { Text(selectionLocale.value) } ) } } diff --git a/app/src/main/java/io/github/fate_grand_automata/ui/prefs/LanguagePref.kt b/app/src/main/java/io/github/fate_grand_automata/ui/prefs/LanguagePref.kt index 9c8306d54..d26f87441 100644 --- a/app/src/main/java/io/github/fate_grand_automata/ui/prefs/LanguagePref.kt +++ b/app/src/main/java/io/github/fate_grand_automata/ui/prefs/LanguagePref.kt @@ -1,15 +1,32 @@ package io.github.fate_grand_automata.ui.prefs import androidx.appcompat.app.AppCompatDelegate +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource import androidx.core.os.LocaleListCompat +import io.github.fate_grand_automata.R import io.github.fate_grand_automata.prefs.core.Pref import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.FlowCollector -import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.MutableStateFlow import kotlin.reflect.KProperty class LanguagePref : Pref { - override val defaultValue: String = get() + companion object { + @Composable + fun availableLanguages() = mapOf( + "en" to stringResource(R.string.language_en), + "ja" to stringResource(R.string.language_ja), + "zh-CN" to stringResource(R.string.language_zhCN), + "zh-TW" to stringResource(R.string.language_zhTW), + "ko" to stringResource(R.string.language_ko), + "vi" to stringResource(R.string.language_vi) + ) + } + + private val locale = MutableStateFlow(get()) + + override val defaultValue: String = "en" override val key: String = "language" override fun resetToDefault() { @@ -25,9 +42,7 @@ class LanguagePref : Pref { } override fun asFlow(): Flow { - return flow { - get() - } + return locale } override fun asSyncCollector(throwOnFailure: Boolean): FlowCollector { @@ -63,6 +78,7 @@ class LanguagePref : Pref { AppCompatDelegate.setApplicationLocales( LocaleListCompat.forLanguageTags(value) ) + locale.value = value } override fun setValue(thisRef: Any, property: KProperty<*>, value: String) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 276f7d6d8..9ffe4760d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,12 +17,10 @@ https://dontkillmyapp.com/ https://ko-fi.com/fategrandautomata - - en - ja - zh-CN - zh-TW - ko - vi - + English + 日本語 + 中文(中国) + 中文(台湾) + 한국어 + Tiếng Việt