• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 *
getCountry()728 Locale::getCountry() const
729 {
730     return country;
731 }
732 
733 inline const char *
getLanguage()734 Locale::getLanguage() const
735 {
736     return language;
737 }
738 
739 inline const char *
getScript()740 Locale::getScript() const
741 {
742     return script;
743 }
744 
745 inline const char *
getVariant()746 Locale::getVariant() const
747 {
748     return &fullName[variantBegin];
749 }
750 
751 inline const char *
getName()752 Locale::getName() const
753 {
754     return fullName;
755 }
756 
757 inline UBool
isBogus(void)758 Locale::isBogus(void) const {
759     return fIsBogus;
760 }
761 
762 U_NAMESPACE_END
763 
764 #endif
765 
766