diff --git a/ui/src/main/composeResources/values-en-rGB/strings.xml b/ui/src/main/composeResources/values-en-rGB/strings.xml
index 20f3713..b1a2c18 100644
--- a/ui/src/main/composeResources/values-en-rGB/strings.xml
+++ b/ui/src/main/composeResources/values-en-rGB/strings.xml
@@ -26,6 +26,7 @@
This device has less than 8 GB of memory. Server List Explorer is expected to use at least 300 MB while idle in the system tray.
Low memory warning
Couldn't update startup preference. Please try again.
+ Couldn't update language. Please try again.
Start-up
When my computer starts
Choose how Server List Explorer starts when your computer starts.
diff --git a/ui/src/main/composeResources/values/strings.xml b/ui/src/main/composeResources/values/strings.xml
index b67e14a..b7a01f8 100644
--- a/ui/src/main/composeResources/values/strings.xml
+++ b/ui/src/main/composeResources/values/strings.xml
@@ -26,6 +26,7 @@
This device has less than 8 GB of memory. Server List Explorer is expected to use at least 300 MB while idle in the system tray.
Low memory warning
Couldn't update startup preference. Please try again.
+ Couldn't update language. Please try again.
Startup
When my computer starts
Choose how Server List Explorer starts when your computer starts.
diff --git a/ui/src/main/kotlin/com/spoiligaming/explorer/ui/screens/setup/SetupScreen.kt b/ui/src/main/kotlin/com/spoiligaming/explorer/ui/screens/setup/SetupScreen.kt
index f0465c0..3fa816a 100644
--- a/ui/src/main/kotlin/com/spoiligaming/explorer/ui/screens/setup/SetupScreen.kt
+++ b/ui/src/main/kotlin/com/spoiligaming/explorer/ui/screens/setup/SetupScreen.kt
@@ -82,6 +82,7 @@ import server_list_explorer.ui.generated.resources.Res
import server_list_explorer.ui.generated.resources.button_back
import server_list_explorer.ui.generated.resources.button_finish
import server_list_explorer.ui.generated.resources.button_next
+import server_list_explorer.ui.generated.resources.setup_locale_save_failed
import server_list_explorer.ui.generated.resources.setup_wizard_finish_failed
import server_list_explorer.ui.generated.resources.setup_wizard_step_counter
import java.nio.file.Path
@@ -171,6 +172,7 @@ internal fun SetupWizard(
val scope = rememberCoroutineScope()
val activeServerListFilePath by ServerListFileBookmarksManager.activePath.collectAsState()
val setupWizardFinishFailedMessage = t(Res.string.setup_wizard_finish_failed)
+ val setupLocaleSaveFailedMessage = t(Res.string.setup_locale_save_failed)
val supportsStartupRegistration =
(OSUtils.isWindows || OSUtils.isDebian) && !OSUtils.isRunningOnBareJvm && !AppStoragePaths.isPortableInstall
@@ -198,15 +200,44 @@ internal fun SetupWizard(
}
}
+ suspend fun persistLocaleSetting(locale: Locale) =
+ persistSettingsUpdate(
+ manager = preferenceSettingsManager,
+ context = "locale setting",
+ update = { it.copy(locale = locale) },
+ isPersisted = { it.locale == locale },
+ )
+
+ fun applyLocaleSelection(locale: Locale) {
+ if (state.locale == locale) {
+ return
+ }
+
+ state.locale = locale
+ scope.launch {
+ runCatching {
+ persistLocaleSetting(locale)
+ }.onFailure { e ->
+ logger.error(e) {
+ "Failed to apply setup wizard locale selection immediately. locale=$locale"
+ }
+ if (state.locale == locale) {
+ state.locale = preferenceSettingsManager.settingsFlow.value.locale
+ SnackbarController.sendEvent(
+ SnackbarEvent(
+ message = setupLocaleSaveFailedMessage,
+ duration = SnackbarDuration.Short,
+ ),
+ )
+ }
+ }
+ }
+ }
+
suspend fun persistSetupState() =
runCatching {
if (prefs.locale != state.locale) {
- persistSettingsUpdate(
- manager = preferenceSettingsManager,
- context = "locale setting",
- update = { it.copy(locale = state.locale) },
- isPersisted = { it.locale == state.locale },
- )
+ persistLocaleSetting(state.locale)
}
if (sp.savesDirectory != state.worldSavesPath) {
@@ -293,7 +324,11 @@ internal fun SetupWizard(
},
) { targetStep ->
when (targetStep) {
- SetupStep.LANGUAGE_SELECTION -> LanguageSelectionStep(state = state)
+ SetupStep.LANGUAGE_SELECTION ->
+ LanguageSelectionStep(
+ state = state,
+ onLocaleSelected = ::applyLocaleSelection,
+ )
SetupStep.STARTUP_CONFIGURATION -> StartupStep(state = state)
SetupStep.PATH_CONFIGURATION -> PathStep(state = state)
}
diff --git a/ui/src/main/kotlin/com/spoiligaming/explorer/ui/screens/setup/steps/LanguageSelectionStep.kt b/ui/src/main/kotlin/com/spoiligaming/explorer/ui/screens/setup/steps/LanguageSelectionStep.kt
index 2df16ed..c69a43d 100644
--- a/ui/src/main/kotlin/com/spoiligaming/explorer/ui/screens/setup/steps/LanguageSelectionStep.kt
+++ b/ui/src/main/kotlin/com/spoiligaming/explorer/ui/screens/setup/steps/LanguageSelectionStep.kt
@@ -34,9 +34,13 @@ import com.spoiligaming.explorer.ui.widgets.LanguagePickerDropdownMenu
import server_list_explorer.ui.generated.resources.Res
import server_list_explorer.ui.generated.resources.preferred_language_label
import server_list_explorer.ui.generated.resources.setup_step_title_localization
+import java.util.Locale
@Composable
-internal fun LanguageSelectionStep(state: SetupUiState) {
+internal fun LanguageSelectionStep(
+ state: SetupUiState,
+ onLocaleSelected: (Locale) -> Unit,
+) {
SetupStepContainer(title = t(Res.string.setup_step_title_localization)) {
Column(
verticalArrangement = Arrangement.spacedBy(LanguageStepItemSpacing),
@@ -49,7 +53,7 @@ internal fun LanguageSelectionStep(state: SetupUiState) {
LanguagePickerDropdownMenu(
selectedLocale = state.locale,
onLocaleSelected = { locale ->
- state.locale = locale
+ onLocaleSelected(locale)
},
)
}