@@ -7,6 +7,7 @@ import android.view.View
77import android.view.ViewGroup
88import android.widget.Toast
99import androidx.appcompat.app.AppCompatDelegate
10+ import androidx.core.os.LocaleListCompat
1011import androidx.fragment.app.Fragment
1112import androidx.lifecycle.lifecycleScope
1213import androidx.preference.PreferenceManager
@@ -100,16 +101,16 @@ class SettingsFragment : Fragment() {
100101 )
101102 val languageCodes = arrayOf(" system" , " en" , " id" )
102103
103- val currentLang = prefs.getString(Constants .PREFS_LANGUAGE , " system" ) ? : " system"
104+ // Get current from AppCompatDelegate
105+ val currentLocales = AppCompatDelegate .getApplicationLocales()
106+ val currentLang = if (currentLocales.isEmpty) " system" else currentLocales.toLanguageTags().split(" -" )[0 ]
104107 val currentIndex = languageCodes.indexOf(currentLang).coerceAtLeast(0 )
105108
106109 MaterialAlertDialogBuilder (requireContext())
107110 .setTitle(R .string.settings_language)
108111 .setSingleChoiceItems(languages, currentIndex) { dialog, which ->
109112 val selectedLang = languageCodes[which]
110- prefs.edit().putString(Constants .PREFS_LANGUAGE , selectedLang).apply ()
111113 applyLanguage(selectedLang)
112- updateLanguageText()
113114 dialog.dismiss()
114115 }
115116 .setNegativeButton(android.R .string.cancel, null )
@@ -118,33 +119,26 @@ class SettingsFragment : Fragment() {
118119 }
119120
120121 private fun updateLanguageText () {
121- val currentLang = prefs.getString(Constants .PREFS_LANGUAGE , " system" ) ? : " system"
122- binding.tvCurrentLanguage.text = when (currentLang) {
123- " en" -> getString(R .string.language_english)
124- " id" -> getString(R .string.language_indonesian)
122+ val currentLocales = AppCompatDelegate .getApplicationLocales()
123+ val langTag = if (currentLocales.isEmpty) " system" else currentLocales.toLanguageTags()
124+
125+ binding.tvCurrentLanguage.text = when {
126+ langTag.startsWith(" en" ) -> getString(R .string.language_english)
127+ langTag.startsWith(" id" ) -> getString(R .string.language_indonesian)
125128 else -> getString(R .string.language_system)
126129 }
127130 }
128131
129132 private fun applyLanguage (langCode : String ) {
130- val locale = when (langCode) {
131- " en" -> java.util.Locale .ENGLISH
132- " id" -> java.util.Locale (" id" , " ID" )
133- else -> java.util.Locale .getDefault()
133+ // Use AppCompatDelegate for proper locale handling (Android 13+ compatible)
134+ val localeList = when (langCode) {
135+ " en" -> LocaleListCompat .forLanguageTags(" en" )
136+ " id" -> LocaleListCompat .forLanguageTags(" id" )
137+ else -> LocaleListCompat .getEmptyLocaleList() // System default
134138 }
135139
136- val config = resources.configuration
137- config.setLocale(locale)
138-
139- // Restart activity to apply
140- MaterialAlertDialogBuilder (requireContext())
141- .setTitle(R .string.settings_language)
142- .setMessage(R .string.settings_restart_required)
143- .setPositiveButton(R .string.settings_restart_now) { _, _ ->
144- restartApp()
145- }
146- .setNegativeButton(R .string.settings_restart_later, null )
147- .show()
140+ AppCompatDelegate .setApplicationLocales(localeList)
141+ // Activity will recreate automatically, no need for manual restart
148142 }
149143
150144 private fun setupCurrentMode () {
0 commit comments