From e5dbbe60ab49c79ae68ae470ed1ffcf7f6fd85e7 Mon Sep 17 00:00:00 2001 From: nesquikm Date: Wed, 28 Jan 2026 11:59:31 +0400 Subject: [PATCH 1/2] Fix Android per-app language reading with LocaleManager --- .../localizationsettings/LocalizationSettingsModule.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/android/src/main/java/com/localizationsettings/LocalizationSettingsModule.kt b/android/src/main/java/com/localizationsettings/LocalizationSettingsModule.kt index 67fffcf..b4468ea 100644 --- a/android/src/main/java/com/localizationsettings/LocalizationSettingsModule.kt +++ b/android/src/main/java/com/localizationsettings/LocalizationSettingsModule.kt @@ -1,5 +1,6 @@ package com.localizationsettings +import android.app.LocaleManager import android.content.Context import android.content.SharedPreferences import android.os.Build @@ -41,9 +42,12 @@ class LocalizationSettingsModule internal constructor(context: ReactApplicationC private fun getCurrentLanguage(): String? { // If API version is >= 33, then use per-app language settings if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - val currentLocaleName = if (!AppCompatDelegate.getApplicationLocales().isEmpty) { - // get per-app language - AppCompatDelegate.getApplicationLocales()[0]?.toLanguageTag() + // Use LocaleManager directly to read per-app language set in Android Settings + val localeManager = reactApplicationContext.getSystemService(LocaleManager::class.java) + val appLocales = localeManager?.applicationLocales + val currentLocaleName = if (appLocales != null && !appLocales.isEmpty) { + // get per-app language from system LocaleManager + appLocales[0]?.toLanguageTag() } else { // Fallback to the default System Locale Locale.getDefault().toLanguageTag() From 8b84aa3aefe53f67d4554bb2facfdb0c81405852 Mon Sep 17 00:00:00 2001 From: nesquikm Date: Wed, 28 Jan 2026 12:57:04 +0400 Subject: [PATCH 2/2] Use LocaleManager directly for Android 13+ per-app language - Use LocaleManager.applicationLocales for both GET and SET operations - This ensures language changes sync properly with Android Settings - Fixes issue where AppCompatDelegate didn't update system settings --- .../LocalizationSettingsModule.kt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/com/localizationsettings/LocalizationSettingsModule.kt b/android/src/main/java/com/localizationsettings/LocalizationSettingsModule.kt index b4468ea..fc90792 100644 --- a/android/src/main/java/com/localizationsettings/LocalizationSettingsModule.kt +++ b/android/src/main/java/com/localizationsettings/LocalizationSettingsModule.kt @@ -4,6 +4,7 @@ import android.app.LocaleManager import android.content.Context import android.content.SharedPreferences import android.os.Build +import android.os.LocaleList import androidx.appcompat.app.AppCompatDelegate import androidx.core.os.LocaleListCompat import com.facebook.react.bridge.Promise @@ -45,14 +46,11 @@ class LocalizationSettingsModule internal constructor(context: ReactApplicationC // Use LocaleManager directly to read per-app language set in Android Settings val localeManager = reactApplicationContext.getSystemService(LocaleManager::class.java) val appLocales = localeManager?.applicationLocales - val currentLocaleName = if (appLocales != null && !appLocales.isEmpty) { - // get per-app language from system LocaleManager + return if (appLocales != null && !appLocales.isEmpty) { appLocales[0]?.toLanguageTag() } else { - // Fallback to the default System Locale Locale.getDefault().toLanguageTag() } - return currentLocaleName } // if API is < 33, then use SharedPreferences with fallback to default System Locale if (getPreferences().getString("languageFrom", null) == Locale.getDefault().language) { @@ -72,8 +70,11 @@ class LocalizationSettingsModule internal constructor(context: ReactApplicationC private fun setCurrentLanguage(language: String) { // If API version is >= 33, then use per-app language settings if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - val localeList = LocaleListCompat.forLanguageTags(getLanguageTag(language)) - AppCompatDelegate.setApplicationLocales(localeList) + // Use LocaleManager directly to ensure sync with Android Settings + val localeManager = reactApplicationContext.getSystemService(LocaleManager::class.java) + val languageTag = getLanguageTag(language) + val localeList = LocaleList.forLanguageTags(languageTag) + localeManager?.applicationLocales = localeList } else { // if API is < 33, then set SharedPreferences language val editor = getEditor();