Skip to content

Commit

Permalink
Show languages in their native translations
Browse files Browse the repository at this point in the history
  • Loading branch information
reconman committed Dec 16, 2023
1 parent 479a086 commit 7595426
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,14 @@ 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
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
Expand Down Expand Up @@ -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) }
Expand All @@ -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(
Expand All @@ -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) }
)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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<String> {
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() {
Expand All @@ -25,9 +42,7 @@ class LanguagePref : Pref<String> {
}

override fun asFlow(): Flow<String> {
return flow {
get()
}
return locale
}

override fun asSyncCollector(throwOnFailure: Boolean): FlowCollector<String> {
Expand Down Expand Up @@ -63,6 +78,7 @@ class LanguagePref : Pref<String> {
AppCompatDelegate.setApplicationLocales(
LocaleListCompat.forLanguageTags(value)
)
locale.value = value
}

override fun setValue(thisRef: Any, property: KProperty<*>, value: String) {
Expand Down
14 changes: 6 additions & 8 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,10 @@
<string name="link_dontkillmyapp" translatable="false">https://dontkillmyapp.com/</string>
<string name="link_donate" translatable="false">https://ko-fi.com/fategrandautomata</string>

<string-array name="available_languages">
<item>en</item>
<item>ja</item>
<item>zh-CN</item>
<item>zh-TW</item>
<item>ko</item>
<item>vi</item>
</string-array>
<string name="language_en" translatable="false">English</string>
<string name="language_ja" translatable="false">日本語</string>
<string name="language_zhCN" translatable="false">中文(中国)</string>
<string name="language_zhTW" translatable="false">中文(台湾)</string>
<string name="language_ko" translatable="false">한국어</string>
<string name="language_vi" translatable="false">Tiếng Việt</string>
</resources>

0 comments on commit 7595426

Please sign in to comment.