Improve language handling and Compose startup

This commit is contained in:
Syer10
2021-08-20 22:50:25 -04:00
parent a44dfa56cb
commit d3a1e5594d
3 changed files with 23 additions and 29 deletions

View File

@@ -6,28 +6,12 @@
package ca.gosyer.data.translation package ca.gosyer.data.translation
import ca.gosyer.data.ui.UiPreferences
import java.util.Locale import java.util.Locale
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Provider import javax.inject.Provider
class ResourceProvider @Inject constructor( class ResourceProvider @Inject constructor() : Provider<XmlResourceBundle> {
private val uiPreferences: UiPreferences
) : Provider<XmlResourceBundle> {
override fun get(): XmlResourceBundle { override fun get(): XmlResourceBundle {
val languagePref = uiPreferences.language() return XmlResourceBundle.forLocale(Locale.getDefault())
return if (languagePref.isSet()) {
languagePref.get().let {
if (it.isBlank()) {
getDefault()
} else {
val locale: Locale = Locale.forLanguageTag(it)
Locale.setDefault(locale)
XmlResourceBundle.forLocale(locale)
}
}
} else getDefault()
} }
private fun getDefault() = XmlResourceBundle.forLocale(Locale.getDefault())
} }

View File

@@ -78,20 +78,14 @@ class XmlResourceBundle internal constructor(internal val lookup: ConcurrentHash
val rootBundle = classLoader.getResourceAsStream("values/values/strings.xml")!! val rootBundle = classLoader.getResourceAsStream("values/values/strings.xml")!!
.use { XmlResourceBundle(it) } .use { XmlResourceBundle(it) }
val languageBundle = classLoader.getResourceAsStream("values/values-${locale.language}/strings.xml") val languageBundle = classLoader.getResourceAsStream("values/values-${locale.toLanguageTag()}/strings.xml")
?.use { XmlResourceBundle(it) } ?.use { XmlResourceBundle(it) }
val languageTagBundle = classLoader.getResourceAsStream("values/values-${locale.toLanguageTag()}/strings.xml") return if (languageBundle != null) {
?.use { XmlResourceBundle(it) } rootBundle + languageBundle
} else {
var resultBundle = rootBundle rootBundle
if (languageBundle != null) {
resultBundle += languageBundle
} }
if (languageTagBundle != null) {
resultBundle += languageTagBundle
}
return resultBundle
} }
} }
} }

View File

@@ -13,6 +13,7 @@ import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.configureSwingGlobalsForCompose
import androidx.compose.ui.input.key.Key import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.key import androidx.compose.ui.input.key.key
import androidx.compose.ui.window.Window import androidx.compose.ui.window.Window
@@ -49,6 +50,7 @@ import toothpick.configuration.Configuration
import toothpick.ktp.KTP import toothpick.ktp.KTP
import toothpick.ktp.extension.getInstance import toothpick.ktp.extension.getInstance
import java.io.File import java.io.File
import java.util.Locale
import kotlin.system.exitProcess import kotlin.system.exitProcess
@OptIn(DelicateCoroutinesApi::class) @OptIn(DelicateCoroutinesApi::class)
@@ -74,8 +76,22 @@ suspend fun main() {
val serverService = scope.getInstance<ServerService>() val serverService = scope.getInstance<ServerService>()
val uiPreferences = scope.getInstance<UiPreferences>() val uiPreferences = scope.getInstance<UiPreferences>()
// Call setDefault before getting a resource bundle
val language = uiPreferences.language().get()
if (language.isNotBlank()) {
val locale: Locale? = Locale.forLanguageTag(language)
if (locale != null) {
Locale.setDefault(locale)
}
}
val resources = scope.getInstance<XmlResourceBundle>() val resources = scope.getInstance<XmlResourceBundle>()
// Set the Compose constants before any
// Swing functions are called
configureSwingGlobalsForCompose()
uiPreferences.themeMode() uiPreferences.themeMode()
.getAsFlow { .getAsFlow {
if (!uiPreferences.windowDecorations().get()) { if (!uiPreferences.windowDecorations().get()) {