diff options
author | Fredrik Roubert <roubert@google.com> | 2017-11-30 14:32:46 +0100 |
---|---|---|
committer | Fredrik Roubert <roubert@google.com> | 2018-05-31 16:40:00 -0700 |
commit | ed1b87a3342117df58d428a5ad02bd42161e958e (patch) | |
tree | 4371eae363db0508f5143b5e82c40b91c82bbb90 | |
parent | b79435274025f591aa0106b206617411e38c3742 (diff) | |
download | icu-ed1b87a3342117df58d428a5ad02bd42161e958e.tar.gz |
Android patch: CLDR Ticket #10321: Apostrophe in pattern bug.
This is a temporary workaround until the issue has been fixed upstream:
https://unicode.org/cldr/trac/ticket/10321
http://bugs.icu-project.org/trac/ticket/13295
This change was introduced in Android for ICU 59:
https://android.googlesource.com/platform/external/icu/+/6f91254
https://android.googlesource.com/platform/external/icu/+/a765635
https://android.googlesource.com/platform/external/icu/+/c98207c
(cherry picked from commit 9b607c4e580bebd23ad9c2873227c5de7afc5279)
Change-Id: I5951e257956c4be9db7eccb2d495ee129542bb5f
3 files changed, 39 insertions, 12 deletions
diff --git a/icu4c/source/i18n/dtitvfmt.cpp b/icu4c/source/i18n/dtitvfmt.cpp index 743b534fc..db9ae04be 100644 --- a/icu4c/source/i18n/dtitvfmt.cpp +++ b/icu4c/source/i18n/dtitvfmt.cpp @@ -22,6 +22,9 @@ #include "unicode/calendar.h" #include "unicode/dtptngen.h" #include "unicode/dtitvinf.h" +// Android patch (CLDR ticket #10321) begin. +#include "unicode/msgfmt.h" +// Android patch (CLDR ticket #10321) begin. #include "unicode/simpleformatter.h" #include "cmemory.h" #include "cstring.h" @@ -1370,12 +1373,24 @@ DateIntervalFormat::fallbackFormat(Calendar& fromCalendar, otherPos.setEndIndex(0); fDateFormat->format(fromCalendar, datePortion, otherPos); adjustPosition(*fDateTimeFormat, fallbackRange, pos, datePortion, otherPos, pos); - const UnicodeString *values[2] = { - &fallbackRange, // {0} is time range - &datePortion, // {1} is single date portion + + // Android patch (CLDR ticket #10321) begin. + UParseError parseError; + const UnicodeString emptyPattern; + const Formattable values[] = { + fallbackRange, // {0} is time range + datePortion, // {1} is single date portion }; - SimpleFormatter(*fDateTimeFormat, 2, 2, status). - formatAndReplace(values, 2, fallbackRange, NULL, 0, status); + UnicodeString formattedMessage; + FieldPosition outputPos = 0; + MessageFormat msgFmt(emptyPattern, status); + msgFmt.applyPattern(*fDateTimeFormat, UMSGPAT_APOS_DOUBLE_REQUIRED, + &parseError, status); + msgFmt.format(values, 2, formattedMessage, outputPos, status); + if (U_SUCCESS(status)) { + fallbackRange = formattedMessage; + } + // Android patch (CLDR ticket #10321) end. } if ( U_SUCCESS(status) ) { appendTo.append(fallbackRange); diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/DateIntervalFormat.java b/icu4j/main/classes/core/src/com/ibm/icu/text/DateIntervalFormat.java index fac49a006..4c88da72e 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/text/DateIntervalFormat.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/text/DateIntervalFormat.java @@ -874,8 +874,13 @@ public class DateIntervalFormat extends UFormat { otherPos.setEndIndex(0); datePortion = fDateFormat.format(fromCalendar, datePortion, otherPos); adjustPosition(fDateTimeFormat, fallbackRange, pos, datePortion.toString(), otherPos, pos); - fallbackRange = SimpleFormatterImpl.formatRawPattern( - fDateTimeFormat, 2, 2, fallbackRange, datePortion); + // Android patch (CLDR ticket #10321) begin. + MessageFormat msgFmt = new MessageFormat(""); + msgFmt.applyPattern(fDateTimeFormat, MessagePattern.ApostropheMode.DOUBLE_REQUIRED); + StringBuffer fallbackRangeBuffer = new StringBuffer(128); + fallbackRange = msgFmt.format(new Object[] { fallbackRange, datePortion }, + fallbackRangeBuffer, new FieldPosition(0)).toString(); + // Android patch (CLDR ticket #10321) end. } appendTo.append(fallbackRange); if (formatDatePlusTimeRange) { diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/RelativeDateTimeFormatter.java b/icu4j/main/classes/core/src/com/ibm/icu/text/RelativeDateTimeFormatter.java index bd808b46e..465c990a6 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/text/RelativeDateTimeFormatter.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/text/RelativeDateTimeFormatter.java @@ -8,6 +8,7 @@ */ package com.ibm.icu.text; +import java.text.FieldPosition; import java.util.EnumMap; import java.util.Locale; @@ -456,8 +457,8 @@ public final class RelativeDateTimeFormatter { return new RelativeDateTimeFormatter( data.qualitativeUnitMap, data.relUnitPatternMap, - SimpleFormatterImpl.compileToStringMinMaxArguments( - data.dateTimePattern, new StringBuilder(), 2, 2), + // Android-changed: use MessageFormat instead of SimpleFormatterImpl (b/63745717). + data.dateTimePattern, PluralRules.forLocale(locale), nf, style, @@ -708,8 +709,13 @@ public final class RelativeDateTimeFormatter { * @stable ICU 53 */ public String combineDateAndTime(String relativeDateString, String timeString) { - return SimpleFormatterImpl.formatCompiledPattern( - combinedDateAndTime, timeString, relativeDateString); + // BEGIN Android-changed: use MessageFormat instead of SimpleFormatterImpl (b/63745717). + MessageFormat msgFmt = new MessageFormat(""); + msgFmt.applyPattern(combinedDateAndTime, MessagePattern.ApostropheMode.DOUBLE_REQUIRED); + StringBuffer combinedDateTimeBuffer = new StringBuffer(128); + return msgFmt.format(new Object[] { timeString, relativeDateString}, + combinedDateTimeBuffer, new FieldPosition(0)).toString(); + // END Android-changed: use MessageFormat instead of SimpleFormatterImpl (b/63745717). } /** @@ -817,7 +823,8 @@ public final class RelativeDateTimeFormatter { private final EnumMap<Style, EnumMap<AbsoluteUnit, EnumMap<Direction, String>>> qualitativeUnitMap; private final EnumMap<Style, EnumMap<RelativeUnit, String[][]>> patternMap; - private final String combinedDateAndTime; // compiled SimpleFormatter pattern + // Android-changed: use MessageFormat instead of SimpleFormatterImpl (b/63745717). + private final String combinedDateAndTime; // MessageFormat pattern for combining date and time. private final PluralRules pluralRules; private final NumberFormat numberFormat; |