Coverage Report

Created: 2025-07-11 06:23

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