@@ -37,8 +37,8 @@ public static void saveSystemLocale() {
3737 }
3838
3939 @ NonNull
40- public static String getSystemLocale () {
41- return mSystemLocale . toLanguageTag () ;
40+ public static Locale getSystemLocale () {
41+ return mSystemLocale ;
4242 }
4343
4444 @ NonNull
@@ -60,6 +60,14 @@ private static HashMap<String, Language> getAllLanguages() {
6060 mLanguagesCache .put (languageId , locale );
6161 }
6262
63+ Locale locale = Locale .forLanguageTag (getDeviceLocale ().toLanguageTag ());
64+ String languageId = locale .toLanguageTag ();
65+ if (!mLanguagesCache .containsKey (languageId )) {
66+ String displayName = locale .getDisplayName ().substring (0 , 1 ).toUpperCase () + locale .getDisplayName ().substring (1 );
67+ Language language = new Language (languageId , displayName + " [" + languageId + "]" );
68+ mLanguagesCache .put (languageId , language );
69+ }
70+
6371 return mLanguagesCache ;
6472 }
6573
@@ -75,7 +83,11 @@ public static void resetLanguages() {
7583 }
7684
7785 public static Language getDeviceLanguage () {
78- return mLanguagesCache .get (Resources .getSystem ().getConfiguration ().getLocales ().get (0 ).toLanguageTag ());
86+ return mLanguagesCache .get (getDeviceLocale ().toLanguageTag ());
87+ }
88+
89+ public static Locale getDeviceLocale () {
90+ return Resources .getSystem ().getConfiguration ().getLocales ().get (0 );
7991 }
8092
8193 public static List <String > getLocalesFromLanguages (@ NonNull final List <Language > languages ) {
@@ -97,15 +109,21 @@ public static List<Language> getPreferredLanguages(@NonNull Context aContext) {
97109 List <Language > preferredLanguages = new ArrayList <>();
98110 if (savedLanguages != null ) {
99111 for (String language : savedLanguages ) {
100- Language lang = languages .get (language );
112+ Language lang = languages .get (getClosestAvailableLocale (language ));
113+ if (lang != null ) {
114+ lang .setPreferred (true );
115+ preferredLanguages .add (lang );
116+ }
117+ }
118+
119+ }
120+
121+ if (savedLanguages == null || savedLanguages .isEmpty ()) {
122+ Language lang = languages .get (getClosestAvailableLocale (getDeviceLocale ().toLanguageTag ()));
123+ if (lang != null ) {
101124 lang .setPreferred (true );
102125 preferredLanguages .add (lang );
103126 }
104-
105- } else {
106- Language currentLanguage = getDeviceLanguage ();
107- currentLanguage .setPreferred (true );
108- preferredLanguages .add (currentLanguage );
109127 }
110128
111129 return preferredLanguages ;
@@ -118,24 +136,64 @@ public static List<Language> getAvailableLanguages() {
118136 .collect (Collectors .toList ());
119137 }
120138
139+ @ NonNull
140+ public static String getClosestAvailableLocale (@ NonNull String languageTag ) {
141+ List <Locale > locales = Stream .of (Locale .getAvailableLocales ()).collect (Collectors .toList ());
142+ Locale inputLocale = Locale .forLanguageTag (languageTag );
143+ Optional <Locale > outputLocale = locales .stream ().filter (item ->
144+ item .equals (inputLocale )
145+ ).findFirst ();
146+
147+ if (!outputLocale .isPresent ()) {
148+ outputLocale = locales .stream ().filter (item ->
149+ item .getLanguage ().equals (inputLocale .getLanguage ()) &&
150+ item .getScript ().equals (inputLocale .getScript ()) &&
151+ item .getCountry ().equals (inputLocale .getCountry ())
152+ ).findFirst ();
153+ }
154+ if (!outputLocale .isPresent ()) {
155+ outputLocale = locales .stream ().filter (item ->
156+ item .getLanguage ().equals (inputLocale .getLanguage ()) &&
157+ item .getCountry ().equals (inputLocale .getCountry ())
158+ ).findFirst ();
159+ }
160+ if (!outputLocale .isPresent ()) {
161+ outputLocale = locales .stream ().filter (item ->
162+ item .getLanguage ().equals (inputLocale .getLanguage ())
163+ ).findFirst ();
164+ }
165+
166+ if (outputLocale .isPresent ()) {
167+ return outputLocale .get ().toLanguageTag ();
168+ }
169+
170+ return getDeviceLocale ().toLanguageTag ();
171+ }
172+
121173 @ NonNull
122174 public static String getVoiceSearchLocale (@ NonNull Context aContext ) {
123- return SettingsStore .getInstance (aContext ).getVoiceSearchLocale ();
175+ String locale = SettingsStore .getInstance (aContext ).getVoiceSearchLocale ();
176+ if (locale == null ) {
177+ locale = LocaleUtils .getDefaultSupportedLocale (aContext );
178+ }
179+ return locale ;
124180 }
125181
126182 public static void setVoiceSearchLocale (@ NonNull Context context , @ NonNull String locale ) {
127183 SettingsStore .getInstance (context ).setVoiceSearchLocale (locale );
128184 }
129185
130186 @ NonNull
131- public static String getVoiceSearchLanguage (@ NonNull Context aContext ) {
132- String language = LocaleUtils .getVoiceSearchLocale (aContext );
133- return getAllLanguages ().get (language ).getName ();
187+ public static Language getVoiceSearchLanguage (@ NonNull Context aContext ) {
188+ return mLanguagesCache .get (getClosestAvailableLocale (getVoiceSearchLocale (aContext )));
134189 }
135190
136191 @ NonNull
137192 public static String getDisplayLocale (Context context ) {
138193 String locale = SettingsStore .getInstance (context ).getDisplayLocale ();
194+ if (locale == null ) {
195+ locale = LocaleUtils .getDefaultSupportedLocale (context );
196+ }
139197 return mapOldLocaleToNew ((locale ));
140198 }
141199
@@ -144,12 +202,16 @@ public static void setDisplayLocale(@NonNull Context context, @NonNull String lo
144202 }
145203
146204 @ NonNull
147- public static String getDisplayLanguage () {
148- return getAllLanguages () .get (getCurrentLocale ()). getName ( );
205+ public static Language getDisplayLanguage (@ NonNull Context aContext ) {
206+ return mLanguagesCache .get (getClosestAvailableLocale ( getDisplayLocale ( aContext )) );
149207 }
150208
151209 public static Context setLocale (@ NonNull Context context ) {
152- return updateResources (context , SettingsStore .getInstance (context ).getDisplayLocale ());
210+ String locale = SettingsStore .getInstance (context ).getDisplayLocale ();
211+ if (locale == null ) {
212+ locale = LocaleUtils .getDefaultSupportedLocale (context );
213+ }
214+ return updateResources (context , locale );
153215 }
154216
155217 private static Context updateResources (@ NonNull Context context , @ NonNull String language ) {
@@ -256,14 +318,8 @@ public static String getSupportedLocaleForIndex(int index) {
256318 return localizedSupportedLanguages .get (index ).locale .toLanguageTag ();
257319 }
258320
259- public static String getDefaultSupportedLocale () {
260- String locale = getCurrentLocale ();
261- List <String > supportedLocales = getSupportedLocales ();
262- if (!supportedLocales .contains (locale )) {
263- return supportedLocales .get (0 );
264- }
265-
266- return locale ;
321+ public static String getDefaultSupportedLocale (@ NonNull Context context ) {
322+ return getClosestSupportedLocale (context , getDeviceLocale ().toLanguageTag ());
267323 }
268324
269325 public static String getClosestSupportedLocale (@ NonNull Context context , @ NonNull String languageTag ) {
@@ -295,7 +351,8 @@ public static String getClosestSupportedLocale(@NonNull Context context, @NonNul
295351 return language .get ().locale .toLanguageTag ();
296352
297353 } else {
298- return getDisplayLocale (context );
354+ // If there is no closest supported locale we fallback to en-US
355+ return "en-US" ;
299356 }
300357 }
301358
0 commit comments