Get short weekdays names for Portuguese language in Android

Viewed 37

I need to return the short version of the weekdays names using getShortWeekdays() in Android. I tested with different device language settings. Although it seems to be working with various language settings, unfortunately when the selected language is Portuguese (Portugal), it returns the full day names. Any advice?

DateFormatSymbols symbols = new DateFormatSymbols(Locale.getDefault());
String[] dayNames = symbols.getShortWeekdays();

Output if language is English (United States):

["", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]

Output if language is Portuguese (Brasil):

["", "dom.", "seg.", "ter.", "qua.", "qui.", "sex.", "sáb."]

Output if language is Portuguese (Portugal):

["", "domingo", "segunda", "terça", "quarta", "quinta", "sexta", "sábado"]

enter image description here

1 Answers

At first, I wondered if using a different package for the method's class would produce different results, but it didn't.


final java.util.Locale pt_BR = new java.util.Locale("pt", "BR");
android.icu.text.DateFormatSymbols symbolsPtBr1 = new android.icu.text.DateFormatSymbols(pt_BR);
String[] dayNamesBtBr1 = symbolsPtBr1.getShortWeekdays();
Log.e("LOCALE_ANDROID", String.format("%s(%s): (android.icu.text): %s", pt_BR.getDisplayVariant(), pt_BR.getDisplayName(), Arrays.toString(dayNamesBtBr1)));

java.text.DateFormatSymbols symbolsPtBr2 = new java.text.DateFormatSymbols(pt_BR);
String[] dayNamesBtBr2 = symbolsPtBr2.getShortWeekdays();
Log.e("LOCALE_ANDROID", String.format("%s(%s): (java.text): %s", pt_BR.getDisplayVariant(), pt_BR.getDisplayName(), Arrays.toString(dayNamesBtBr2)));

final java.util.Locale pt_PT = new java.util.Locale("pt", "PT");
android.icu.text.DateFormatSymbols symbolsPtPt1 = new android.icu.text.DateFormatSymbols(pt_PT);
String[] dayNamesBtPt1 = symbolsPtPt1.getShortWeekdays();
Log.e("LOCALE_ANDROID", String.format("%s(%s): (android.icu.text): %s", pt_PT.getDisplayVariant(), pt_PT.getDisplayName(), Arrays.toString(dayNamesBtPt1)));

java.text.DateFormatSymbols symbolsPtPt2 = new java.text.DateFormatSymbols(pt_PT);
String[] dayNamesBtPt2 = symbolsPtPt2.getShortWeekdays();
Log.e("LOCALE_ANDROID", String.format("%s(%s): (java.text): %s", pt_PT.getDisplayVariant(), pt_PT.getDisplayName(), Arrays.toString(dayNamesBtPt2)));

The log output (tested on Android 7.0):

LOCALE_ANDROID: (Portuguese (Brazil)): (android.icu.text): [, Dom, Seg, Ter, Qua, Qui, Sex, Sáb]
LOCALE_ANDROID: (Portuguese (Brazil)): (java.text): [, Dom, Seg, Ter, Qua, Qui, Sex, Sáb]
LOCALE_ANDROID: (Portuguese (Portugal)): (android.icu.text): [, domingo, segunda, terça, quarta, quinta, sexta, sábado]
LOCALE_ANDROID: (Portuguese (Portugal)): (java.text): [, domingo, segunda, terça, quarta, quinta, sexta, sábado]

Therefore, you can just truncate each weekday to a two- or three-letter symbol length with substring(0, len) and capitalize it with StringUtils.capitalize() method as this is the approach used for the issue in OsmAnd https://github.com/osmandapp/Osmand/issues/5115

Related