Resolve switching languages problem in settings fragment (#5560)

* SettingsFragment: add a method for creating locale

* SettingsFragmentUnitTests: fix failing tests for createLocale
This commit is contained in:
Rohit Verma 2024-03-22 19:42:45 +05:30 committed by GitHub
parent 751bc6ce6b
commit 7e5789d539
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 55 additions and 6 deletions

View file

@ -146,7 +146,7 @@ public class SettingsFragment extends PreferenceFragmentCompat {
appUiLanguageListPreference.setSummary(Locale.getDefault().getDisplayLanguage()); appUiLanguageListPreference.setSummary(Locale.getDefault().getDisplayLanguage());
} else { } else {
// If any language is selected by user previously, use it // If any language is selected by user previously, use it
Locale defLocale = new Locale(languageCode); Locale defLocale = createLocale(languageCode);
appUiLanguageListPreference.setSummary((defLocale).getDisplayLanguage(defLocale)); appUiLanguageListPreference.setSummary((defLocale).getDisplayLanguage(defLocale));
} }
appUiLanguageListPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { appUiLanguageListPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@ -167,7 +167,7 @@ public class SettingsFragment extends PreferenceFragmentCompat {
descriptionLanguageListPreference.setSummary(Locale.getDefault().getDisplayLanguage()); descriptionLanguageListPreference.setSummary(Locale.getDefault().getDisplayLanguage());
} else { } else {
// If any language is selected by user previously, use it // If any language is selected by user previously, use it
Locale defLocale = new Locale(languageCode); Locale defLocale = createLocale(languageCode);
descriptionLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale)); descriptionLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale));
} }
descriptionLanguageListPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { descriptionLanguageListPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@ -361,7 +361,7 @@ public class SettingsFragment extends PreferenceFragmentCompat {
} }
recentLanguagesDao.addRecentLanguage(new Language(languageName, languageCode)); recentLanguagesDao.addRecentLanguage(new Language(languageName, languageCode));
saveLanguageValue(languageCode, keyListPreference); saveLanguageValue(languageCode, keyListPreference);
Locale defLocale = new Locale(languageCode); Locale defLocale = createLocale(languageCode);
if(keyListPreference.equals("appUiDefaultLanguagePref")) { if(keyListPreference.equals("appUiDefaultLanguagePref")) {
appUiLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale)); appUiLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale));
setLocale(requireActivity(), languageCode); setLocale(requireActivity(), languageCode);
@ -426,7 +426,7 @@ public class SettingsFragment extends PreferenceFragmentCompat {
recentLanguagesDao.addRecentLanguage( recentLanguagesDao.addRecentLanguage(
new Language(recentLanguageName, recentLanguageCode)); new Language(recentLanguageName, recentLanguageCode));
saveLanguageValue(recentLanguageCode, keyListPreference); saveLanguageValue(recentLanguageCode, keyListPreference);
final Locale defLocale = new Locale(recentLanguageCode); final Locale defLocale = createLocale(recentLanguageCode);
if (keyListPreference.equals("appUiDefaultLanguagePref")) { if (keyListPreference.equals("appUiDefaultLanguagePref")) {
appUiLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale)); appUiLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale));
setLocale(requireActivity(), recentLanguageCode); setLocale(requireActivity(), recentLanguageCode);
@ -455,7 +455,7 @@ public class SettingsFragment extends PreferenceFragmentCompat {
if (userSelectedValue.equals("")) { if (userSelectedValue.equals("")) {
userSelectedValue = Locale.getDefault().getLanguage(); userSelectedValue = Locale.getDefault().getLanguage();
} }
final Locale locale = new Locale(userSelectedValue); final Locale locale = createLocale(userSelectedValue);
Locale.setDefault(locale); Locale.setDefault(locale);
final Configuration configuration = new Configuration(); final Configuration configuration = new Configuration();
configuration.locale = locale; configuration.locale = locale;
@ -467,6 +467,25 @@ public class SettingsFragment extends PreferenceFragmentCompat {
editor.apply(); editor.apply();
} }
/**
* Create Locale based on different types of language codes
* @param languageCode
* @return Locale and throws error for invalid language codes
*/
public static Locale createLocale(String languageCode) {
String[] parts = languageCode.split("-");
switch (parts.length) {
case 1:
return new Locale(parts[0]);
case 2:
return new Locale(parts[0], parts[1]);
case 3:
return new Locale(parts[0], parts[1], parts[2]);
default:
throw new IllegalArgumentException("Invalid language code: " + languageCode);
}
}
/** /**
* Save userselected language in List Preference * Save userselected language in List Preference
* @param userSelectedValue * @param userSelectedValue

View file

@ -19,8 +19,10 @@ import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.recentlanguages.Language import fr.free.nrw.commons.recentlanguages.Language
import fr.free.nrw.commons.recentlanguages.RecentLanguagesAdapter import fr.free.nrw.commons.recentlanguages.RecentLanguagesAdapter
import fr.free.nrw.commons.recentlanguages.RecentLanguagesDao import fr.free.nrw.commons.recentlanguages.RecentLanguagesDao
import fr.free.nrw.commons.upload.UploadMediaDetailAdapter import fr.free.nrw.commons.settings.SettingsFragment.createLocale
import org.junit.Assert import org.junit.Assert
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
@ -34,6 +36,8 @@ import org.robolectric.Shadows
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
import org.robolectric.annotation.LooperMode import org.robolectric.annotation.LooperMode
import java.lang.reflect.Method import java.lang.reflect.Method
import java.util.Locale
@RunWith(RobolectricTestRunner::class) @RunWith(RobolectricTestRunner::class)
@Config(sdk = [21], application = TestCommonsApplication::class) @Config(sdk = [21], application = TestCommonsApplication::class)
@ -255,4 +259,30 @@ class SettingsFragmentUnitTests {
verify(recentLanguagesTextView, times(1)).visibility = View.VISIBLE verify(recentLanguagesTextView, times(1)).visibility = View.VISIBLE
} }
@Test
fun testCreateLocaleWithLanguageCode() {
val locale: Locale = createLocale("en")
assertEquals("en", locale.language)
assertEquals("",locale.country)
assertEquals("",locale.variant)
}
@Test
fun testCreateLocaleWithLanguageAndCountryCode() {
val locale: Locale = createLocale("zh-CN")
assertEquals("zh", locale.language)
assertEquals("CN",locale.country)
assertEquals("",locale.variant)
}
@Test
fun testCreateLocaleWithLanguageCountryAndVariantCode() {
val locale: Locale = createLocale("pt-BR-variant")
assertEquals("pt", locale.language)
assertEquals("BR",locale.country)
assertEquals("variant",locale.variant)
}
} }