From 253800693c75b1749f24180dd6565b7d44dac561 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sun, 23 Nov 2025 20:07:13 +0100 Subject: [PATCH] Add language preference screen --- .../ui/launcher/widgets/clock/ClockWidget.kt | 4 +- .../launcher2/ui/settings/SettingsActivity.kt | 5 ++ .../ui/settings/icons/IconsSettingsScreen.kt | 2 +- .../settings/locale/LocaleSettingsScreen.kt | 61 +++++++++++++++++++ .../settings/locale/LocaleSettingsScreenVM.kt | 8 +++ .../ui/settings/main/MainSettingsScreen.kt | 9 +++ core/i18n/src/main/res/values/strings.xml | 7 ++- .../themes/typography/TypographyRepository.kt | 2 +- 8 files changed, 91 insertions(+), 7 deletions(-) create mode 100644 app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreen.kt create mode 100644 app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreenVM.kt diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidget.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidget.kt index 2792953b6..5f6eb403f 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidget.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidget.kt @@ -525,7 +525,7 @@ fun ConfigureClockWidgetSheet( summary = when (timeFormat) { TimeFormat.TwelveHour -> stringResource(R.string.preference_clock_widget_time_format_12h) TimeFormat.TwentyFourHour -> stringResource(R.string.preference_clock_widget_time_format_24h) - TimeFormat.System -> stringResource(R.string.preference_clock_widget_time_format_system) + TimeFormat.System -> stringResource(R.string.preference_value_system_default) }, icon = R.drawable.schedule_24px, onClick = { @@ -537,7 +537,7 @@ fun ConfigureClockWidgetSheet( onDismissRequest = { showDropdown = false }) { DropdownMenuItem( text = { - Text(stringResource(R.string.preference_clock_widget_time_format_system)) + Text(stringResource(R.string.preference_value_system_default)) }, onClick = { viewModel.setTimeFormat(TimeFormat.System) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt index e3a806467..c51964044 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt @@ -85,6 +85,8 @@ import de.mm20.launcher2.ui.settings.integrations.IntegrationsSettingsRoute import de.mm20.launcher2.ui.settings.integrations.IntegrationsSettingsScreen import de.mm20.launcher2.ui.settings.license.LicenseRoute import de.mm20.launcher2.ui.settings.license.LicenseScreen +import de.mm20.launcher2.ui.settings.locale.LocaleSettingsRoute +import de.mm20.launcher2.ui.settings.locale.LocaleSettingsScreen import de.mm20.launcher2.ui.settings.locations.LocationsSettingsRoute import de.mm20.launcher2.ui.settings.locations.LocationsSettingsScreen import de.mm20.launcher2.ui.settings.log.LogRoute @@ -276,6 +278,9 @@ class SettingsActivity : BaseActivity() { entry { DebugSettingsScreen() } + entry { + LocaleSettingsScreen() + } entry { BackupSettingsScreen() } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreen.kt index 06b3d4e95..6ccef031a 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreen.kt @@ -479,7 +479,7 @@ private fun getShapeName(shape: IconShape?): String? { IconShape.Squircle -> R.string.preference_icon_shape_squircle IconShape.Square -> R.string.preference_icon_shape_square IconShape.Pentagon -> R.string.preference_icon_shape_pentagon - IconShape.PlatformDefault -> R.string.preference_icon_shape_platform + IconShape.PlatformDefault -> R.string.preference_value_system_default IconShape.Circle -> R.string.preference_icon_shape_circle IconShape.Teardrop -> R.string.preference_icon_shape_teardrop IconShape.Pebble -> R.string.preference_icon_shape_pebble diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreen.kt new file mode 100644 index 000000000..87a2e00ac --- /dev/null +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreen.kt @@ -0,0 +1,61 @@ +package de.mm20.launcher2.ui.settings.locale + +import android.app.LocaleConfig +import android.content.Intent +import android.content.pm.PackageManager +import android.os.LocaleList +import androidx.activity.compose.LocalActivity +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.app.AppCompatDelegate +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalResources +import androidx.compose.ui.res.stringResource +import androidx.core.net.toUri +import androidx.core.os.LocaleListCompat +import androidx.navigation3.runtime.NavKey +import de.mm20.launcher2.ktx.isAtLeastApiLevel +import de.mm20.launcher2.ktx.tryStartActivity +import de.mm20.launcher2.ui.R +import de.mm20.launcher2.ui.component.preferences.ListPreference +import de.mm20.launcher2.ui.component.preferences.Preference +import de.mm20.launcher2.ui.component.preferences.PreferenceCategory +import de.mm20.launcher2.ui.component.preferences.PreferenceScreen +import kotlinx.serialization.Serializable +import java.util.Locale + +@Serializable +data object LocaleSettingsRoute: NavKey + +@Composable +fun LocaleSettingsScreen() { + val context = LocalContext.current + val resources = LocalResources.current + + val language = remember { + AppCompatDelegate.getApplicationLocales().get(0) + } + + + PreferenceScreen( + title = stringResource(R.string.preference_screen_locale) + ) { + item { + PreferenceCategory { + Preference( + title = stringResource(R.string.preference_language), + summary = if (language == null) stringResource(R.string.preference_value_system_default) else language.getDisplayName(language), + enabled = isAtLeastApiLevel(33), + onClick = { + context.tryStartActivity( + Intent(android.provider.Settings.ACTION_APP_LOCALE_SETTINGS).apply { + setData("package:${context.packageName}".toUri()) + } + ) + } + ) + } + } + } +} \ No newline at end of file diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreenVM.kt new file mode 100644 index 000000000..6a184ebcb --- /dev/null +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locale/LocaleSettingsScreenVM.kt @@ -0,0 +1,8 @@ +package de.mm20.launcher2.ui.settings.locale + +import androidx.lifecycle.ViewModel +import org.koin.core.component.KoinComponent + +class LocaleSettingsScreenVM: ViewModel(), KoinComponent { + +} \ No newline at end of file diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/main/MainSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/main/MainSettingsScreen.kt index 16e91c27d..a6108f737 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/main/MainSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/main/MainSettingsScreen.kt @@ -16,6 +16,7 @@ import de.mm20.launcher2.ui.settings.gestures.GesturesSettingsRoute import de.mm20.launcher2.ui.settings.homescreen.HomescreenSettingsRoute import de.mm20.launcher2.ui.settings.icons.IconsSettingsRoute import de.mm20.launcher2.ui.settings.integrations.IntegrationsSettingsRoute +import de.mm20.launcher2.ui.settings.locale.LocaleSettingsRoute import de.mm20.launcher2.ui.settings.plugins.PluginsSettingsRoute import de.mm20.launcher2.ui.settings.search.SearchSettingsRoute import kotlinx.serialization.Serializable @@ -87,6 +88,14 @@ fun MainSettingsScreen() { backStack.add(PluginsSettingsRoute) } ) + Preference( + icon = R.drawable.translate_24px, + title = stringResource(id = R.string.preference_screen_locale), + summary = stringResource(id = R.string.preference_screen_locale_summary), + onClick = { + backStack.add(LocaleSettingsRoute) + } + ) Preference( icon = R.drawable.settings_backup_restore_24px, title = stringResource(id = R.string.preference_screen_backup), diff --git a/core/i18n/src/main/res/values/strings.xml b/core/i18n/src/main/res/values/strings.xml index 5c1c48f55..fb2a1a193 100644 --- a/core/i18n/src/main/res/values/strings.xml +++ b/core/i18n/src/main/res/values/strings.xml @@ -445,7 +445,6 @@ Default Semi-transparent Font - System default About Version Links @@ -494,7 +493,6 @@ Rounded Cut Shape - System default Square Rounded square Squircle @@ -587,7 +585,6 @@ Time format 24-hour 12-hour - System default Use theme color Fill screen height Alignment @@ -1060,4 +1057,8 @@ Default headline font Device text font Generic + Language and region + Language, units, time format + Language + System default \ No newline at end of file diff --git a/data/themes/src/main/java/de/mm20/launcher2/themes/typography/TypographyRepository.kt b/data/themes/src/main/java/de/mm20/launcher2/themes/typography/TypographyRepository.kt index a723013e1..25b1a3de0 100644 --- a/data/themes/src/main/java/de/mm20/launcher2/themes/typography/TypographyRepository.kt +++ b/data/themes/src/main/java/de/mm20/launcher2/themes/typography/TypographyRepository.kt @@ -87,7 +87,7 @@ class TypographyRepository( get() = Typography( id = SystemFontId, builtIn = true, - name = context.getString(R.string.preference_font_system), + name = context.getString(R.string.preference_value_system_default), fonts = mapOf( "brand" to FontFamily.DeviceHeadline, "plain" to FontFamily.DeviceBody,