Skip to content

Commit 6d2f712

Browse files
committed
Fix language switching not working - Use AppCompatDelegate.setApplicationLocales() for proper locale handling - Add locales_config.xml for Android 13+ per-app language support - Remove manual restart dialog, activity recreates automatically - Read current language from AppCompatDelegate instead of prefs
1 parent f673e37 commit 6d2f712

File tree

3 files changed

+24
-24
lines changed

3 files changed

+24
-24
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
android:supportsRtl="true"
1919
android:theme="@style/Theme.AppControlX"
2020
android:fullBackupContent="@xml/backup_rules"
21-
android:dataExtractionRules="@xml/data_extraction_rules">
21+
android:dataExtractionRules="@xml/data_extraction_rules"
22+
android:localeConfig="@xml/locales_config">
2223

2324
<!-- Setup Activity (Launcher) -->
2425
<activity

app/src/main/java/com/appcontrolx/ui/SettingsFragment.kt

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import android.view.View
77
import android.view.ViewGroup
88
import android.widget.Toast
99
import androidx.appcompat.app.AppCompatDelegate
10+
import androidx.core.os.LocaleListCompat
1011
import androidx.fragment.app.Fragment
1112
import androidx.lifecycle.lifecycleScope
1213
import 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() {
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
3+
<locale android:name="en" />
4+
<locale android:name="id" />
5+
</locale-config>

0 commit comments

Comments
 (0)