Fix ja, ko, zh date formatting

pull/618/head
Alex Baker 7 years ago
parent 9754ffd3bc
commit 5b26a47a96

@ -39,17 +39,17 @@ public class DateUtilitiesTest {
@Before
public void setUp() {
defaultLocale = Locale.getDefault();
Locale.setDefault(Locale.US);
setLocale(Locale.US);
}
@After
public void tearDown() {
DateUtilities.is24HourOverride = null;
Locale.setDefault(defaultLocale);
setLocale(defaultLocale);
}
private void setLocale(Locale locale) {
Locale.setDefault(locale);
org.tasks.locale.Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
DisplayMetrics metrics = getTargetContext().getResources().getDisplayMetrics();
@ -230,4 +230,74 @@ public class DateUtilitiesTest {
public void testAddMonthsWithMoreDays() {
assertEquals(newDate(2014, 1, 30).getMillis(), addCalendarMonthsToUnixtime(newDate(2013, 11, 30).getMillis(), 2));
}
@Test
public void usDateNoYear() {
setLocale(Locale.US);
freezeAt(new DateTime(2018, 1, 1)).thawAfter(() ->
assertEquals("Jan 14", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis())));
}
@Test
public void usDateWithYear() {
setLocale(Locale.US);
freezeAt(new DateTime(2017, 12, 12)).thawAfter(() ->
assertEquals("Jan 14 '18", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis())));
}
@Test
public void germanDateNoYear() {
setLocale(Locale.GERMAN);
freezeAt(new DateTime(2018, 1, 1)).thawAfter(() ->
assertEquals("14 Jan.", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis())));
}
@Test
public void germanDateWithYear() {
setLocale(Locale.GERMAN);
freezeAt(new DateTime(2017, 12, 12)).thawAfter(() ->
assertEquals("14 Jan. '18", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis())));
}
@Test
public void koreanDateNoYear() {
setLocale(Locale.KOREAN);
freezeAt(new DateTime(2018, 1, 1)).thawAfter(() ->
assertEquals("1월 14일", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis())));
}
@Test
public void koreanDateWithYear() {
setLocale(Locale.KOREAN);
freezeAt(new DateTime(2017, 12, 12)).thawAfter(() ->
assertEquals("18년 1월 14일", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis())));
}
@Test
public void japaneseDateNoYear() {
setLocale(Locale.JAPANESE);
freezeAt(new DateTime(2018, 1, 1)).thawAfter(() ->
assertEquals("1月 14日", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis())));
}
@Test
public void japaneseDateWithYear() {
setLocale(Locale.JAPANESE);
freezeAt(new DateTime(2017, 12, 12)).thawAfter(() ->
assertEquals("18年 1月 14日", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis())));
}
@Test
public void chineseDateNoYear() {
setLocale(Locale.CHINESE);
freezeAt(new DateTime(2018, 1, 1)).thawAfter(() ->
assertEquals("1月 14日", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis())));
}
@Test
public void chineseDateWithYear() {
setLocale(Locale.CHINESE);
freezeAt(new DateTime(2017, 12, 12)).thawAfter(() ->
assertEquals("18年 1月 14日", DateUtilities.getRelativeDateStringWithTime(getTargetContext(), new DateTime(2018, 1, 14).getMillis())));
}
}

@ -28,4 +28,12 @@ public class Freeze {
public void thawAfter(Snippet snippet) {
thaw();
}
public void thawAfter(Runnable run) {
try {
run.run();
} finally {
thaw();
}
}
}

@ -13,7 +13,6 @@ import com.todoroo.astrid.data.Task;
import org.tasks.R;
import org.tasks.time.DateTime;
import java.util.Arrays;
import java.util.Locale;
import static org.tasks.date.DateTimeUtils.newDateTime;
@ -65,6 +64,13 @@ public class DateUtilities {
/** Represents a single minute */
public static final long ONE_MINUTE = 60000L;
private static final String JA = "MMM d\u65E5";
private static final String JA_YEAR = "yy\u5E74 " + JA;
private static final String KO = "MMM d\uC77C";
private static final String KO_YEAR = "yy\uB144 " + KO;
private static final String ZH = "MMM d\u65E5";
private static final String ZH_YEAR = "yy\u5E74 " + ZH;
/* ======================================================================
* =========================================================== formatters
* ====================================================================== */
@ -95,12 +101,6 @@ public class DateUtilities {
return date.toString(value);
}
/* Returns true if search string is in sortedValues */
private static boolean arrayBinaryContains(String search, String... sortedValues) {
return Arrays.binarySearch(sortedValues, search) >= 0;
}
public static String getLongDateString(DateTime date) {
return getDateString("MMMM", date);
}
@ -114,26 +114,33 @@ public class DateUtilities {
}
private static String getDateString(String simpleDateFormat, DateTime date) {
String month = date.toString(simpleDateFormat);
String value;
Locale locale = Locale.getDefault();
if (arrayBinaryContains(locale.getLanguage(), "ja", "ko", "zh")
|| arrayBinaryContains(locale.getCountry(), "BZ", "CA", "KE", "MN" ,"US")) {
value = "'#' d";
} else {
value = "d '#'";
}
if (date.getYear() != newDateTime().getYear()) {
value = value + " ''yy";
boolean includeYear = date.getYear() != newDateTime().getYear();
String format = getFormat(Locale.getDefault(), simpleDateFormat, includeYear);
return date.toString(format);
}
private static String getFormat(Locale locale, String monthFormat, boolean includeYear) {
switch(locale.getLanguage()) {
case "ja":
return includeYear ? JA_YEAR : JA;
case "ko":
return includeYear ? KO_YEAR : KO;
case "zh":
return includeYear ? ZH_YEAR : ZH;
}
if (arrayBinaryContains(locale.getLanguage(), "ja", "zh")) {
return date.toString(value).replace("#", month) + "\u65E5";
} else if ("ko".equals(Locale.getDefault().getLanguage())) {
return date.toString(value).replace("#", month) + "\uC77C";
} else {
return date.toString(value).replace("#", month);
switch (locale.getCountry()) {
case "BZ":
case "CA":
case "KE":
case "MN":
case "US":
return includeYear
? monthFormat + " d ''yy"
: monthFormat + " d";
default:
return includeYear
? "d " + monthFormat + " ''yy"
: "d " + monthFormat;
}
}

@ -37,8 +37,7 @@ public class Locale {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext);
String language = prefs.getString(applicationContext.getString(R.string.p_language), null);
int directionOverride = Integer.parseInt(prefs.getString(applicationContext.getString(R.string.p_layout_direction), "-1"));
INSTANCE = new Locale(DEFAULT.getLocale(), language, directionOverride);
java.util.Locale.setDefault(INSTANCE.getLocale());
setDefault(DEFAULT.getLocale(), language, directionOverride);
}
}
}
@ -46,6 +45,15 @@ public class Locale {
return getInstance();
}
public static void setDefault(java.util.Locale locale) {
setDefault(locale, null, -1);
}
private static void setDefault(java.util.Locale locale, String languageOverride, int directionOverride) {
INSTANCE = new Locale(locale, languageOverride, directionOverride);
java.util.Locale.setDefault(locale);
}
public static Locale getInstance() {
return INSTANCE == null ? DEFAULT : INSTANCE;
}

Loading…
Cancel
Save