]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/i18n/unicode/dtfmtsym.h
ICU-8.11.tar.gz
[apple/icu.git] / icuSources / i18n / unicode / dtfmtsym.h
index 80eb670da88a91173a962b7e7223dbe957cf763d..d758cf7728f9bdda2100271d9b0f5f717b0d9bef 100644 (file)
@@ -1,6 +1,6 @@
 /*  
 ********************************************************************************
-*   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
@@ -150,7 +156,7 @@ public:
      * subclassed.
      * @stable ICU 2.0
      */
-    ~DateFormatSymbols();
+    virtual ~DateFormatSymbols();
 
     /**
      * Return true if another object is semantically equal to this one.
@@ -187,6 +193,23 @@ public:
      */
     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.
@@ -221,6 +244,48 @@ public:
      */
     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.
@@ -229,6 +294,7 @@ public:
      */
     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)
@@ -253,6 +319,49 @@ public:
      */
     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.
@@ -274,7 +383,7 @@ public:
      * @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;
 
@@ -292,7 +401,7 @@ public:
      * @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.
@@ -310,33 +419,77 @@ public:
      */
     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
@@ -347,6 +500,12 @@ private:
     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.
      */
@@ -359,6 +518,30 @@ private:
     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.
      */
@@ -372,66 +555,82 @@ private:
     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
@@ -508,15 +707,62 @@ private:
      * 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