-/*
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+/*
********************************************************************************
-* Copyright (C) 1997-2012, International Business Machines
+* Copyright (C) 1997-2016, International Business Machines
* Corporation and others. All Rights Reserved.
********************************************************************************
*
* Changed to match C++ conventions
********************************************************************************
*/
-
+
#ifndef DTFMTSYM_H
#define DTFMTSYM_H
-
+
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
#include "unicode/calendar.h"
+#include "unicode/strenum.h"
#include "unicode/uobject.h"
#include "unicode/locid.h"
+#include "unicode/udat.h"
#include "unicode/ures.h"
/**
- * \file
+ * \file
* \brief C++ API: Symbols for formatting dates.
*/
+#if U_SHOW_CPLUSPLUS_API
U_NAMESPACE_BEGIN
/* forward declaration */
* locale at least contains any resources that are to be particularized for the
* calendar type.
*/
-class U_I18N_API DateFormatSymbols : public UObject {
+class U_I18N_API DateFormatSymbols U_FINAL : public UObject {
public:
/**
* Construct a DateFormatSymbols object by loading format data from
* data for the default locale, it will return a last-resort object
* based on hard-coded strings.
*
- * @param type Type of calendar (as returned by Calendar::getType).
+ * @param type Type of calendar (as returned by Calendar::getType).
* Will be used to access the correct set of strings.
* (NULL or empty string defaults to "gregorian".)
* @param status Status code. Failure
* resources for the given locale, in the default calendar (Gregorian).
*
* @param locale Locale to load format data from.
- * @param type Type of calendar (as returned by Calendar::getType).
+ * @param type Type of calendar (as returned by Calendar::getType).
* Will be used to access the correct set of strings.
* (NULL or empty string defaults to "gregorian".)
* @param status Status code. Failure
* @stable ICU 3.6
*/
enum DtContextType {
- FORMAT,
- STANDALONE,
- DT_CONTEXT_COUNT
+ FORMAT,
+ STANDALONE,
+#ifndef U_HIDE_DEPRECATED_API
+ /**
+ * One more than the highest normal DtContextType value.
+ * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
+ */
+ DT_CONTEXT_COUNT
+#endif // U_HIDE_DEPRECATED_API
};
/**
* @stable ICU 3.6
*/
enum DtWidthType {
- ABBREVIATED,
- WIDE,
- NARROW,
- DT_WIDTH_COUNT
+ ABBREVIATED,
+ WIDE,
+ NARROW,
+ /**
+ * Short width is currently only supported for weekday names.
+ * @stable ICU 51
+ */
+ SHORT,
+#ifndef U_HIDE_DEPRECATED_API
+ /**
+ * One more than the highest normal DtWidthType value.
+ * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
+ */
+ DT_WIDTH_COUNT = 4
+#endif // U_HIDE_DEPRECATED_API
};
/**
void setMonths(const UnicodeString* months, int32_t count, DtContextType context, DtWidthType width);
/**
- * Gets weekday strings. For example: "Sunday", "Monday", etc.
+ * Gets wide weekday strings. For example: "Sunday", "Monday", etc.
* @param count Filled in with length of the array.
* @return the weekday strings. (DateFormatSymbols retains ownership.)
* @stable ICU 2.0
/**
- * Sets weekday strings. For example: "Sunday", "Monday", etc.
+ * Sets wide weekday strings. For example: "Sunday", "Monday", etc.
* @param weekdays the new weekday strings. (not adopted; caller retains ownership)
* @param count Filled in with length of the array.
* @stable ICU 2.0
void setWeekdays(const UnicodeString* weekdays, int32_t count);
/**
- * Gets short weekday strings. For example: "Sun", "Mon", etc.
+ * Gets abbreviated weekday strings. For example: "Sun", "Mon", etc. (Note: The method name is
+ * misleading; it does not get the CLDR-style "short" weekday strings, e.g. "Su", "Mo", etc.)
* @param count Filled in with length of the array.
- * @return the short weekday strings. (DateFormatSymbols retains ownership.)
+ * @return the abbreviated weekday strings. (DateFormatSymbols retains ownership.)
* @stable ICU 2.0
*/
const UnicodeString* getShortWeekdays(int32_t& count) const;
/**
- * Sets short weekday strings. For example: "Sun", "Mon", etc.
- * @param shortWeekdays the new short weekday strings. (not adopted; caller retains ownership)
- * @param count Filled in with length of the array.
+ * Sets abbreviated weekday strings. For example: "Sun", "Mon", etc. (Note: The method name is
+ * misleading; it does not set the CLDR-style "short" weekday strings, e.g. "Su", "Mo", etc.)
+ * @param abbrevWeekdays the new abbreviated weekday strings. (not adopted; caller retains ownership)
+ * @param count Filled in with length of the array.
* @stable ICU 2.0
*/
- void setShortWeekdays(const UnicodeString* shortWeekdays, int32_t count);
+ void setShortWeekdays(const UnicodeString* abbrevWeekdays, int32_t count);
/**
* Gets weekday strings by width and context. For example: "Sunday", "Monday", etc.
* @param count Filled in with length of the array.
* @param context The formatting context, either FORMAT or STANDALONE
- * @param width The width of returned strings, either WIDE, ABBREVIATED, or NARROW
+ * @param width The width of returned strings, either WIDE, ABBREVIATED, SHORT, or NARROW
* @return the month strings. (DateFormatSymbols retains ownership.)
* @stable ICU 3.4
*/
* @param weekdays The new weekday strings. (not adopted; caller retains ownership)
* @param count Filled in with length of the array.
* @param context The formatting context, either FORMAT or STANDALONE
- * @param width The width of returned strings, either WIDE, ABBREVIATED, or NARROW
+ * @param width The width of returned strings, either WIDE, ABBREVIATED, SHORT, or NARROW
* @stable ICU 3.6
*/
void setWeekdays(const UnicodeString* weekdays, int32_t count, DtContextType context, DtWidthType width);
*/
void setAmPmStrings(const UnicodeString* ampms, int32_t count);
+#ifndef U_HIDE_INTERNAL_API
+ /**
+ * This default time separator is used for formatting when the locale
+ * doesn't specify any time separator, and always recognized when parsing.
+ * @internal
+ */
+ static const char16_t DEFAULT_TIME_SEPARATOR = 0x003a; // ':'
+
+ /**
+ * This alternate time separator is always recognized when parsing.
+ * @internal
+ */
+ static const char16_t ALTERNATE_TIME_SEPARATOR = 0x002e; // '.'
+
+ /**
+ * Gets the time separator string. For example: ":".
+ * @param result Output param which will receive the time separator string.
+ * @return A reference to 'result'.
+ * @internal
+ */
+ UnicodeString& getTimeSeparatorString(UnicodeString& result) const;
+
+ /**
+ * Sets the time separator string. For example: ":".
+ * @param newTimeSeparator the new time separator string.
+ * @internal
+ */
+ void setTimeSeparatorString(const UnicodeString& newTimeSeparator);
+#endif /* U_HIDE_INTERNAL_API */
+
+ /**
+ * Gets cyclic year name strings if the calendar has them, by width and context.
+ * For example: "jia-zi", "yi-chou", etc.
+ * @param count Filled in with length of the array.
+ * @param context The usage context: FORMAT, STANDALONE.
+ * @param width The requested name width: WIDE, ABBREVIATED, NARROW.
+ * @return The year name strings (DateFormatSymbols retains ownership),
+ * or null if they are not available for this calendar.
+ * @stable ICU 54
+ */
+ const UnicodeString* getYearNames(int32_t& count,
+ DtContextType context, DtWidthType width) const;
+
+ /**
+ * Sets cyclic year name strings by width and context. For example: "jia-zi", "yi-chou", etc.
+ *
+ * @param yearNames The new cyclic year name strings (not adopted; caller retains ownership).
+ * @param count The length of the array.
+ * @param context The usage context: FORMAT, STANDALONE (currently only FORMAT is supported).
+ * @param width The name width: WIDE, ABBREVIATED, NARROW (currently only ABBREVIATED is supported).
+ * @stable ICU 54
+ */
+ void setYearNames(const UnicodeString* yearNames, int32_t count,
+ DtContextType context, DtWidthType width);
+
+ /**
+ * Gets calendar zodiac name strings if the calendar has them, by width and context.
+ * For example: "Rat", "Ox", "Tiger", etc.
+ * @param count Filled in with length of the array.
+ * @param context The usage context: FORMAT, STANDALONE.
+ * @param width The requested name width: WIDE, ABBREVIATED, NARROW.
+ * @return The zodiac name strings (DateFormatSymbols retains ownership),
+ * or null if they are not available for this calendar.
+ * @stable ICU 54
+ */
+ const UnicodeString* getZodiacNames(int32_t& count,
+ DtContextType context, DtWidthType width) const;
+
+ /**
+ * Sets calendar zodiac name strings by width and context. For example: "Rat", "Ox", "Tiger", etc.
+ *
+ * @param zodiacNames The new zodiac name strings (not adopted; caller retains ownership).
+ * @param count The length of the array.
+ * @param context The usage context: FORMAT, STANDALONE (currently only FORMAT is supported).
+ * @param width The name width: WIDE, ABBREVIATED, NARROW (currently only ABBREVIATED is supported).
+ * @stable ICU 54
+ */
+ void setZodiacNames(const UnicodeString* zodiacNames, int32_t count,
+ DtContextType context, DtWidthType width);
+
#ifndef U_HIDE_INTERNAL_API
/**
* Somewhat temporary constants for leap month pattern types, adequate for supporting
* @return the non-localized date-time pattern characters
* @stable ICU 2.0
*/
- static const UChar * U_EXPORT2 getPatternUChars(void);
+ static const char16_t * U_EXPORT2 getPatternUChars(void);
/**
* Gets localized date-time pattern characters. For example: 'u', 't', etc.
*/
Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
-#ifndef U_HIDE_INTERNAL_API
+ /* The following type and kCapContextUsageTypeCount cannot be #ifndef U_HIDE_INTERNAL_API,
+ they are needed for .h file declarations. */
/**
* Constants for capitalization context usage types.
* @internal
*/
enum ECapitalizationContextUsageType
{
- kCapContextUsageOther,
+#ifndef U_HIDE_INTERNAL_API
+ kCapContextUsageOther = 0,
kCapContextUsageMonthFormat, /* except narrow */
kCapContextUsageMonthStandalone, /* except narrow */
kCapContextUsageMonthNarrow,
kCapContextUsageZoneShort,
kCapContextUsageMetazoneLong,
kCapContextUsageMetazoneShort,
- kCapContextUsageTypeCount
+#endif /* U_HIDE_INTERNAL_API */
+ kCapContextUsageTypeCount = 14
};
-#endif /* U_HIDE_INTERNAL_API */
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
int32_t fStandaloneNarrowMonthsCount;
/**
- * Weekday strings. For example: "Sunday", "Monday", etc.
+ * CLDR-style format wide weekday strings. For example: "Sunday", "Monday", etc.
*/
UnicodeString* fWeekdays;
int32_t fWeekdaysCount;
/**
- * Short weekday strings. For example: "Sun", "Mon", etc.
+ * CLDR-style format abbreviated (not short) weekday strings. For example: "Sun", "Mon", etc.
*/
UnicodeString* fShortWeekdays;
int32_t fShortWeekdaysCount;
/**
- * Narrow weekday strings. For example: "Sun", "Mon", etc.
+ * CLDR-style format short weekday strings. For example: "Su", "Mo", etc.
+ */
+ UnicodeString* fShorterWeekdays;
+ int32_t fShorterWeekdaysCount;
+
+ /**
+ * CLDR-style format narrow weekday strings. For example: "S", "M", etc.
*/
UnicodeString* fNarrowWeekdays;
int32_t fNarrowWeekdaysCount;
/**
- * Standalone Weekday strings. For example: "Sunday", "Monday", etc.
+ * CLDR-style standalone wide weekday strings. For example: "Sunday", "Monday", etc.
*/
UnicodeString* fStandaloneWeekdays;
int32_t fStandaloneWeekdaysCount;
/**
- * Standalone Short weekday strings. For example: "Sun", "Mon", etc.
+ * CLDR-style standalone abbreviated (not short) weekday strings. For example: "Sun", "Mon", etc.
*/
UnicodeString* fStandaloneShortWeekdays;
int32_t fStandaloneShortWeekdaysCount;
+ /**
+ * CLDR-style standalone short weekday strings. For example: "Su", "Mo", etc.
+ */
+ UnicodeString* fStandaloneShorterWeekdays;
+ int32_t fStandaloneShorterWeekdaysCount;
+
/**
* Standalone Narrow weekday strings. For example: "Sun", "Mon", etc.
*/
UnicodeString* fAmPms;
int32_t fAmPmsCount;
+ /**
+ * Narrow Ampm strings. For example: "a" and "p".
+ */
+ UnicodeString* fNarrowAmPms;
+ int32_t fNarrowAmPmsCount;
+
+ /**
+ * Time separator string. For example: ":".
+ */
+ UnicodeString fTimeSeparator;
+
/**
* Quarter strings. For example: "1st quarter", "2nd quarter", etc.
*/
int32_t fLeapMonthPatternsCount;
/**
- * (Format) Short cyclic year names, for example: "jia-zi", "yi-chou", ... "gui-hai"
+ * Cyclic year names, for example: "jia-zi", "yi-chou", ... "gui-hai";
+ * currently we only have data for format/abbreviated.
+ * For the others, just get from format/abbreviated, ignore set.
*/
- UnicodeString* fShortYearNames;
+ UnicodeString *fShortYearNames;
int32_t fShortYearNamesCount;
+ /**
+ * Cyclic zodiac names, for example "Rat", "Ox", "Tiger", etc.;
+ * currently we only have data for format/abbreviated.
+ * For the others, just get from format/abbreviated, ignore set.
+ */
+ UnicodeString *fShortZodiacNames;
+ int32_t fShortZodiacNamesCount;
+
/**
* Localized names of time zones in this locale. This is a
* two-dimensional array of strings of size n by m,
*/
UnicodeString fLocalPatternChars;
-#ifndef U_HIDE_INTERNAL_API
/**
* Capitalization transforms. For each usage type, the first array element indicates
* whether to titlecase for uiListOrMenu context, the second indicates whether to
* titlecase for stand-alone context.
*/
UBool fCapitalization[kCapContextUsageTypeCount][2];
-#endif
+ /**
+ * Abbreviated (== short) day period strings.
+ */
+ UnicodeString *fAbbreviatedDayPeriods;
+ int32_t fAbbreviatedDayPeriodsCount;
+
+ /**
+ * Wide day period strings.
+ */
+ UnicodeString *fWideDayPeriods;
+ int32_t fWideDayPeriodsCount;
+
+ /**
+ * Narrow day period strings.
+ */
+ UnicodeString *fNarrowDayPeriods;
+ int32_t fNarrowDayPeriodsCount;
+
+ /**
+ * Stand-alone abbreviated (== short) day period strings.
+ */
+ UnicodeString *fStandaloneAbbreviatedDayPeriods;
+ int32_t fStandaloneAbbreviatedDayPeriodsCount;
+
+ /**
+ * Stand-alone wide day period strings.
+ */
+ UnicodeString *fStandaloneWideDayPeriods;
+ int32_t fStandaloneWideDayPeriodsCount;
+
+ /**
+ * Stand-alone narrow day period strings.
+ */
+ UnicodeString *fStandaloneNarrowDayPeriods;
+ int32_t fStandaloneNarrowDayPeriodsCount;
private:
/** valid/actual locale information
* Delete just the zone strings.
*/
void disposeZoneStrings(void);
+
+ /**
+ * Returns the date format field index of the pattern character c,
+ * or UDAT_FIELD_COUNT if c is not a pattern character.
+ */
+ static UDateFormatField U_EXPORT2 getPatternCharIndex(char16_t c);
+
+ /**
+ * Returns TRUE if f (with its pattern character repeated count times) is a numeric field.
+ */
+ static UBool U_EXPORT2 isNumericField(UDateFormatField f, int32_t count);
+
+ /**
+ * Returns TRUE if c (repeated count times) is the pattern character for a numeric field.
+ */
+ static UBool U_EXPORT2 isNumericPatternChar(char16_t c, int32_t count);
+public:
+#ifndef U_HIDE_INTERNAL_API
+ /**
+ * Gets a DateFormatSymbols by locale.
+ * Unlike the constructors which always use gregorian calendar, this
+ * method uses the calendar in the locale. If the locale contains no
+ * explicit calendar, this method uses the default calendar for that
+ * locale.
+ * @param locale the locale.
+ * @param status error returned here.
+ * @return the new DateFormatSymbols which the caller owns.
+ * @internal For ICU use only.
+ */
+ static DateFormatSymbols * U_EXPORT2 createForLocale(
+ const Locale &locale, UErrorCode &status);
+
+ /**
+ * Apple addition
+ * Get whether to capitalize based on usage.
+ * @param usage the usage.
+ * @param context 0 for menu, 1 for standalone
+ * @return TRUE to capitalize, FALSE otherwise
+ * @internal For ICU use only.
+ */
+ UBool capitalizeForUsage(ECapitalizationContextUsageType usage, int32_t context) const;
+#endif /* U_HIDE_INTERNAL_API */
};
+inline UBool
+DateFormatSymbols::capitalizeForUsage(DateFormatSymbols::ECapitalizationContextUsageType usage, int32_t context) const
+{
+ return fCapitalization[usage][context];
+}
+
U_NAMESPACE_END
+#endif // U_SHOW_CPLUSPLUS_API
#endif /* #if !UCONFIG_NO_FORMATTING */