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) }, ) }