Locale object represents a specific geographical, political,
or cultural region. An operation that requires a Locale to perform
its task is called locale-sensitive and uses the Locale
to tailor information for the user. For example, displaying a number
is a locale-sensitive operation— the number should be formatted
according to the customs and conventions of the user's native country,
region, or culture.
The Locale class implements identifiers
interchangeable with BCP 47 (IETF BCP 47, "Tags for Identifying
Languages"), with support for the LDML (UTS#35, "Unicode Locale
Data Markup Language") BCP 47-compatible extensions for locale data
exchange.
A Locale object logically consists of the fields
described below.
Locale always canonicalizes to lower case.[a-zA-Z]{2,8}. Note that this is not the the full
BCP47 language production, since it excludes extlang. They are
not needed since modern three-letter language codes replace
them.Locale always canonicalizes to title case (the first
letter is upper case and the rest of the letters are lower
case).[a-zA-Z]{4}Locale always canonicalizes to upper case.[a-zA-Z]{2} | [0-9]{3}Locale. Where there are two or more variant values
each indicating its own semantics, these values should be ordered
by importance, with most important first, separated by
underscore('_'). The variant field is case sensitive.However, the variant field in Locale has
historically been used for any kind of variation, not just
language variations. For example, some supported variants
available in Java SE Runtime Environments indicate alternative
cultural behaviors such as calendar type or number script. In
BCP 47 this kind of information, which does not identify the
language, is supported by extension subtags or private use
subtags.
SUBTAG
(('_'|'-') SUBTAG)* where SUBTAG =
[0-9][0-9a-zA-Z]{3} | [0-9a-zA-Z]{5,8}. (Note: BCP 47 only
uses hyphen ('-') as a delimiter, this is more lenient).Locale implement the semantics and syntax of BCP 47
extension subtags and private use subtags. The extensions are
case insensitive, but Locale canonicalizes all
extension keys and values to lower case. Note that extensions
cannot have empty values.[0-9a-zA-Z]. Well-formed values have the form
SUBTAG ('-' SUBTAG)* where for the key 'x'
SUBTAG = [0-9a-zA-Z]{1,8} and for other keys
SUBTAG = [0-9a-zA-Z]{2,8} (that is, 'x' allows
single-character subtags).Locale class
does not provide any validation features. The Builder
only checks if an individual field satisfies the syntactic
requirement (is well-formed), but does not validate the value
itself. See Locale.Builder for details.
UTS#35, "Unicode Locale Data Markup Language" defines optional attributes and keywords to override or refine the default behavior associated with a locale. A keyword is represented by a pair of key and type. For example, "nu-thai" indicates that Thai local digits (value:"thai") should be used for formatting numbers (key:"nu").
The keywords are mapped to a BCP 47 extension value using the
extension key 'u' (). The above
example, "nu-thai", becomes the extension "u-nu-thai".code
UNICODE_LOCALE_EXTENSION
Thus, when a Locale object contains Unicode locale
attributes and keywords,
getExtension(UNICODE_LOCALE_EXTENSION) will return a
String representing this information, for example, "nu-thai". The
Locale class also provides , getUnicodeLocaleAttributes(), and
getUnicodeLocaleKeys() which allow you to access Unicode
locale attributes and key/type pairs directly. When represented as
a string, the Unicode Locale Extension lists attributes
alphabetically, followed by key/type sequences with keys listed
alphabetically (the order of subtags comprising a key's type is
fixed when the type is defined)
getUnicodeLocaleType(java.lang.String)
A well-formed locale key has the form
[0-9a-zA-Z]{2}. A well-formed locale type has the
form "" | [0-9a-zA-Z]{3,8} ('-' [0-9a-zA-Z]{3,8})* (it
can be empty, or a series of subtags 3-8 alphanums in length). A
well-formed locale attribute has the form
[0-9a-zA-Z]{3,8} (it is a single subtag with the same
form as a locale type subtag).
The Unicode locale extension specifies optional behavior in locale-sensitive services. Although the LDML specification defines various keys and values, actual locale-sensitive service implementations in a Java Runtime Environment might not support any particular Unicode locale attributes or key/type pairs.
There are several different ways to create a Locale
object.
Using you can construct a Locale.BuilderLocale object
that conforms to BCP 47 syntax.
The Locale class provides three constructors:
Locale(java.lang.String)
Locale(java.lang.String,java.lang.String)
Locale(java.lang.String,java.lang.String,java.lang.String)
These constructors allow you to create a Locale object
with language, country and variant, but you cannot specify
script or extensions.
The method creates a forLanguageTag(java.lang.String)Locale
object for a well-formed BCP 47 language tag.
The Locale class provides a number of convenient constants
that you can use to create Locale objects for commonly used
locales. For example, the following creates a Locale object
for the United States:
Locale.US
Once you've created a Locale you can query it for information
about itself. Use getCountry to get the country (or region)
code and getLanguage to get the language code.
You can use getDisplayCountry to get the
name of the country suitable for displaying to the user. Similarly,
you can use getDisplayLanguage to get the name of
the language suitable for displaying to the user. Interestingly,
the getDisplayXXX methods are themselves locale-sensitive
and have two versions: one that uses the default locale and one
that uses the locale specified as an argument.
The Java Platform provides a number of classes that perform locale-sensitive
operations. For example, the NumberFormat class formats
numbers, currency, and percentages in a locale-sensitive manner. Classes
such as NumberFormat have several convenience methods
for creating a default object of that type. For example, the
NumberFormat class provides these three convenience methods
for creating a default NumberFormat object:
NumberFormat.getInstance()
NumberFormat.getCurrencyInstance()
NumberFormat.getPercentInstance()
Each of these methods has two variants; one with an explicit locale
and one without; the latter uses the default locale:
NumberFormat.getInstance(myLocale)
NumberFormat.getCurrencyInstance(myLocale)
NumberFormat.getPercentInstance(myLocale)
A Locale is the mechanism for identifying the kind of object
(NumberFormat) that you would like to get. The locale is
just a mechanism for identifying objects,
not a container for the objects themselves.
In order to maintain compatibility with existing usage, Locale's
constructors retain their behavior prior to the Java Runtime
Environment version 1.7. The same is largely true for the
toString method. Thus Locale objects can continue to
be used as they were. In particular, clients who parse the output
of toString into language, country, and variant fields can continue
to do so (although this is strongly discouraged), although the
variant field will have additional information in it if script or
extensions are present.
In addition, BCP 47 imposes syntax restrictions that are not
imposed by Locale's constructors. This means that conversions
between some Locales and BCP 47 language tags cannot be made without
losing information. Thus toLanguageTag cannot
represent the state of locales whose language, country, or variant
do not conform to BCP 47.
Because of these issues, it is recommended that clients migrate
away from constructing non-conforming locales and use the
forLanguageTag and Locale.Builder APIs instead.
Clients desiring a string representation of the complete locale can
then always rely on toLanguageTag for this purpose.
For compatibility reasons, two non-conforming locales are treated as special cases. These are ja_JP_JP and th_TH_TH. These are ill-formed in BCP 47 since the variants are too short. To ease migration to BCP 47, these are treated specially during construction. These two cases (and only these) cause a constructor to generate an extension, all other values behave exactly as they did prior to Java 7.
Java has used ja_JP_JP to represent Japanese as used in Japan together with the Japanese Imperial calendar. This is now representable using a Unicode locale extension, by specifying the Unicode locale key ca (for "calendar") and type japanese. When the Locale constructor is called with the arguments "ja", "JP", "JP", the extension "u-ca-japanese" is automatically added.
Java has used th_TH_TH to represent Thai as used in Thailand together with Thai digits. This is also now representable using a Unicode locale extension, by specifying the Unicode locale key nu (for "number") and value thai. When the Locale constructor is called with the arguments "th", "TH", "TH", the extension "u-nu-thai" is automatically added.
During serialization, writeObject writes all fields to the output stream, including extensions.
During deserialization, readResolve adds extensions as described in Special Cases, only for the two cases th_TH_TH and ja_JP_JP.
Locale's constructor has always converted three language codes to their earlier, obsoleted forms: he maps to iw, yi maps to ji, and id maps to in. This continues to be the case, in order to not break backwards compatibility.
The APIs added in 1.7 map between the old and new language codes,
maintaining the old codes internal to Locale (so that
getLanguage and toString reflect the old
code), but using the new codes in the BCP 47 language tag APIs (so
that toLanguageTag reflects the new one). This
preserves the equivalence between Locales no matter which code or
API is used to construct them. Java's default resource bundle
lookup mechanism also implements this mapping, so that resources
can be named using either convention, see .
ResourceBundle.Control
The Locale constructors have always specified that the language and the country param be two characters in length, although in practice they have accepted any length. The specification has now been relaxed to allow language codes of two to eight characters and country (region) codes of two to three characters, and in particular, three-letter language codes and three-digit region codes as specified in the IANA Language Subtag Registry. For compatibility, the implementation still does not impose a length constraint.
Locale.BuilderResourceBundlejava.text.Formatjava.text.NumberFormatjava.text.CollatorgetExtension(char)Locale.Builder.setExtension(char,java.lang.String)getExtension(char)Locale.Builder.setExtension(char,java.lang.String)Note:
language An ISO 639 alpha-2 or alpha-3 language code, or a language subtag
up to 8 characters in length. See the Locale class description about
valid language values.country An ISO 3166 alpha-2 country code or a UN M.49 numeric-3 area code.
See the Locale class description about valid country values.variant Any arbitrary value used to indicate a variation of a Locale.
See the Locale class description for the details.java.lang.NullPointerException thrown if any argument is null.Note:
language An ISO 639 alpha-2 or alpha-3 language code, or a language subtag
up to 8 characters in length. See the Locale class description about
valid language values.country An ISO 3166 alpha-2 country code or a UN M.49 numeric-3 area code.
See the Locale class description about valid country values.java.lang.NullPointerException thrown if either argument is null.Note:
language An ISO 639 alpha-2 or alpha-3 language code, or a language subtag
up to 8 characters in length. See the Locale class description about
valid language values.java.lang.NullPointerException thrown if argument is null.Locale constructed from the given
language, country and
variant. If the same Locale instance
is available in the cache, then that instance is
returned. Otherwise, a new Locale instance is
created and cached.
language lowercase 2 to 8 language code.country uppercase two-letter ISO-3166 code and numric-3 UN M.49 area code.variant vendor and browser specific code. See class description.Locale instance requestedjava.lang.NullPointerException if any argument is null.
The Java Virtual Machine sets the default locale during startup
based on the host environment. It is used by many locale-sensitive
methods if no locale is explicitly specified.
It can be changed using the
setDefault method.
The Java Virtual Machine sets the default locale during startup based on the host environment. It is used by many locale-sensitive methods if no locale is explicitly specified. It can be changed using the setDefault(Locale.Category, Locale) method.
category - the specified category to get the default localejava.lang.NullPointerException - if category is nullsetDefault(java.util.Locale.Category,java.util.Locale)
If there is a security manager, its checkPermission
method is called with a PropertyPermission("user.language", "write")
permission before the default locale is changed.
The Java Virtual Machine sets the default locale during startup based on the host environment. It is used by many locale-sensitive methods if no locale is explicitly specified.
Since changing the default locale may affect many different areas of functionality, this method should only be used if the caller is prepared to reinitialize locale-sensitive code running within the same Java Virtual Machine.
By setting the default locale with this method, all of the default locales for each Category are also set to the specified default locale.
newLocale the new default localejava.lang.SecurityException
if a security manager exists and its
checkPermission method doesn't allow the operation.java.lang.NullPointerException if newLocale is nulljava.lang.SecurityManager.checkPermission(java.security.Permission)PropertyPermissionIf there is a security manager, its checkPermission method is called with a PropertyPermission("user.language", "write") permission before the default locale is changed.
The Java Virtual Machine sets the default locale during startup based on the host environment. It is used by many locale-sensitive methods if no locale is explicitly specified.
Since changing the default locale may affect many different areas of functionality, this method should only be used if the caller is prepared to reinitialize locale-sensitive code running within the same Java Virtual Machine.
category - the specified category to set the default localenewLocale - the new default localejava.lang.SecurityException - if a security manager exists and its
checkPermission method doesn't allow the operation.java.lang.NullPointerException - if category and/or newLocale is nulljava.lang.SecurityManager.checkPermission(java.security.Permission)PropertyPermissiongetDefault(java.util.Locale.Category)
Note: The Locale class also supports other codes for
country (region), such as 3-letter numeric UN M.49 area codes.
Therefore, the list returned by this method does not contain ALL valid
codes that can be used to create Locales.
Note:
Locale class also supports language codes up to
8 characters in length. Therefore, the list returned by this method does
not contain ALL valid codes that can be used to create Locales.
Note: ISO 639 is not a stable standard— some languages' codes have changed. Locale's constructor recognizes both the new and the old codes for the languages whose codes have changed, but this function always returns the old code. If you want to check for a specific language whose code has changed, don't do
if (locale.getLanguage().equals("he")) // BAD!
...
Instead, do
if (locale.getLanguage().equals(new Locale("he").getLanguage()))
...
getDisplayLanguage()getDisplayScript()getDisplayCountry()getDisplayVariant()[0-9A-Za-z]. Keys are case-insensitive, so
for example 'z' and 'Z' represent the same extension.
key the extension keyjava.lang.IllegalArgumentException if key is not well-formedPRIVATE_USE_EXTENSIONUNICODE_LOCALE_EXTENSIONkey the Unicode locale keyjava.lang.IllegalArgumentException if the key is not well-formedjava.lang.NullPointerException if key is nullLocale
object, consisting of language, country, variant, script,
and extensions as below:
language + "_" + country + "_" + (variant + "_#" | "#") + script + "-" + extensionsLanguage is always lower case, country is always upper case, script is always title case, and extensions are always lower case. Extensions and private use subtags will be in canonical order as explained in
toLanguageTag().
When the locale has neither script nor extensions, the result is the same as in Java 6 and prior.
If both the language and country fields are missing, this function will return the empty string, even if the variant, script, or extensions field is present (you can't have a locale with just a variant, the variant must accompany a well-formed language or country code).
If script or extensions are present and variant is missing, no underscore is added before the "#".
This behavior is designed to support debugging and to be compatible with
previous uses of toString that expected language, country, and variant
fields only. To represent a Locale as a String for interchange purposes, use
.
toLanguageTag()
Examples:
getDisplayName()toLanguageTag()If this Locale has a language, country, or
variant that does not satisfy the IETF BCP 47 language tag
syntax requirements, this method handles these fields as
described below:
Language: If language is empty, or not well-formed (for example "a" or "e2"), it will be emitted as "und" (Undetermined).
Country: If country is not well-formed (for example "12" or "USA"), it will be omitted.
Variant: If variant is well-formed, each sub-segment (delimited by '-' or '_') is emitted as a subtag. Otherwise:
[0-9a-zA-Z]{1,8}
(for example "WIN" or "Oracle_JDK_Standard_Edition"), the first
ill-formed sub-segment and all following will be appended to
the private use subtag. The first appended subtag will be
"lvariant", followed by the sub-segments in order, separated by
hyphen. For example, "x-lvariant-WIN",
"Oracle-x-lvariant-JDK-Standard-Edition".
[0-9a-zA-Z]{1,8}, the variant will be truncated
and the problematic sub-segment and all following sub-segments
will be omitted. If the remainder is non-empty, it will be
emitted as a private use subtag as above (even if the remainder
turns out to be well-formed). For example,
"Solaris_isjustthecoolestthing" is emitted as
"x-lvariant-Solaris", not as "solaris".Special Conversions: Java supports some old locale representations, including deprecated ISO language codes, for compatibility. This method performs the following conversions:
Note: Although the language tag created by this method is well-formed (satisfies the syntax requirements defined by the IETF BCP 47 specification), it is not necessarily a valid BCP 47 language tag. For example,
new Locale("xx", "YY").toLanguageTag();
will return "xx-YY", but the language subtag "xx" and the
region subtag "YY" are invalid because they are not registered
in the IANA Language Subtag Registry.
forLanguageTag(java.lang.String)If the specified language tag contains any ill-formed subtags,
the first such subtag and all following subtags are ignored. Compare
to which throws an exception
in this case.
Locale.Builder.setLanguageTag(java.lang.String)
The following conversions are performed:
Locale loc;
loc = Locale.forLanguageTag("en-US-x-lvariant-POSIX");
loc.getVariant(); // returns "POSIX"
loc.getExtension('x'); // returns null
loc = Locale.forLanguageTag("de-POSIX-x-URP-lvariant-Abc-Def");
loc.getVariant(); // returns "POSIX_Abc_Def"
loc.getExtension('x'); // returns "urp"
Locale.forLanguageTag("ar-aao").getLanguage(); // returns "aao"
Locale.forLanguageTag("en-abc-def-us").toString(); // returns "abc_US"
Locale.forLanguageTag("ja-JP-x-lvariant-JP").toLanguageTag();
// returns "ja-JP-u-ca-japanese-x-lvariant-JP"
Locale.forLanguageTag("th-TH-x-lvariant-TH").toLanguageTag();
// returns "th-TH-u-nu-thai-x-lvariant-TH"
This implements the 'Language-Tag' production of BCP47, and so supports grandfathered (regular and irregular) as well as private use language tags. Stand alone private use tags are represented as empty language and extension 'x-whatever', and grandfathered tags are converted to their canonical replacements where they exist.
Grandfathered tags with canonical replacements are as follows:
| grandfathered tag | Â | modern replacement |
|---|---|---|
| art-lojban | Â | jbo |
| i-ami | Â | ami |
| i-bnn | Â | bnn |
| i-hak | Â | hak |
| i-klingon | Â | tlh |
| i-lux | Â | lb |
| i-navajo | Â | nv |
| i-pwn | Â | pwn |
| i-tao | Â | tao |
| i-tay | Â | tay |
| i-tsu | Â | tsu |
| no-bok | Â | nb |
| no-nyn | Â | nn |
| sgn-BE-FR | Â | sfb |
| sgn-BE-NL | Â | vgt |
| sgn-CH-DE | Â | sgg |
| zh-guoyu | Â | cmn |
| zh-hakka | Â | hak |
| zh-min-nan | Â | nan |
| zh-xiang | Â | hsn |
Grandfathered tags with no modern replacement will be converted as follows:
| grandfathered tag | Â | converts to |
|---|---|---|
| cel-gaulish | Â | xtg-x-cel-gaulish |
| en-GB-oed | Â | en-GB-x-oed |
| i-default | Â | en-x-i-default |
| i-enochian | Â | und-x-i-enochian |
| i-mingo | Â | see-x-i-mingo |
| zh-min | Â | nan-x-zh-min |
For a list of all grandfathered tags, see the IANA Language Subtag Registry (search for "Type: grandfathered").
Note: there is no guarantee that toLanguageTag
and forLanguageTag will round-trip.
languageTag the language tagjava.lang.NullPointerException if languageTag is nulltoLanguageTag()Locale.Builder.setLanguageTag(java.lang.String)MissingResourceException Throws MissingResourceException if
three-letter language abbreviation is not available for this locale.The ISO 3166-1 codes can be found on-line.
MissingResourceException Throws MissingResourceException if the
three-letter country abbreviation is not available for this locale.java.lang.NullPointerException if inLocale is nulljava.lang.NullPointerException if inLocale is nulljava.lang.NullPointerException if inLocale is nulljava.lang.NullPointerException if inLocale is nulllanguage (script, country, variant)depending on which fields are specified in the locale. If the language, sacript, country, and variant fields are all empty, this function returns the empty string.
language (country)
language (variant)
script (country)
country
language (script, country, variant)depending on which fields are specified in the locale. If the language, script, country, and variant fields are all empty, this function returns the empty string.
language (country)
language (variant)
script (country)
country
java.lang.NullPointerException if inLocale is nullqualifierNames.length != 0 ? formatList(qualifierNames, listPattern, listCompositionPattern) : null
stringList the list of strings to be formatted.listPattern should create a MessageFormat taking 0-3 arguments
and formatting them into a list.listCompositionPattern should take 2 arguments
and is used by composeList.private static StringformatList(String[] stringList, String listPattern, String listCompositionPattern) {
format a format which takes two argumentslist a list of stringsLocale to the specified ObjectOutputStream.
out the ObjectOutputStream to writejava.io.IOExceptionLocale.
in the ObjectInputStream to readjava.io.IOExceptionjava.lang.ClassNotFoundExceptionIllformdLocaleExceptionLocale instance equivalent to
the deserialized Locale. When serialized
language, country and variant fields read from the object data stream
are exactly "ja", "JP", "JP" or "th", "TH", "TH" and script/extensions
fields are empty, this method supplies UNICODE_LOCALE_EXTENSION
"ca"/"japanese" (calendar type is "japanese") or "nu"/"thai" (number script
type is "thai"). See Special Cases
for more information.
Locale equivalent to
the deserialized Locale.java.io.ObjectStreamExceptionBuilder is used to build instances of Locale
from values configured by the setters. Unlike the Locale
constructors, the Builder checks if a value configured by a
setter satisfies the syntax requirements defined by the Locale
class. A Locale object created by a Builder is
well-formed and can be transformed to a well-formed IETF BCP 47 language tag
without losing information.
Note: The Locale class does not provide any
syntactic restrictions on variant, while BCP 47 requires each variant
subtag to be 5 to 8 alphanumerics or a single numeric followed by 3
alphanumerics. The method setVariant throws
IllformedLocaleException for a variant that does not satisfy
this restriction. If it is necessary to support such a variant, use a
Locale constructor. However, keep in mind that a Locale
object created this way might lose the variant information when
transformed to a BCP 47 language tag.
The following example shows how to create a Locale object
with the Builder.
Locale aLocale = new Builder().setLanguage("sr").setScript("Latn").setRegion("RS").build();
Builders can be reused; clear() resets all
fields to their default values.
Locale.forLanguageTag(java.lang.String)Builder to match the provided
locale. Existing state is discarded.
All fields of the locale must be well-formed, see .
Locale
Locales with any ill-formed fields cause
IllformedLocaleException to be thrown, except for the
following three cases which are accepted for compatibility
reasons:
locale the localeIllformedLocaleException if locale has
any ill-formed fields.java.lang.NullPointerException if locale is null.clear(). Grandfathered tags (see Locale.forLanguageTag(java.lang.String)) are converted to their canonical
form before being processed. Otherwise, the language tag
must be well-formed (see Locale) or an exception is
thrown (unlike Locale.forLanguageTag, which
just discards ill-formed and following portions of the
tag).
languageTag the language tagIllformedLocaleException if languageTag is ill-formedLocale.forLanguageTag(java.lang.String)language is the empty string or
null, the language in this Builder is removed. Otherwise,
the language must be well-formed
or an exception is thrown.
The typical language value is a two or three-letter language code as defined in ISO639.
language the languageIllformedLocaleException if language is ill-formedscript is null or the empty string,
the script in this Builder is removed.
Otherwise, the script must be well-formed or an
exception is thrown.
The typical script value is a four-letter script code as defined by ISO 15924.
script the scriptIllformedLocaleException if script is ill-formedBuilder is removed. Otherwise,
the region must be well-formed or an
exception is thrown.
The typical region value is a two-letter ISO 3166 code or a three-digit UN M.49 area code.
The country value in the Locale created by the
Builder is always normalized to upper case.
region the regionIllformedLocaleException if region is ill-formedBuilder is removed. Otherwise, it
must consist of one or more well-formed
subtags, or an exception is thrown.
Note: This method checks if variant
satisfies the IETF BCP 47 variant subtag's syntax requirements,
and normalizes the value to lowercase letters. However,
the Locale class does not impose any syntactic
restriction on variant, and the variant value in
Locale is case sensitive. To set such a variant,
use a Locale constructor.
variant the variantIllformedLocaleException if variant is ill-formedNote: The key UNICODE_LOCALE_EXTENSION ('u') is used for the Unicode locale extension.
Setting a value for this key replaces any existing Unicode locale key/type
pairs with those defined in the extension.
Note: The key PRIVATE_USE_EXTENSION ('x') is used for the private use code. To be
well-formed, the value for this key needs only to have subtags of one to
eight alphanumeric characters, not two to eight as in the general case.
key the extension keyvalue the extension valueIllformedLocaleException if key is illegal
or value is ill-formedsetUnicodeLocaleKeyword(java.lang.String,java.lang.String)Keys and types are converted to lower case.
Note:Setting the 'u' extension via
replaces all Unicode locale keywords with those defined in the
extension.
setExtension(char,java.lang.String)
key the Unicode locale keytype the Unicode locale typeIllformedLocaleException if key or type
is ill-formedjava.lang.NullPointerException if key is nullsetExtension(char,java.lang.String)attribute the attributejava.lang.NullPointerException if attribute is nullIllformedLocaleException if attribute is ill-formedsetExtension(char,java.lang.String)Attribute comparision for removal is case-insensitive.
attribute the attributejava.lang.NullPointerException if attribute is nullIllformedLocaleException if attribute is ill-formedsetExtension(char,java.lang.String)setExtension(char,java.lang.String)Locale created from the fields set
on this builder.
This applies the conversions listed in
when constructing a Locale. (Grandfathered tags are handled in
Locale.forLanguageTag(java.lang.String).)
setLanguageTag(java.lang.String)