language selection isn’t properly working in my apk.
couldn’t figure out why it happended or how to fix this issue
i did debug,, while this code(setLanguage
) calls setLocale
and sets the value that user selected, setLocale
is being called again and overwritten by previous language. It gets called from LanguageHelper
‘s this code
else {
val lang = getPersistedData(context, Locale.getDefault().language)
lang?.let { setLocale(context, lang) }
it passes en
thro setLocale
wasted around 15 hours to solve this issue.. tried differenct metholds… still couldn’t
let me know if you need anything else
This is the code inside fragment
class SettingsFragment : BaseFragment() {
////..........................
private fun changeLanguageClicked() {
MaterialAlertDialogBuilder(requireContext()).setTitle(getString(R.string.choose_language))
.setSingleChoiceItems(
resources.getStringArray(R.array.languages),
getSelectedLanguageIndex(),
) { dialog, selectedLanguageIndex ->
val selectedLanguageValue =
resources.getStringArray(R.array.languages_value)[selectedLanguageIndex]
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())
sharedPreferences.edit()
.putString(getString(R.string.selected_language_key), selectedLanguageValue)
.apply()
setLanguage(selectedLanguageValue)
dialog.dismiss()
}.show()
}
private fun getSelectedLanguageIndex(): Int {
val selectedLanguageValue: String? =
prefsHelper.getString(getString(R.string.selected_language_key), null)
Log.d("papk", "$selectedLanguageValue")
val languageValuesArray = resources.getStringArray(R.array.languages_value)
return languageValuesArray.indexOf(selectedLanguageValue)
}
private fun setLanguage(languageCode: String) {
val isSystemLanguage =
(languageCode == resources.getStringArray(R.array.languages_value)[0])
prefsHelper.putBoolean(
getString(R.string.default_system_language), isSystemLanguage
)
if (!isSystemLanguage) {
LanguageHelper.setLocale(requireContext(), languageCode)
} else {
if (!resources.getStringArray(R.array.languages_value)
.contains(Locale.getDefault().language)
) {
LanguageHelper.setLocale(requireContext(), "en")
} else {
LanguageHelper.setLocale(requireContext(), Locale.getDefault().language)
}
}
val intent = Intent(requireActivity(), requireActivity().javaClass)
intent.putExtra(Constants.HAS_SETTINGS_CHANGED, true)
startActivity(intent)
requireActivity().finish()
}
}
////.......................................
This is the code inside the LanguageHelperClass
object LanguageHelper {
// https://gunhansancar.com/change-language-programmatically-in-android/
fun onAttach(context: Context): Context? {
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
return if (preferences.getBoolean(context.getString(R.string.default_system_language), true)) {
if(!context.resources.getStringArray(R.array.languages_value).contains(Locale.getDefault().language)){
setLocale(context, "en")
}else{
setLocale(context, Locale.getDefault().language)
}
} else {
val lang = getPersistedData(context, Locale.getDefault().language)
lang?.let { setLocale(context, lang) }
}
}
fun setLocale(context: Context?, language: String): Context? {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
updateResources(context!!, language)
} else {
updateResourcesLegacy(context, language)
}
}
@TargetApi(Build.VERSION_CODES.N)
private fun updateResources(context: Context, language: String): Context {
val locale = Locale(language)
Locale.setDefault(locale)
val configuration = context.resources.configuration
configuration.setLocale(locale)
configuration.setLayoutDirection(locale)
return context.createConfigurationContext(configuration)
}
////................................
<string name="selected_language_key">en</string>
<string name="default_system_language" translatable="false">default_system_language</string>
<string-array name="languages" translatable="false">
<item>System Language</item>
<item>English</item>
<item>हिंदी</item>
<item>عربى</item>
<item>اُردُو</item>
<item>বাঙালি</item>
<item>Español</item>
<item>français</item>
<item>bahasa Indonesia</item>
<item>ភាសាខ្មែរ</item>
<item>ಕನ್ನಡ</item>
<item>తెలుగు</item>
<item>မြန်မာ</item>
<item>Polski</item>
<item>Português</item>
<item>русский</item>
<item>Kiswahili</item>
<item>فارسی</item>
</string-array>
<string-array name="languages_value" translatable="false">
<item>System_Language</item>
<item>en</item>
<item>hi</item>
<item>ar</item>
<item>ur</item>
<item>bn</item>
<item>es</item>
<item>fr</item>
<item>in</item>
<item>km</item>
<item>kn</item>
<item>te</item>
<item>my</item>
<item>pl</item>
<item>pt</item>
<item>ru</item>
<item>sw</item>
<item>fa</item>
</string-array>