Skip to content

Commit 7e5789d

Browse files
authored
Resolve switching languages problem in settings fragment (#5560)
* SettingsFragment: add a method for creating locale * SettingsFragmentUnitTests: fix failing tests for createLocale
1 parent 751bc6c commit 7e5789d

File tree

2 files changed

+55
-6
lines changed

2 files changed

+55
-6
lines changed

app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java

+24-5
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
146146
appUiLanguageListPreference.setSummary(Locale.getDefault().getDisplayLanguage());
147147
} else {
148148
// If any language is selected by user previously, use it
149-
Locale defLocale = new Locale(languageCode);
149+
Locale defLocale = createLocale(languageCode);
150150
appUiLanguageListPreference.setSummary((defLocale).getDisplayLanguage(defLocale));
151151
}
152152
appUiLanguageListPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@@ -167,7 +167,7 @@ public boolean onPreferenceClick(Preference preference) {
167167
descriptionLanguageListPreference.setSummary(Locale.getDefault().getDisplayLanguage());
168168
} else {
169169
// If any language is selected by user previously, use it
170-
Locale defLocale = new Locale(languageCode);
170+
Locale defLocale = createLocale(languageCode);
171171
descriptionLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale));
172172
}
173173
descriptionLanguageListPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@@ -361,7 +361,7 @@ public void onItemClick(AdapterView<?> adapterView, View view, int i,
361361
}
362362
recentLanguagesDao.addRecentLanguage(new Language(languageName, languageCode));
363363
saveLanguageValue(languageCode, keyListPreference);
364-
Locale defLocale = new Locale(languageCode);
364+
Locale defLocale = createLocale(languageCode);
365365
if(keyListPreference.equals("appUiDefaultLanguagePref")) {
366366
appUiLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale));
367367
setLocale(requireActivity(), languageCode);
@@ -426,7 +426,7 @@ private void onRecentLanguageClicked(String keyListPreference, Dialog dialog, Ad
426426
recentLanguagesDao.addRecentLanguage(
427427
new Language(recentLanguageName, recentLanguageCode));
428428
saveLanguageValue(recentLanguageCode, keyListPreference);
429-
final Locale defLocale = new Locale(recentLanguageCode);
429+
final Locale defLocale = createLocale(recentLanguageCode);
430430
if (keyListPreference.equals("appUiDefaultLanguagePref")) {
431431
appUiLanguageListPreference.setSummary(defLocale.getDisplayLanguage(defLocale));
432432
setLocale(requireActivity(), recentLanguageCode);
@@ -455,7 +455,7 @@ public void setLocale(final Activity activity, String userSelectedValue) {
455455
if (userSelectedValue.equals("")) {
456456
userSelectedValue = Locale.getDefault().getLanguage();
457457
}
458-
final Locale locale = new Locale(userSelectedValue);
458+
final Locale locale = createLocale(userSelectedValue);
459459
Locale.setDefault(locale);
460460
final Configuration configuration = new Configuration();
461461
configuration.locale = locale;
@@ -467,6 +467,25 @@ public void setLocale(final Activity activity, String userSelectedValue) {
467467
editor.apply();
468468
}
469469

470+
/**
471+
* Create Locale based on different types of language codes
472+
* @param languageCode
473+
* @return Locale and throws error for invalid language codes
474+
*/
475+
public static Locale createLocale(String languageCode) {
476+
String[] parts = languageCode.split("-");
477+
switch (parts.length) {
478+
case 1:
479+
return new Locale(parts[0]);
480+
case 2:
481+
return new Locale(parts[0], parts[1]);
482+
case 3:
483+
return new Locale(parts[0], parts[1], parts[2]);
484+
default:
485+
throw new IllegalArgumentException("Invalid language code: " + languageCode);
486+
}
487+
}
488+
470489
/**
471490
* Save userselected language in List Preference
472491
* @param userSelectedValue

app/src/test/kotlin/fr/free/nrw/commons/settings/SettingsFragmentUnitTests.kt

+31-1
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ import fr.free.nrw.commons.TestCommonsApplication
1919
import fr.free.nrw.commons.recentlanguages.Language
2020
import fr.free.nrw.commons.recentlanguages.RecentLanguagesAdapter
2121
import fr.free.nrw.commons.recentlanguages.RecentLanguagesDao
22-
import fr.free.nrw.commons.upload.UploadMediaDetailAdapter
22+
import fr.free.nrw.commons.settings.SettingsFragment.createLocale
2323
import org.junit.Assert
24+
import org.junit.Assert.assertEquals
25+
import org.junit.Assert.assertNull
2426
import org.junit.Before
2527
import org.junit.Test
2628
import org.junit.runner.RunWith
@@ -34,6 +36,8 @@ import org.robolectric.Shadows
3436
import org.robolectric.annotation.Config
3537
import org.robolectric.annotation.LooperMode
3638
import java.lang.reflect.Method
39+
import java.util.Locale
40+
3741

3842
@RunWith(RobolectricTestRunner::class)
3943
@Config(sdk = [21], application = TestCommonsApplication::class)
@@ -255,4 +259,30 @@ class SettingsFragmentUnitTests {
255259
verify(recentLanguagesTextView, times(1)).visibility = View.VISIBLE
256260
}
257261

262+
@Test
263+
fun testCreateLocaleWithLanguageCode() {
264+
val locale: Locale = createLocale("en")
265+
266+
assertEquals("en", locale.language)
267+
assertEquals("",locale.country)
268+
assertEquals("",locale.variant)
269+
}
270+
271+
@Test
272+
fun testCreateLocaleWithLanguageAndCountryCode() {
273+
val locale: Locale = createLocale("zh-CN")
274+
275+
assertEquals("zh", locale.language)
276+
assertEquals("CN",locale.country)
277+
assertEquals("",locale.variant)
278+
}
279+
280+
@Test
281+
fun testCreateLocaleWithLanguageCountryAndVariantCode() {
282+
val locale: Locale = createLocale("pt-BR-variant")
283+
284+
assertEquals("pt", locale.language)
285+
assertEquals("BR",locale.country)
286+
assertEquals("variant",locale.variant)
287+
}
258288
}

0 commit comments

Comments
 (0)