Home | History | Annotate | Download | only in unicode
      1 /*
      2 ******************************************************************************
      3 *
      4 *   Copyright (C) 1996-2006, International Business Machines
      5 *   Corporation and others.  All Rights Reserved.
      6 *
      7 ******************************************************************************
      8 *
      9 * File locid.h
     10 *
     11 * Created by: Helena Shih
     12 *
     13 * Modification History:
     14 *
     15 *   Date        Name        Description
     16 *   02/11/97    aliu        Changed gLocPath to fgLocPath and added methods to
     17 *                           get and set it.
     18 *   04/02/97    aliu        Made operator!= inline; fixed return value of getName().
     19 *   04/15/97    aliu        Cleanup for AIX/Win32.
     20 *   04/24/97    aliu        Numerous changes per code review.
     21 *   08/18/98    stephen     Added tokenizeString(),changed getDisplayName()
     22 *   09/08/98    stephen     Moved definition of kEmptyString for Mac Port
     23 *   11/09/99    weiv        Added const char * getName() const;
     24 *   04/12/00    srl         removing unicodestring api's and cached hash code
     25 *   08/10/01    grhoten     Change the static Locales to accessor functions
     26 ******************************************************************************
     27 */
     28 
     29 #ifndef LOCID_H
     30 #define LOCID_H
     31 
     32 #include "unicode/utypes.h"
     33 #include "unicode/uobject.h"
     34 #include "unicode/unistr.h"
     35 #include "unicode/putil.h"
     36 #include "unicode/uloc.h"
     37 #include "unicode/strenum.h"
     38 
     39 /**
     40  * \file
     41  * \brief C++ API: Locale ID object.
     42  */
     43 
     44 /**
     45  * A <code>Locale</code> object represents a specific geographical, political,
     46  * or cultural region. An operation that requires a <code>Locale</code> to perform
     47  * its task is called <em>locale-sensitive</em> and uses the <code>Locale</code>
     48  * to tailor information for the user. For example, displaying a number
     49  * is a locale-sensitive operation--the number should be formatted
     50  * according to the customs/conventions of the user's native country,
     51  * region, or culture.
     52  *
     53  * The Locale class is not suitable for subclassing.
     54  *
     55  * <P>
     56  * You can create a <code>Locale</code> object using the constructor in
     57  * this class:
     58  * \htmlonly<blockquote>\endhtmlonly
     59  * <pre>
     60  *       Locale( const   char*  language,
     61  *               const   char*  country,
     62  *               const   char*  variant);
     63  * </pre>
     64  * \htmlonly</blockquote>\endhtmlonly
     65  * The first argument to the constructors is a valid <STRONG>ISO
     66  * Language Code.</STRONG> These codes are the lower-case two-letter
     67  * codes as defined by ISO-639.
     68  * You can find a full list of these codes at:
     69  * <BR><a href ="http://www.loc.gov/standards/iso639-2/">
     70  * http://www.loc.gov/standards/iso639-2/</a>
     71  *
     72  * <P>
     73  * The second argument to the constructors is a valid <STRONG>ISO Country
     74  * Code.</STRONG> These codes are the upper-case two-letter codes
     75  * as defined by ISO-3166.
     76  * You can find a full list of these codes at a number of sites, such as:
     77  * <BR><a href="http://www.iso.org/iso/en/prods-services/iso3166ma/index.html">
     78  * http://www.iso.org/iso/en/prods-services/iso3166ma/index.html</a>
     79  *
     80  * <P>
     81  * The third constructor requires a third argument--the <STRONG>Variant.</STRONG>
     82  * The Variant codes are vendor and browser-specific.
     83  * For example, use REVISED for a langauge's revised script orthography, and POSIX for POSIX.
     84  * Where there are two variants, separate them with an underscore, and
     85  * put the most important one first. For
     86  * example, a Traditional Spanish collation might be referenced, with
     87  * "ES", "ES", "Traditional_POSIX".
     88  *
     89  * <P>
     90  * Because a <code>Locale</code> object is just an identifier for a region,
     91  * no validity check is performed when you construct a <code>Locale</code>.
     92  * If you want to see whether particular resources are available for the
     93  * <code>Locale</code> you construct, you must query those resources. For
     94  * example, ask the <code>NumberFormat</code> for the locales it supports
     95  * using its <code>getAvailableLocales</code> method.
     96  * <BR><STRONG>Note:</STRONG> When you ask for a resource for a particular
     97  * locale, you get back the best available match, not necessarily
     98  * precisely what you asked for. For more information, look at
     99  * <code>ResourceBundle</code>.
    100  *
    101  * <P>
    102  * The <code>Locale</code> class provides a number of convenient constants
    103  * that you can use to create <code>Locale</code> objects for commonly used
    104  * locales. For example, the following refers to a <code>Locale</code> object
    105  * for the United States:
    106  * \htmlonly<blockquote>\endhtmlonly
    107  * <pre>
    108  *       Locale::getUS()
    109  * </pre>
    110  * \htmlonly</blockquote>\endhtmlonly
    111  *
    112  * <P>
    113  * Once you've created a <code>Locale</code> you can query it for information about
    114  * itself. Use <code>getCountry</code> to get the ISO Country Code and
    115  * <code>getLanguage</code> to get the ISO Language Code. You can
    116  * use <code>getDisplayCountry</code> to get the
    117  * name of the country suitable for displaying to the user. Similarly,
    118  * you can use <code>getDisplayLanguage</code> to get the name of
    119  * the language suitable for displaying to the user. Interestingly,
    120  * the <code>getDisplayXXX</code> methods are themselves locale-sensitive
    121  * and have two versions: one that uses the default locale and one
    122  * that takes a locale as an argument and displays the name or country in
    123  * a language appropriate to that locale.
    124  *
    125  * <P>
    126  * ICU provides a number of classes that perform locale-sensitive
    127  * operations. For example, the <code>NumberFormat</code> class formats
    128  * numbers, currency, or percentages in a locale-sensitive manner. Classes
    129  * such as <code>NumberFormat</code> have a number of convenience methods
    130  * for creating a default object of that type. For example, the
    131  * <code>NumberFormat</code> class provides these three convenience methods
    132  * for creating a default <code>NumberFormat</code> object:
    133  * \htmlonly<blockquote>\endhtmlonly
    134  * <pre>
    135  *     UErrorCode success = U_ZERO_ERROR;
    136  *     Locale myLocale;
    137  *     NumberFormat *nf;
    138  *
    139  *     nf = NumberFormat::createInstance( success );          delete nf;
    140  *     nf = NumberFormat::createCurrencyInstance( success );  delete nf;
    141  *     nf = NumberFormat::createPercentInstance( success );   delete nf;
    142  * </pre>
    143  * \htmlonly</blockquote>\endhtmlonly
    144  * Each of these methods has two variants; one with an explicit locale
    145  * and one without; the latter using the default locale.
    146  * \htmlonly<blockquote>\endhtmlonly
    147  * <pre>
    148  *     nf = NumberFormat::createInstance( myLocale, success );          delete nf;
    149  *     nf = NumberFormat::createCurrencyInstance( myLocale, success );  delete nf;
    150  *     nf = NumberFormat::createPercentInstance( myLocale, success );   delete nf;
    151  * </pre>
    152  * \htmlonly</blockquote>\endhtmlonly
    153  * A <code>Locale</code> is the mechanism for identifying the kind of object
    154  * (<code>NumberFormat</code>) that you would like to get. The locale is
    155  * <STRONG>just</STRONG> a mechanism for identifying objects,
    156  * <STRONG>not</STRONG> a container for the objects themselves.
    157  *
    158  * <P>
    159  * Each class that performs locale-sensitive operations allows you
    160  * to get all the available objects of that type. You can sift
    161  * through these objects by language, country, or variant,
    162  * and use the display names to present a menu to the user.
    163  * For example, you can create a menu of all the collation objects
    164  * suitable for a given language. Such classes implement these
    165  * three class methods:
    166  * \htmlonly<blockquote>\endhtmlonly
    167  * <pre>
    168  *       static Locale* getAvailableLocales(int32_t& numLocales)
    169  *       static UnicodeString& getDisplayName(const Locale&  objectLocale,
    170  *                                            const Locale&  displayLocale,
    171  *                                            UnicodeString& displayName)
    172  *       static UnicodeString& getDisplayName(const Locale&  objectLocale,
    173  *                                            UnicodeString& displayName)
    174  * </pre>
    175  * \htmlonly</blockquote>\endhtmlonly
    176  *
    177  * @stable ICU 2.0
    178  * @see ResourceBundle
    179  */
    180 U_NAMESPACE_BEGIN
    181 class U_COMMON_API Locale : public UObject {
    182 public:
    183     /** Useful constant for this language. @stable ICU 2.0 */
    184     static const Locale &U_EXPORT2 getEnglish(void);
    185     /** Useful constant for this language. @stable ICU 2.0 */
    186     static const Locale &U_EXPORT2 getFrench(void);
    187     /** Useful constant for this language. @stable ICU 2.0 */
    188     static const Locale &U_EXPORT2 getGerman(void);
    189     /** Useful constant for this language. @stable ICU 2.0 */
    190     static const Locale &U_EXPORT2 getItalian(void);
    191     /** Useful constant for this language. @stable ICU 2.0 */
    192     static const Locale &U_EXPORT2 getJapanese(void);
    193     /** Useful constant for this language. @stable ICU 2.0 */
    194     static const Locale &U_EXPORT2 getKorean(void);
    195     /** Useful constant for this language. @stable ICU 2.0 */
    196     static const Locale &U_EXPORT2 getChinese(void);
    197     /** Useful constant for this language. @stable ICU 2.0 */
    198     static const Locale &U_EXPORT2 getSimplifiedChinese(void);
    199     /** Useful constant for this language. @stable ICU 2.0 */
    200     static const Locale &U_EXPORT2 getTraditionalChinese(void);
    201 
    202     /** Useful constant for this country/region. @stable ICU 2.0 */
    203     static const Locale &U_EXPORT2 getFrance(void);
    204     /** Useful constant for this country/region. @stable ICU 2.0 */
    205     static const Locale &U_EXPORT2 getGermany(void);
    206     /** Useful constant for this country/region. @stable ICU 2.0 */
    207     static const Locale &U_EXPORT2 getItaly(void);
    208     /** Useful constant for this country/region. @stable ICU 2.0 */
    209     static const Locale &U_EXPORT2 getJapan(void);
    210     /** Useful constant for this country/region. @stable ICU 2.0 */
    211     static const Locale &U_EXPORT2 getKorea(void);
    212     /** Useful constant for this country/region. @stable ICU 2.0 */
    213     static const Locale &U_EXPORT2 getChina(void);
    214     /** Useful constant for this country/region. @stable ICU 2.0 */
    215     static const Locale &U_EXPORT2 getPRC(void);
    216     /** Useful constant for this country/region. @stable ICU 2.0 */
    217     static const Locale &U_EXPORT2 getTaiwan(void);
    218     /** Useful constant for this country/region. @stable ICU 2.0 */
    219     static const Locale &U_EXPORT2 getUK(void);
    220     /** Useful constant for this country/region. @stable ICU 2.0 */
    221     static const Locale &U_EXPORT2 getUS(void);
    222     /** Useful constant for this country/region. @stable ICU 2.0 */
    223     static const Locale &U_EXPORT2 getCanada(void);
    224     /** Useful constant for this country/region. @stable ICU 2.0 */
    225     static const Locale &U_EXPORT2 getCanadaFrench(void);
    226 
    227 
    228     /**
    229      * Construct a default locale object, a Locale for the default locale ID.
    230      *
    231      * @see getDefault
    232      * @see uloc_getDefault
    233      * @stable ICU 2.0
    234      */
    235     Locale();
    236 
    237     /**
    238      * Construct a locale from language, country, variant.
    239      * If an error occurs, then the constructed object will be "bogus"
    240      * (isBogus() will return TRUE).
    241      *
    242      * @param language Lowercase two-letter or three-letter ISO-639 code.
    243      *  This parameter can instead be an ICU style C locale (e.g. "en_US"),
    244      *  but the other parameters must not be used.
    245      *  This parameter can be NULL; if so,
    246      *  the locale is initialized to match the current default locale.
    247      *  (This is the same as using the default constructor.)
    248      *  Please note: The Java Locale class does NOT accept the form
    249      *  'new Locale("en_US")' but only 'new Locale("en","US")'
    250      *
    251      * @param country  Uppercase two-letter ISO-3166 code. (optional)
    252      * @param variant  Uppercase vendor and browser specific code. See class
    253      *                 description. (optional)
    254      * @param keywordsAndValues A string consisting of keyword/values pairs, such as
    255      *                 "collation=phonebook;currency=euro"
    256      *
    257      * @see getDefault
    258      * @see uloc_getDefault
    259      * @stable ICU 2.0
    260      */
    261     Locale( const   char * language,
    262             const   char * country  = 0,
    263             const   char * variant  = 0,
    264             const   char * keywordsAndValues = 0);
    265 
    266     /**
    267      * Initializes a Locale object from another Locale object.
    268      *
    269      * @param other The Locale object being copied in.
    270      * @stable ICU 2.0
    271      */
    272     Locale(const    Locale& other);
    273 
    274 
    275     /**
    276      * Destructor
    277      * @stable ICU 2.0
    278      */
    279     virtual ~Locale() ;
    280 
    281     /**
    282      * Replaces the entire contents of *this with the specified value.
    283      *
    284      * @param other The Locale object being copied in.
    285      * @return      *this
    286      * @stable ICU 2.0
    287      */
    288     Locale& operator=(const Locale& other);
    289 
    290     /**
    291      * Checks if two locale keys are the same.
    292      *
    293      * @param other The locale key object to be compared with this.
    294      * @return      True if the two locale keys are the same, false otherwise.
    295      * @stable ICU 2.0
    296      */
    297     UBool   operator==(const    Locale&     other) const;
    298 
    299     /**
    300      * Checks if two locale keys are not the same.
    301      *
    302      * @param other The locale key object to be compared with this.
    303      * @return      True if the two locale keys are not the same, false
    304      *              otherwise.
    305      * @stable ICU 2.0
    306      */
    307     UBool   operator!=(const    Locale&     other) const;
    308 
    309     /**
    310      * Clone this object.
    311      * Clones can be used concurrently in multiple threads.
    312      * If an error occurs, then NULL is returned.
    313      * The caller must delete the clone.
    314      *
    315      * @return a clone of this object
    316      *
    317      * @see getDynamicClassID
    318      * @stable ICU 2.8
    319      */
    320     Locale *clone() const;
    321 
    322     /**
    323      * Common methods of getting the current default Locale. Used for the
    324      * presentation: menus, dialogs, etc. Generally set once when your applet or
    325      * application is initialized, then never reset. (If you do reset the
    326      * default locale, you probably want to reload your GUI, so that the change
    327      * is reflected in your interface.)
    328      *
    329      * More advanced programs will allow users to use different locales for
    330      * different fields, e.g. in a spreadsheet.
    331      *
    332      * Note that the initial setting will match the host system.
    333      * @return a reference to the Locale object for the default locale ID
    334      * @system
    335      * @stable ICU 2.0
    336      */
    337     static const Locale& U_EXPORT2 getDefault(void);
    338 
    339     /**
    340      * Sets the default. Normally set once at the beginning of a process,
    341      * then never reset.
    342      * setDefault() only changes ICU's default locale ID, <strong>not</strong>
    343      * the default locale ID of the runtime environment.
    344      *
    345      * @param newLocale Locale to set to.  If NULL, set to the value obtained
    346      *                  from the runtime environement.
    347      * @param success The error code.
    348      * @system
    349      * @stable ICU 2.0
    350      */
    351     static void U_EXPORT2 setDefault(const Locale& newLocale,
    352                                      UErrorCode&   success);
    353 
    354     /**
    355      * Creates a locale which has had minimal canonicalization
    356      * as per uloc_getName().
    357      * @param name The name to create from.  If name is null,
    358      *  the default Locale is used.
    359      * @return new locale object
    360      * @stable ICU 2.0
    361      * @see uloc_getName
    362      */
    363     static Locale U_EXPORT2 createFromName(const char *name);
    364 
    365     /**
    366      * Creates a locale from the given string after canonicalizing
    367      * the string by calling uloc_canonicalize().
    368      * @param name the locale ID to create from.  Must not be NULL.
    369      * @return a new locale object corresponding to the given name
    370      * @stable ICU 3.0
    371      * @see uloc_canonicalize
    372      */
    373     static Locale U_EXPORT2 createCanonical(const char* name);
    374 
    375     /**
    376      * Returns the locale's ISO-639 language code.
    377      * @return      An alias to the code
    378      * @stable ICU 2.0
    379      */
    380     inline const char *  getLanguage( ) const;
    381 
    382     /**
    383      * Returns the locale's ISO-15924 abbreviation script code.
    384      * @return      An alias to the code
    385      * @see uscript_getShortName
    386      * @see uscript_getCode
    387      * @stable ICU 2.8
    388      */
    389     inline const char *  getScript( ) const;
    390 
    391     /**
    392      * Returns the locale's ISO-3166 country code.
    393      * @return      An alias to the code
    394      * @stable ICU 2.0
    395      */
    396     inline const char *  getCountry( ) const;
    397 
    398     /**
    399      * Returns the locale's variant code.
    400      * @return      An alias to the code
    401      * @stable ICU 2.0
    402      */
    403     inline const char *  getVariant( ) const;
    404 
    405     /**
    406      * Returns the programmatic name of the entire locale, with the language,
    407      * country and variant separated by underbars. If a field is missing, up
    408      * to two leading underbars will occur. Example: "en", "de_DE", "en_US_WIN",
    409      * "de__POSIX", "fr__MAC", "__MAC", "_MT", "_FR_EURO"
    410      * @return      A pointer to "name".
    411      * @stable ICU 2.0
    412      */
    413     inline const char * getName() const;
    414 
    415     /**
    416      * Returns the programmatic name of the entire locale as getName would return,
    417      * but without keywords.
    418      * @return      A pointer to "name".
    419      * @see getName
    420      * @stable ICU 2.8
    421      */
    422     const char * getBaseName() const;
    423 
    424 
    425     /**
    426      * Gets the list of keywords for the specified locale.
    427      *
    428      * @return pointer to StringEnumeration class. Client must dispose of it by calling delete.
    429      * @param status Returns any error information while performing this operation.
    430      * @stable ICU 2.8
    431      */
    432     StringEnumeration * createKeywords(UErrorCode &status) const;
    433 
    434     /**
    435      * Get the value for a keyword.
    436      *
    437      * @param keywordName name of the keyword for which we want the value. Case insensitive.
    438      * @param status Returns any error information while performing this operation.
    439      * @param buffer The buffer to receive the keyword value.
    440      * @param bufferCapacity The capacity of receiving buffer
    441      * @return the length of keyword value
    442      *
    443      * @stable ICU 2.8
    444      */
    445     int32_t getKeywordValue(const char* keywordName, char *buffer, int32_t bufferCapacity, UErrorCode &status) const;
    446 
    447     /**
    448      * returns the locale's three-letter language code, as specified
    449      * in ISO draft standard ISO-639-2.
    450      * @return      An alias to the code, or NULL
    451      * @stable ICU 2.0
    452      */
    453     const char * getISO3Language() const;
    454 
    455     /**
    456      * Fills in "name" with the locale's three-letter ISO-3166 country code.
    457      * @return      An alias to the code, or NULL
    458      * @stable ICU 2.0
    459      */
    460     const char * getISO3Country() const;
    461 
    462     /**
    463      * Returns the Windows LCID value corresponding to this locale.
    464      * This value is stored in the resource data for the locale as a one-to-four-digit
    465      * hexadecimal number.  If the resource is missing, in the wrong format, or
    466      * there is no Windows LCID value that corresponds to this locale, returns 0.
    467      * @stable ICU 2.0
    468      */
    469     uint32_t        getLCID(void) const;
    470 
    471     /**
    472      * Fills in "dispLang" with the name of this locale's language in a format suitable for
    473      * user display in the default locale.  For example, if the locale's language code is
    474      * "fr" and the default locale's language code is "en", this function would set
    475      * dispLang to "French".
    476      * @param dispLang  Receives the language's display name.
    477      * @return          A reference to "dispLang".
    478      * @stable ICU 2.0
    479      */
    480     UnicodeString&  getDisplayLanguage(UnicodeString&   dispLang) const;
    481 
    482     /**
    483      * Fills in "dispLang" with the name of this locale's language in a format suitable for
    484      * user display in the locale specified by "displayLocale".  For example, if the locale's
    485      * language code is "en" and displayLocale's language code is "fr", this function would set
    486      * dispLang to "Anglais".
    487      * @param displayLocale  Specifies the locale to be used to display the name.  In other words,
    488      *                  if the locale's language code is "en", passing Locale::getFrench() for
    489      *                  displayLocale would result in "Anglais", while passing Locale::getGerman()
    490      *                  for displayLocale would result in "Englisch".
    491      * @param dispLang  Receives the language's display name.
    492      * @return          A reference to "dispLang".
    493      * @stable ICU 2.0
    494      */
    495     UnicodeString&  getDisplayLanguage( const   Locale&         displayLocale,
    496                                                 UnicodeString&  dispLang) const;
    497 
    498     /**
    499      * Fills in "dispScript" with the name of this locale's script in a format suitable
    500      * for user display in the default locale.  For example, if the locale's script code
    501      * is "LATN" and the default locale's language code is "en", this function would set
    502      * dispScript to "Latin".
    503      * @param dispScript    Receives the scripts's display name.
    504      * @return              A reference to "dispScript".
    505      * @stable ICU 2.8
    506      */
    507     UnicodeString&  getDisplayScript(          UnicodeString& dispScript) const;
    508 
    509     /**
    510      * Fills in "dispScript" with the name of this locale's country in a format suitable
    511      * for user display in the locale specified by "displayLocale".  For example, if the locale's
    512      * script code is "LATN" and displayLocale's language code is "en", this function would set
    513      * dispScript to "Latin".
    514      * @param displayLocale      Specifies the locale to be used to display the name.  In other
    515      *                      words, if the locale's script code is "LATN", passing
    516      *                      Locale::getFrench() for displayLocale would result in "", while
    517      *                      passing Locale::getGerman() for displayLocale would result in
    518      *                      "".
    519      * @param dispScript    Receives the scripts's display name.
    520      * @return              A reference to "dispScript".
    521      * @stable ICU 2.8
    522      */
    523     UnicodeString&  getDisplayScript(  const   Locale&         displayLocale,
    524                                                UnicodeString&  dispScript) const;
    525 
    526     /**
    527      * Fills in "dispCountry" with the name of this locale's country in a format suitable
    528      * for user display in the default locale.  For example, if the locale's country code
    529      * is "FR" and the default locale's language code is "en", this function would set
    530      * dispCountry to "France".
    531      * @param dispCountry   Receives the country's display name.
    532      * @return              A reference to "dispCountry".
    533      * @stable ICU 2.0
    534      */
    535     UnicodeString&  getDisplayCountry(          UnicodeString& dispCountry) const;
    536 
    537     /**
    538      * Fills in "dispCountry" with the name of this locale's country in a format suitable
    539      * for user display in the locale specified by "displayLocale".  For example, if the locale's
    540      * country code is "US" and displayLocale's language code is "fr", this function would set
    541      * dispCountry to "&Eacute;tats-Unis".
    542      * @param displayLocale      Specifies the locale to be used to display the name.  In other
    543      *                      words, if the locale's country code is "US", passing
    544      *                      Locale::getFrench() for displayLocale would result in "&Eacute;tats-Unis", while
    545      *                      passing Locale::getGerman() for displayLocale would result in
    546      *                      "Vereinigte Staaten".
    547      * @param dispCountry   Receives the country's display name.
    548      * @return              A reference to "dispCountry".
    549      * @stable ICU 2.0
    550      */
    551     UnicodeString&  getDisplayCountry(  const   Locale&         displayLocale,
    552                                                 UnicodeString&  dispCountry) const;
    553 
    554     /**
    555      * Fills in "dispVar" with the name of this locale's variant code in a format suitable
    556      * for user display in the default locale.
    557      * @param dispVar   Receives the variant's name.
    558      * @return          A reference to "dispVar".
    559      * @stable ICU 2.0
    560      */
    561     UnicodeString&  getDisplayVariant(      UnicodeString& dispVar) const;
    562 
    563     /**
    564      * Fills in "dispVar" with the name of this locale's variant code in a format
    565      * suitable for user display in the locale specified by "displayLocale".
    566      * @param displayLocale  Specifies the locale to be used to display the name.
    567      * @param dispVar   Receives the variant's display name.
    568      * @return          A reference to "dispVar".
    569      * @stable ICU 2.0
    570      */
    571     UnicodeString&  getDisplayVariant(  const   Locale&         displayLocale,
    572                                                 UnicodeString&  dispVar) const;
    573 
    574     /**
    575      * Fills in "name" with the name of this locale in a format suitable for user display
    576      * in the default locale.  This function uses getDisplayLanguage(), getDisplayCountry(),
    577      * and getDisplayVariant() to do its work, and outputs the display name in the format
    578      * "language (country[,variant])".  For example, if the default locale is en_US, then
    579      * fr_FR's display name would be "French (France)", and es_MX_Traditional's display name
    580      * would be "Spanish (Mexico,Traditional)".
    581      * @param name  Receives the locale's display name.
    582      * @return      A reference to "name".
    583      * @stable ICU 2.0
    584      */
    585     UnicodeString&  getDisplayName(         UnicodeString&  name) const;
    586 
    587     /**
    588      * Fills in "name" with the name of this locale in a format suitable for user display
    589      * in the locale specfied by "displayLocale".  This function uses getDisplayLanguage(),
    590      * getDisplayCountry(), and getDisplayVariant() to do its work, and outputs the display
    591      * name in the format "language (country[,variant])".  For example, if displayLocale is
    592      * fr_FR, then en_US's display name would be "Anglais (&Eacute;tats-Unis)", and no_NO_NY's
    593      * display name would be "norv&eacute;gien (Norv&egrave;ge,NY)".
    594      * @param displayLocale  Specifies the locale to be used to display the name.
    595      * @param name      Receives the locale's display name.
    596      * @return          A reference to "name".
    597      * @stable ICU 2.0
    598      */
    599     UnicodeString&  getDisplayName( const   Locale&         displayLocale,
    600                                             UnicodeString&  name) const;
    601 
    602     /**
    603      * Generates a hash code for the locale.
    604      * @stable ICU 2.0
    605      */
    606     int32_t         hashCode(void) const;
    607 
    608     /**
    609      * Sets the locale to bogus
    610      * A bogus locale represents a non-existing locale associated
    611      * with services that can be instantiated from non-locale data
    612      * in addition to locale (for example, collation can be
    613      * instantiated from a locale and from a rule set).
    614      * @stable ICU 2.1
    615      */
    616     void setToBogus();
    617 
    618     /**
    619      * Gets the bogus state. Locale object can be bogus if it doesn't exist
    620      * @return FALSE if it is a real locale, TRUE if it is a bogus locale
    621      * @stable ICU 2.1
    622      */
    623     UBool isBogus(void) const;
    624 
    625     /**
    626      * Returns a list of all installed locales.
    627      * @param count Receives the number of locales in the list.
    628      * @return      A pointer to an array of Locale objects.  This array is the list
    629      *              of all locales with installed resource files.  The called does NOT
    630      *              get ownership of this list, and must NOT delete it.
    631      * @stable ICU 2.0
    632      */
    633     static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
    634 
    635     /**
    636      * Gets a list of all available 2-letter country codes defined in ISO 639.  This is a
    637      * pointer to an array of pointers to arrays of char.  All of these pointers are
    638      * owned by ICU-- do not delete them, and do not write through them.  The array is
    639      * terminated with a null pointer.
    640      * @return a list of all available country codes
    641      * @stable ICU 2.0
    642      */
    643     static const char* const* U_EXPORT2 getISOCountries();
    644 
    645     /**
    646      * Gets a list of all available language codes defined in ISO 639.  This is a pointer
    647      * to an array of pointers to arrays of char.  All of these pointers are owned
    648      * by ICU-- do not delete them, and do not write through them.  The array is
    649      * terminated with a null pointer.
    650      * @return a list of all available language codes
    651      * @stable ICU 2.0
    652      */
    653     static const char* const* U_EXPORT2 getISOLanguages();
    654 
    655     /**
    656      * ICU "poor man's RTTI", returns a UClassID for this class.
    657      *
    658      * @stable ICU 2.2
    659      */
    660     static UClassID U_EXPORT2 getStaticClassID();
    661 
    662     /**
    663      * ICU "poor man's RTTI", returns a UClassID for the actual class.
    664      *
    665      * @stable ICU 2.2
    666      */
    667     virtual UClassID getDynamicClassID() const;
    668 
    669 protected: /* only protected for testing purposes. DO NOT USE. */
    670     /**
    671      * Set this from a single POSIX style locale string.
    672      * @internal
    673      */
    674     void setFromPOSIXID(const char *posixID);
    675 
    676 private:
    677     /**
    678      * Initialize the locale object with a new name.
    679      * Was deprecated - used in implementation - moved internal
    680      *
    681      * @param cLocaleID The new locale name.
    682      */
    683     Locale& init(const char* cLocaleID, UBool canonicalize);
    684 
    685     /*
    686      * Internal constructor to allow construction of a locale object with
    687      *   NO side effects.   (Default constructor tries to get
    688      *   the default locale.)
    689      */
    690     enum ELocaleType {
    691         eBOGUS
    692     };
    693     Locale(ELocaleType);
    694 
    695     /**
    696      * Initialize the locale cache for commonly used locales
    697      */
    698     static Locale *getLocaleCache(void);
    699 
    700     char language[ULOC_LANG_CAPACITY];
    701     char script[ULOC_SCRIPT_CAPACITY];
    702     char country[ULOC_COUNTRY_CAPACITY];
    703     int32_t variantBegin;
    704     char* fullName;
    705     char fullNameBuffer[ULOC_FULLNAME_CAPACITY];
    706     // name without keywords
    707     char* baseName;
    708     char baseNameBuffer[ULOC_FULLNAME_CAPACITY];
    709 
    710     UBool fIsBogus;
    711 
    712     static const Locale &getLocale(int locid);
    713 
    714     /**
    715      * A friend to allow the default locale to be set by either the C or C++ API.
    716      * @internal
    717      */
    718     friend void locale_set_default_internal(const char *);
    719 };
    720 
    721 inline UBool
    722 Locale::operator!=(const    Locale&     other) const
    723 {
    724     return !operator==(other);
    725 }
    726 
    727 inline const char *
    728 Locale::getCountry() const
    729 {
    730     return country;
    731 }
    732 
    733 inline const char *
    734 Locale::getLanguage() const
    735 {
    736     return language;
    737 }
    738 
    739 inline const char *
    740 Locale::getScript() const
    741 {
    742     return script;
    743 }
    744 
    745 inline const char *
    746 Locale::getVariant() const
    747 {
    748     return &fullName[variantBegin];
    749 }
    750 
    751 inline const char *
    752 Locale::getName() const
    753 {
    754     return fullName;
    755 }
    756 
    757 inline UBool
    758 Locale::isBogus(void) const {
    759     return fIsBogus;
    760 }
    761 
    762 U_NAMESPACE_END
    763 
    764 #endif
    765 
    766