summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFredrik Roubert <roubert@google.com>2017-11-30 14:32:46 +0100
committerFredrik Roubert <roubert@google.com>2018-05-31 16:40:00 -0700
commited1b87a3342117df58d428a5ad02bd42161e958e (patch)
tree4371eae363db0508f5143b5e82c40b91c82bbb90
parentb79435274025f591aa0106b206617411e38c3742 (diff)
downloadicu-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
-rw-r--r--icu4c/source/i18n/dtitvfmt.cpp25
-rw-r--r--icu4j/main/classes/core/src/com/ibm/icu/text/DateIntervalFormat.java9
-rw-r--r--icu4j/main/classes/core/src/com/ibm/icu/text/RelativeDateTimeFormatter.java17
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;