/*
********************************************************************************
-* Copyright (C) 1997-2003, International Business Machines
+* Copyright (C) 1997-2006, International Business Machines
* Corporation and others. All Rights Reserved.
********************************************************************************
*
#include "unicode/uobject.h"
#include "unicode/locid.h"
-#include "unicode/resbund.h"
+#include "unicode/ures.h"
+
+/**
+ * \file
+ * \brief C++ API: Symbols for formatting dates.
+ */
U_NAMESPACE_BEGIN
/* forward declaration */
class SimpleDateFormat;
+class Hashtable;
/**
* DateFormatSymbols is a public class for encapsulating localizable date-time
* subclassed.
* @stable ICU 2.0
*/
- ~DateFormatSymbols();
+ virtual ~DateFormatSymbols();
/**
* Return true if another object is semantically equal to this one.
*/
void setEras(const UnicodeString* eras, int32_t count);
+ /**
+ * Gets era name strings. For example: "Anno Domini" and "Before Christ".
+ *
+ * @param count Filled in with length of the array.
+ * @return the era name strings.
+ * @draft ICU 3.4
+ */
+ const UnicodeString* getEraNames(int32_t& count) const;
+
+ /**
+ * Sets era name strings. For example: "Anno Domini" and "Before Christ".
+ * @param eraNames Array of era name strings (DateFormatSymbols retains ownership.)
+ * @param count Filled in with length of the array.
+ * @draft ICU 3.6
+ */
+ void setEraNames(const UnicodeString* eraNames, int32_t count);
+
/**
* Gets month strings. For example: "January", "February", etc.
* @param count Filled in with length of the array.
*/
void setShortMonths(const UnicodeString* shortMonths, int32_t count);
+ /**
+ * Selector for date formatting context
+ * @draft ICU 3.6
+ */
+ enum DtContextType {
+ FORMAT,
+ STANDALONE,
+ DT_CONTEXT_COUNT
+ };
+
+ /**
+ * Selector for date formatting width
+ * @draft ICU 3.6
+ */
+ enum DtWidthType {
+ ABBREVIATED,
+ WIDE,
+ NARROW,
+ DT_WIDTH_COUNT
+ };
+
+ /**
+ * Gets month strings by width and context. For example: "January", "February", 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.
+ * @return the month strings. (DateFormatSymbols retains ownership.)
+ * @draft ICU 3.4
+ */
+ const UnicodeString* getMonths(int32_t& count, DtContextType context, DtWidthType width) const;
+
+ /**
+ * Sets month strings by width and context. For example: "January", "February", etc.
+ *
+ * @param months The new month 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.
+ * @draft ICU 3.6
+ */
+ void setMonths(const UnicodeString* months, int32_t count, DtContextType context, DtWidthType width);
+
/**
* Gets weekday strings. For example: "Sunday", "Monday", etc.
* @param count Filled in with length of the array.
*/
const UnicodeString* getWeekdays(int32_t& count) const;
+
/**
* Sets weekday strings. For example: "Sunday", "Monday", etc.
* @param weekdays the new weekday strings. (not adopted; caller retains ownership)
*/
void setShortWeekdays(const UnicodeString* shortWeekdays, 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
+ * @return the month strings. (DateFormatSymbols retains ownership.)
+ * @draft ICU 3.4
+ */
+ const UnicodeString* getWeekdays(int32_t& count, DtContextType context, DtWidthType width) const;
+
+ /**
+ * Sets weekday strings by width and context. 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.
+ * @param context The formatting context, either FORMAT or STANDALONE
+ * @param width The width of returned strings, either WIDE, ABBREVIATED, or NARROW
+ * @draft ICU 3.6
+ */
+ void setWeekdays(const UnicodeString* weekdays, int32_t count, DtContextType context, DtWidthType width);
+
+ /**
+ * Gets quarter strings by width and context. For example: "1st Quarter", "2nd Quarter", 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 or ABBREVIATED. There
+ * are no NARROW quarters.
+ * @return the quarter strings. (DateFormatSymbols retains ownership.)
+ * @draft ICU 3.6
+ */
+ const UnicodeString* getQuarters(int32_t& count, DtContextType context, DtWidthType width) const;
+
+ /**
+ * Sets quarter strings by width and context. For example: "1st Quarter", "2nd Quarter", etc.
+ *
+ * @param quarters The new quarter 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 or ABBREVIATED. There
+ * are no NARROW quarters.
+ * @draft ICU 3.6
+ */
+ void setQuarters(const UnicodeString* quarters, int32_t count, DtContextType context, DtWidthType width);
+
/**
* Gets AM/PM strings. For example: "AM" and "PM".
* @param count Filled in with length of the array.
* @param rowCount Output param to receive number of rows.
* @param columnCount Output param to receive number of columns.
* @return The timezone strings as a 2-d array. (DateFormatSymbols retains ownership.)
- * @stable ICU 2.0
+ * @deprecated ICU 3.6
*/
const UnicodeString** getZoneStrings(int32_t& rowCount, int32_t& columnCount) const;
* @return the non-localized date-time pattern characters
* @stable ICU 2.0
*/
- static const UChar *getPatternUChars(void);
+ static const UChar * U_EXPORT2 getPatternUChars(void);
/**
* Gets localized date-time pattern characters. For example: 'u', 't', etc.
*/
void setLocalPatternChars(const UnicodeString& newLocalPatternChars);
+ /**
+ * Returns the locale for this object. Two flavors are available:
+ * valid and actual locale.
+ * @stable ICU 2.8
+ */
+ Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
+
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
*
- * @draft ICU 2.2
+ * @stable ICU 2.2
*/
- virtual inline UClassID getDynamicClassID() const;
+ virtual UClassID getDynamicClassID() const;
/**
* ICU "poor man's RTTI", returns a UClassID for this class.
*
- * @draft ICU 2.2
+ * @stable ICU 2.2
*/
- static inline UClassID getStaticClassID();
+ static UClassID U_EXPORT2 getStaticClassID();
-private:
/**
- * Tag names used by this class.
+ * The translation type of the translated zone strings
+ * @internal ICU 3.6
*/
- static const char fgErasTag[]; // resource bundle tag for era names
- static const char fgMonthNamesTag[]; // resource bundle tag for month names
- static const char fgMonthAbbreviationsTag[]; // resource bundle tag for month abbreviations
- static const char fgDayNamesTag[]; // resource bundle tag for day names
- static const char fgDayAbbreviationsTag[]; // resource bundle tag for day abbreviations
- static const char fgAmPmMarkersTag[]; // resource bundle tag for AM/PM strings
+ enum TimeZoneTranslationType {
+ TIMEZONE_SHORT_GENERIC,
+ TIMEZONE_SHORT_STANDARD,
+ TIMEZONE_SHORT_DAYLIGHT,
+ TIMEZONE_LONG_GENERIC,
+ TIMEZONE_LONG_STANDARD,
+ TIMEZONE_LONG_DAYLIGHT,
+ TIMEZONE_EXEMPLAR_CITY,
+ TIMEZONE_COUNT
+ };
+
+ /**
+ * Creates an enumeration of time zone IDs. The object is owned by the caller and should delete it after use.
+ * The time zone IDs are just for programmatic lookup. NOT LOCALIZED!!!
+ * @param status Input/output parameter, set to success or
+ * failure code upon return.
+ * @return A new StringEnumeration object
+ * @internal ICU 3.6
+ */
+ virtual StringEnumeration* createZoneStringIDs(UErrorCode &status);
+
+ /**
+ * Gets timezone string give the key and translation type
+ * @param ID The ID of zone strings, e.g: "America/Los_Angeles".
+ * The time zone ID is for programmatic lookup.
+ * @param type The translation type requested
+ * @param result Output parameter to recieve the translation string
+ * @param status Input/output parameter, set to success or
+ * failure code upon return.
+ * @return the input UnicodeString parameter for chaining
+ * @internal ICU 3.6
+ */
+ UnicodeString& getZoneString(const UnicodeString &ID, const TimeZoneTranslationType type, UnicodeString &result, UErrorCode &status);
+
+ /**
+ * Sets timezone string for the given the ID and translation type
+ * @param ID The ID of zone strings, e.g: "America/Los_Angeles".
+ * The time zone ID is for programmatic lookup.
+ * @param type The translation type to set the value for
+ * @param value The string with which current translation needs to be replaced
+ * @param status Input/output parameter, set to success or
+ * @internal ICU 3.6
+ */
+ void setZoneString(const UnicodeString &ID, const TimeZoneTranslationType type, const UnicodeString &value, UErrorCode &status);
- static const char fgZoneStringsTag[]; // resource bundle tag for time zone names
- static const char fgLocalPatternCharsTag[]; // resource bundle tag for localized pattern characters
+private:
friend class SimpleDateFormat;
friend class DateFormatSymbolsSingleSetter; // see udat.cpp
UnicodeString* fEras;
int32_t fErasCount;
+ /**
+ * Era name strings. For example: "Anno Domini" and "Before Christ".
+ */
+ UnicodeString* fEraNames;
+ int32_t fEraNamesCount;
+
/**
* Month strings. For example: "January", "February", etc.
*/
UnicodeString* fShortMonths;
int32_t fShortMonthsCount;
+ /**
+ * Narrow month strings. For example: "J", "F", etc.
+ */
+ UnicodeString* fNarrowMonths;
+ int32_t fNarrowMonthsCount;
+
+ /**
+ * Standalone Month strings. For example: "January", "February", etc.
+ */
+ UnicodeString* fStandaloneMonths;
+ int32_t fStandaloneMonthsCount;
+
+ /**
+ * Standalone Short month strings. For example: "Jan", "Feb", etc.
+ */
+ UnicodeString* fStandaloneShortMonths;
+ int32_t fStandaloneShortMonthsCount;
+
+ /**
+ * Standalone Narrow month strings. For example: "J", "F", etc.
+ */
+ UnicodeString* fStandaloneNarrowMonths;
+ int32_t fStandaloneNarrowMonthsCount;
+
/**
* Weekday strings. For example: "Sunday", "Monday", etc.
*/
int32_t fShortWeekdaysCount;
/**
- * Ampm strings. For example: "AM" and "PM".
+ * Narrow weekday strings. For example: "Sun", "Mon", etc.
*/
- UnicodeString* fAmPms;
- int32_t fAmPmsCount;
+ UnicodeString* fNarrowWeekdays;
+ int32_t fNarrowWeekdaysCount;
/**
- * The format data of all the timezones in this locale.
+ * Standalone Weekday strings. For example: "Sunday", "Monday", etc.
*/
- UnicodeString** fZoneStrings;
- int32_t fZoneStringsRowCount;
- int32_t fZoneStringsColCount;
+ UnicodeString* fStandaloneWeekdays;
+ int32_t fStandaloneWeekdaysCount;
/**
- * Localized date-time pattern characters. For example: use 'u' as 'y'.
+ * Standalone Short weekday strings. For example: "Sun", "Mon", etc.
*/
- UnicodeString fLocalPatternChars;
+ UnicodeString* fStandaloneShortWeekdays;
+ int32_t fStandaloneShortWeekdaysCount;
/**
- * The address of this static class variable serves as this class's ID
- * for ICU "poor man's RTTI".
+ * Standalone Narrow weekday strings. For example: "Sun", "Mon", etc.
*/
- static const char fgClassID;
-
-private:
-
- /* Sizes for the last resort string arrays */
- typedef enum LastResortSize {
- kMonthNum = 13,
- kMonthLen = 3,
+ UnicodeString* fStandaloneNarrowWeekdays;
+ int32_t fStandaloneNarrowWeekdaysCount;
- kDayNum = 8,
- kDayLen = 2,
+ /**
+ * Ampm strings. For example: "AM" and "PM".
+ */
+ UnicodeString* fAmPms;
+ int32_t fAmPmsCount;
- kAmPmNum = 2,
- kAmPmLen = 3,
+ /**
+ * Quarter strings. For example: "1st quarter", "2nd quarter", etc.
+ */
+ UnicodeString *fQuarters;
+ int32_t fQuartersCount;
- kEraNum = 2,
- kEraLen = 3,
+ /**
+ * Short quarters. For example: "Q1", "Q2", etc.
+ */
+ UnicodeString *fShortQuarters;
+ int32_t fShortQuartersCount;
- kZoneNum = 5,
- kZoneLen = 4
- } LastResortSize;
+ /**
+ * Standalone quarter strings. For example: "1st quarter", "2nd quarter", etc.
+ */
+ UnicodeString *fStandaloneQuarters;
+ int32_t fStandaloneQuartersCount;
- DateFormatSymbols(); // default constructor not implemented
+ /**
+ * Standalone short quarter strings. For example: "Q1", "Q2", etc.
+ */
+ UnicodeString *fStandaloneShortQuarters;
+ int32_t fStandaloneShortQuartersCount;
- void initField(UnicodeString **field, int32_t& length, const ResourceBundle data, UErrorCode &status);
- void initField(UnicodeString **field, int32_t& length, const UChar *data, LastResortSize numStr, LastResortSize strLen, UErrorCode &status);
+ /**
+ * The format data of all the timezones in this locale.
+ */
+ UnicodeString** fZoneStrings;
+ int32_t fZoneStringsRowCount;
+ int32_t fZoneStringsColCount;
+ StringEnumeration* fZoneIDEnumeration;
+ Hashtable* fZoneStringsHash;
+ UResourceBundle* fResourceBundle;
/**
- * Load data for specified 'type', falling back to gregorian if needed
- *
- * @param rb ResourceBundle
- * @param tag Resource key to data
- * @param type Calendar type
- * @param status Error Status
- * @internal
+ * Localized date-time pattern characters. For example: use 'u' as 'y'.
+ */
+ UnicodeString fLocalPatternChars;
+
+private:
+ /** valid/actual locale information
+ * these are always ICU locales, so the length should not be a problem
*/
- static ResourceBundle
- getData(ResourceBundle &rb, const char *tag, const char *type, UErrorCode& status);
+ char validLocale[ULOC_FULLNAME_CAPACITY];
+ char actualLocale[ULOC_FULLNAME_CAPACITY];
+ DateFormatSymbols(); // default constructor not implemented
/**
* Called by the constructors to actually load data from the resources
* Delete just the zone strings.
*/
void disposeZoneStrings(void);
-};
-
-inline UClassID
-DateFormatSymbols::getStaticClassID()
-{ return (UClassID)&fgClassID; }
+ /**
+ * Initializes the zoneStrings hash and keys StringEnumeration after reading the zoneStrings resource
+ */
+ void initZoneStrings(UErrorCode &status);
+ /**
+ * initialzes the zoneStrings has and keys enumeration after reading the strings[][]. Required for backwards
+ * compatibility of setZoneStrings method
+ */
+ void initZoneStrings(const UnicodeString** strings, int32_t rowCount, int32_t collumnCount, UErrorCode& status);
+ /**
+ * initialization of the fZoneStrings data member
+ */
+ void initZoneStringsArray(UErrorCode& status);
+ /**
+ * Creates a deep clone of the Hashtable
+ */
+ Hashtable* createZoneStringsHash(const Hashtable* otherHash);
+
+ /**
+ * Fetches the key from the hashtable for a given ID.
+ * e.g: for a given ID such as PST returns "Americal/Los_Angeles"
+ * Used by SimpleDateFormat class.
+ * @param ID The id of the time zone for which the key needs to be fetched
+ * @param result Output parameter to recieve the key.
+ * @return the input UnicodeString object for chaining
+ */
+ UnicodeString& getZoneID(const UnicodeString& zid, UnicodeString& result, UErrorCode& status);
+
+ /**
+ * Fetches the zone type and zone string from the hashtable for a given key.
+ * e.g: for key: "Americal/Los_Angeles", text: "2004/1/1 PT 1:00" and start:9
+ * returns TIMEZONE_SHORT_GENERIC and "PT".
+ * Used by SimpleDateFormat class.
+ * @param ID the name of the timezone
+ * @param text the string containing the time zone translation
+ * @param start The position in string where time zone string starts
+ * @param type output parameter to recieve the type of time zone string
+ * @param value output parameter to recieve the the acutal time zone string
+ */
+ void getZoneType(const UnicodeString& zid, const UnicodeString& text, int32_t start, TimeZoneTranslationType& type, UnicodeString& value, UErrorCode& status);
+
+ /**
+ * Fetches the zone type and zone string from the hashtable by cycling through all elements in the hashtable.
+ * e.g: text: "2004/1/1 PT 1:00" and start:9
+ * returns "Americal/Los_Angeles", TIMEZONE_SHORT_GENERIC and "PT". Used by SimpleDateFormat class.
+ * Used by SimpleDateFormat class.
+ * @param ID output parameter to recieve the key name of the time zone
+ * @param text the string containing the time zone translation
+ * @param start The position in string where time zone string starts
+ * @param type output parameter to recieve the type of time zone string
+ * @param value output parameter to recieve the the acutal time zone string
+ * @param status output parameter to recive the error information
+ */
+ void findZoneIDTypeValue(UnicodeString& zid, const UnicodeString& text, int32_t start, TimeZoneTranslationType& type, UnicodeString& value, UErrorCode& status);
-inline UClassID
-DateFormatSymbols::getDynamicClassID() const
-{ return DateFormatSymbols::getStaticClassID(); }
+};
U_NAMESPACE_END