Search in sources :

Example 1 with LocaleExtensions

use of sun.util.locale.LocaleExtensions in project jdk8u_jdk by JetBrains.

the class Locale method forLanguageTag.

/**
     * Returns a locale for the specified IETF BCP 47 language tag string.
     *
     * <p>If the specified language tag contains any ill-formed subtags,
     * the first such subtag and all following subtags are ignored.  Compare
     * to {@link Locale.Builder#setLanguageTag} which throws an exception
     * in this case.
     *
     * <p>The following <b>conversions</b> are performed:<ul>
     *
     * <li>The language code "und" is mapped to language "".
     *
     * <li>The language codes "he", "yi", and "id" are mapped to "iw",
     * "ji", and "in" respectively. (This is the same canonicalization
     * that's done in Locale's constructors.)
     *
     * <li>The portion of a private use subtag prefixed by "lvariant",
     * if any, is removed and appended to the variant field in the
     * result locale (without case normalization).  If it is then
     * empty, the private use subtag is discarded:
     *
     * <pre>
     *     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"
     * </pre>
     *
     * <li>When the languageTag argument contains an extlang subtag,
     * the first such subtag is used as the language, and the primary
     * language subtag and other extlang subtags are ignored:
     *
     * <pre>
     *     Locale.forLanguageTag("ar-aao").getLanguage(); // returns "aao"
     *     Locale.forLanguageTag("en-abc-def-us").toString(); // returns "abc_US"
     * </pre>
     *
     * <li>Case is normalized except for variant tags, which are left
     * unchanged.  Language is normalized to lower case, script to
     * title case, country to upper case, and extensions to lower
     * case.
     *
     * <li>If, after processing, the locale would exactly match either
     * ja_JP_JP or th_TH_TH with no extensions, the appropriate
     * extensions are added as though the constructor had been called:
     *
     * <pre>
     *    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"
     * </pre></ul>
     *
     * <p>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.
     *
     * <p>Grandfathered tags with canonical replacements are as follows:
     *
     * <table summary="Grandfathered tags with canonical replacements">
     * <tbody align="center">
     * <tr><th>grandfathered tag</th><th>&nbsp;</th><th>modern replacement</th></tr>
     * <tr><td>art-lojban</td><td>&nbsp;</td><td>jbo</td></tr>
     * <tr><td>i-ami</td><td>&nbsp;</td><td>ami</td></tr>
     * <tr><td>i-bnn</td><td>&nbsp;</td><td>bnn</td></tr>
     * <tr><td>i-hak</td><td>&nbsp;</td><td>hak</td></tr>
     * <tr><td>i-klingon</td><td>&nbsp;</td><td>tlh</td></tr>
     * <tr><td>i-lux</td><td>&nbsp;</td><td>lb</td></tr>
     * <tr><td>i-navajo</td><td>&nbsp;</td><td>nv</td></tr>
     * <tr><td>i-pwn</td><td>&nbsp;</td><td>pwn</td></tr>
     * <tr><td>i-tao</td><td>&nbsp;</td><td>tao</td></tr>
     * <tr><td>i-tay</td><td>&nbsp;</td><td>tay</td></tr>
     * <tr><td>i-tsu</td><td>&nbsp;</td><td>tsu</td></tr>
     * <tr><td>no-bok</td><td>&nbsp;</td><td>nb</td></tr>
     * <tr><td>no-nyn</td><td>&nbsp;</td><td>nn</td></tr>
     * <tr><td>sgn-BE-FR</td><td>&nbsp;</td><td>sfb</td></tr>
     * <tr><td>sgn-BE-NL</td><td>&nbsp;</td><td>vgt</td></tr>
     * <tr><td>sgn-CH-DE</td><td>&nbsp;</td><td>sgg</td></tr>
     * <tr><td>zh-guoyu</td><td>&nbsp;</td><td>cmn</td></tr>
     * <tr><td>zh-hakka</td><td>&nbsp;</td><td>hak</td></tr>
     * <tr><td>zh-min-nan</td><td>&nbsp;</td><td>nan</td></tr>
     * <tr><td>zh-xiang</td><td>&nbsp;</td><td>hsn</td></tr>
     * </tbody>
     * </table>
     *
     * <p>Grandfathered tags with no modern replacement will be
     * converted as follows:
     *
     * <table summary="Grandfathered tags with no modern replacement">
     * <tbody align="center">
     * <tr><th>grandfathered tag</th><th>&nbsp;</th><th>converts to</th></tr>
     * <tr><td>cel-gaulish</td><td>&nbsp;</td><td>xtg-x-cel-gaulish</td></tr>
     * <tr><td>en-GB-oed</td><td>&nbsp;</td><td>en-GB-x-oed</td></tr>
     * <tr><td>i-default</td><td>&nbsp;</td><td>en-x-i-default</td></tr>
     * <tr><td>i-enochian</td><td>&nbsp;</td><td>und-x-i-enochian</td></tr>
     * <tr><td>i-mingo</td><td>&nbsp;</td><td>see-x-i-mingo</td></tr>
     * <tr><td>zh-min</td><td>&nbsp;</td><td>nan-x-zh-min</td></tr>
     * </tbody>
     * </table>
     *
     * <p>For a list of all grandfathered tags, see the
     * IANA Language Subtag Registry (search for "Type: grandfathered").
     *
     * <p><b>Note</b>: there is no guarantee that <code>toLanguageTag</code>
     * and <code>forLanguageTag</code> will round-trip.
     *
     * @param languageTag the language tag
     * @return The locale that best represents the language tag.
     * @throws NullPointerException if <code>languageTag</code> is <code>null</code>
     * @see #toLanguageTag()
     * @see java.util.Locale.Builder#setLanguageTag(String)
     * @since 1.7
     */
public static Locale forLanguageTag(String languageTag) {
    LanguageTag tag = LanguageTag.parse(languageTag, null);
    InternalLocaleBuilder bldr = new InternalLocaleBuilder();
    bldr.setLanguageTag(tag);
    BaseLocale base = bldr.getBaseLocale();
    LocaleExtensions exts = bldr.getLocaleExtensions();
    if (exts == null && base.getVariant().length() > 0) {
        exts = getCompatibilityExtensions(base.getLanguage(), base.getScript(), base.getRegion(), base.getVariant());
    }
    return getInstance(base, exts);
}
Also used : InternalLocaleBuilder(sun.util.locale.InternalLocaleBuilder) LanguageTag(sun.util.locale.LanguageTag) LocaleExtensions(sun.util.locale.LocaleExtensions) BaseLocale(sun.util.locale.BaseLocale)

Example 2 with LocaleExtensions

use of sun.util.locale.LocaleExtensions in project checker-framework by typetools.

the class Locale method forLanguageTag.

/**
 * Returns a locale for the specified IETF BCP 47 language tag string.
 *
 * <p>If the specified language tag contains any ill-formed subtags,
 * the first such subtag and all following subtags are ignored.  Compare
 * to {@link Locale.Builder#setLanguageTag} which throws an exception
 * in this case.
 *
 * <p>The following <b>conversions</b> are performed:<ul>
 *
 * <li>The language code "und" is mapped to language "".
 *
 * <li>The language codes "he", "yi", and "id" are mapped to "iw",
 * "ji", and "in" respectively. (This is the same canonicalization
 * that's done in Locale's constructors.)
 *
 * <li>The portion of a private use subtag prefixed by "lvariant",
 * if any, is removed and appended to the variant field in the
 * result locale (without case normalization).  If it is then
 * empty, the private use subtag is discarded:
 *
 * <pre>
 *     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"
 * </pre>
 *
 * <li>When the languageTag argument contains an extlang subtag,
 * the first such subtag is used as the language, and the primary
 * language subtag and other extlang subtags are ignored:
 *
 * <pre>
 *     Locale.forLanguageTag("ar-aao").getLanguage(); // returns "aao"
 *     Locale.forLanguageTag("en-abc-def-us").toString(); // returns "abc_US"
 * </pre>
 *
 * <li>Case is normalized except for variant tags, which are left
 * unchanged.  Language is normalized to lower case, script to
 * title case, country to upper case, and extensions to lower
 * case.
 *
 * <li>If, after processing, the locale would exactly match either
 * ja_JP_JP or th_TH_TH with no extensions, the appropriate
 * extensions are added as though the constructor had been called:
 *
 * <pre>
 *    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"
 * </pre></ul>
 *
 * <p>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.
 *
 * <p>Grandfathered tags with canonical replacements are as follows:
 *
 * <table summary="Grandfathered tags with canonical replacements">
 * <tbody align="center">
 * <tr><th>grandfathered tag</th><th>&nbsp;</th><th>modern replacement</th></tr>
 * <tr><td>art-lojban</td><td>&nbsp;</td><td>jbo</td></tr>
 * <tr><td>i-ami</td><td>&nbsp;</td><td>ami</td></tr>
 * <tr><td>i-bnn</td><td>&nbsp;</td><td>bnn</td></tr>
 * <tr><td>i-hak</td><td>&nbsp;</td><td>hak</td></tr>
 * <tr><td>i-klingon</td><td>&nbsp;</td><td>tlh</td></tr>
 * <tr><td>i-lux</td><td>&nbsp;</td><td>lb</td></tr>
 * <tr><td>i-navajo</td><td>&nbsp;</td><td>nv</td></tr>
 * <tr><td>i-pwn</td><td>&nbsp;</td><td>pwn</td></tr>
 * <tr><td>i-tao</td><td>&nbsp;</td><td>tao</td></tr>
 * <tr><td>i-tay</td><td>&nbsp;</td><td>tay</td></tr>
 * <tr><td>i-tsu</td><td>&nbsp;</td><td>tsu</td></tr>
 * <tr><td>no-bok</td><td>&nbsp;</td><td>nb</td></tr>
 * <tr><td>no-nyn</td><td>&nbsp;</td><td>nn</td></tr>
 * <tr><td>sgn-BE-FR</td><td>&nbsp;</td><td>sfb</td></tr>
 * <tr><td>sgn-BE-NL</td><td>&nbsp;</td><td>vgt</td></tr>
 * <tr><td>sgn-CH-DE</td><td>&nbsp;</td><td>sgg</td></tr>
 * <tr><td>zh-guoyu</td><td>&nbsp;</td><td>cmn</td></tr>
 * <tr><td>zh-hakka</td><td>&nbsp;</td><td>hak</td></tr>
 * <tr><td>zh-min-nan</td><td>&nbsp;</td><td>nan</td></tr>
 * <tr><td>zh-xiang</td><td>&nbsp;</td><td>hsn</td></tr>
 * </tbody>
 * </table>
 *
 * <p>Grandfathered tags with no modern replacement will be
 * converted as follows:
 *
 * <table summary="Grandfathered tags with no modern replacement">
 * <tbody align="center">
 * <tr><th>grandfathered tag</th><th>&nbsp;</th><th>converts to</th></tr>
 * <tr><td>cel-gaulish</td><td>&nbsp;</td><td>xtg-x-cel-gaulish</td></tr>
 * <tr><td>en-GB-oed</td><td>&nbsp;</td><td>en-GB-x-oed</td></tr>
 * <tr><td>i-default</td><td>&nbsp;</td><td>en-x-i-default</td></tr>
 * <tr><td>i-enochian</td><td>&nbsp;</td><td>und-x-i-enochian</td></tr>
 * <tr><td>i-mingo</td><td>&nbsp;</td><td>see-x-i-mingo</td></tr>
 * <tr><td>zh-min</td><td>&nbsp;</td><td>nan-x-zh-min</td></tr>
 * </tbody>
 * </table>
 *
 * <p>For a list of all grandfathered tags, see the
 * IANA Language Subtag Registry (search for "Type: grandfathered").
 *
 * <p><b>Note</b>: there is no guarantee that <code>toLanguageTag</code>
 * and <code>forLanguageTag</code> will round-trip.
 *
 * @param languageTag the language tag
 * @return The locale that best represents the language tag.
 * @throws NullPointerException if <code>languageTag</code> is <code>null</code>
 * @see #toLanguageTag()
 * @see java.util.Locale.Builder#setLanguageTag(String)
 * @since 1.7
 */
public static Locale forLanguageTag(String languageTag) {
    LanguageTag tag = LanguageTag.parse(languageTag, null);
    InternalLocaleBuilder bldr = new InternalLocaleBuilder();
    bldr.setLanguageTag(tag);
    BaseLocale base = bldr.getBaseLocale();
    LocaleExtensions exts = bldr.getLocaleExtensions();
    if (exts == null && base.getVariant().length() > 0) {
        exts = getCompatibilityExtensions(base.getLanguage(), base.getScript(), base.getRegion(), base.getVariant());
    }
    return getInstance(base, exts);
}
Also used : InternalLocaleBuilder(sun.util.locale.InternalLocaleBuilder) LanguageTag(sun.util.locale.LanguageTag) LocaleExtensions(sun.util.locale.LocaleExtensions) BaseLocale(sun.util.locale.BaseLocale)

Example 3 with LocaleExtensions

use of sun.util.locale.LocaleExtensions in project Bytecoder by mirkosertic.

the class Locale method forLanguageTag.

/**
 * Returns a locale for the specified IETF BCP 47 language tag string.
 *
 * <p>If the specified language tag contains any ill-formed subtags,
 * the first such subtag and all following subtags are ignored.  Compare
 * to {@link Locale.Builder#setLanguageTag} which throws an exception
 * in this case.
 *
 * <p>The following <b>conversions</b> are performed:<ul>
 *
 * <li>The language code "und" is mapped to language "".
 *
 * <li>The language codes "he", "yi", and "id" are mapped to "iw",
 * "ji", and "in" respectively. (This is the same canonicalization
 * that's done in Locale's constructors.)
 *
 * <li>The portion of a private use subtag prefixed by "lvariant",
 * if any, is removed and appended to the variant field in the
 * result locale (without case normalization).  If it is then
 * empty, the private use subtag is discarded:
 *
 * <pre>
 *     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"
 * </pre>
 *
 * <li>When the languageTag argument contains an extlang subtag,
 * the first such subtag is used as the language, and the primary
 * language subtag and other extlang subtags are ignored:
 *
 * <pre>
 *     Locale.forLanguageTag("ar-aao").getLanguage(); // returns "aao"
 *     Locale.forLanguageTag("en-abc-def-us").toString(); // returns "abc_US"
 * </pre>
 *
 * <li>Case is normalized except for variant tags, which are left
 * unchanged.  Language is normalized to lower case, script to
 * title case, country to upper case, and extensions to lower
 * case.
 *
 * <li>If, after processing, the locale would exactly match either
 * ja_JP_JP or th_TH_TH with no extensions, the appropriate
 * extensions are added as though the constructor had been called:
 *
 * <pre>
 *    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"
 * </pre></ul>
 *
 * <p>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.
 *
 * <p>Grandfathered tags with canonical replacements are as follows:
 *
 * <table class="striped">
 * <caption style="display:none">Grandfathered tags with canonical replacements</caption>
 * <thead style="text-align:center">
 * <tr><th scope="col" style="padding: 0 2px">grandfathered tag</th><th scope="col" style="padding: 0 2px">modern replacement</th></tr>
 * </thead>
 * <tbody style="text-align:center">
 * <tr><th scope="row">art-lojban</th><td>jbo</td></tr>
 * <tr><th scope="row">i-ami</th><td>ami</td></tr>
 * <tr><th scope="row">i-bnn</th><td>bnn</td></tr>
 * <tr><th scope="row">i-hak</th><td>hak</td></tr>
 * <tr><th scope="row">i-klingon</th><td>tlh</td></tr>
 * <tr><th scope="row">i-lux</th><td>lb</td></tr>
 * <tr><th scope="row">i-navajo</th><td>nv</td></tr>
 * <tr><th scope="row">i-pwn</th><td>pwn</td></tr>
 * <tr><th scope="row">i-tao</th><td>tao</td></tr>
 * <tr><th scope="row">i-tay</th><td>tay</td></tr>
 * <tr><th scope="row">i-tsu</th><td>tsu</td></tr>
 * <tr><th scope="row">no-bok</th><td>nb</td></tr>
 * <tr><th scope="row">no-nyn</th><td>nn</td></tr>
 * <tr><th scope="row">sgn-BE-FR</th><td>sfb</td></tr>
 * <tr><th scope="row">sgn-BE-NL</th><td>vgt</td></tr>
 * <tr><th scope="row">sgn-CH-DE</th><td>sgg</td></tr>
 * <tr><th scope="row">zh-guoyu</th><td>cmn</td></tr>
 * <tr><th scope="row">zh-hakka</th><td>hak</td></tr>
 * <tr><th scope="row">zh-min-nan</th><td>nan</td></tr>
 * <tr><th scope="row">zh-xiang</th><td>hsn</td></tr>
 * </tbody>
 * </table>
 *
 * <p>Grandfathered tags with no modern replacement will be
 * converted as follows:
 *
 * <table class="striped">
 * <caption style="display:none">Grandfathered tags with no modern replacement</caption>
 * <thead style="text-align:center">
 * <tr><th scope="col" style="padding: 0 2px">grandfathered tag</th><th scope="col" style="padding: 0 2px">converts to</th></tr>
 * </thead>
 * <tbody style="text-align:center">
 * <tr><th scope="row">cel-gaulish</th><td>xtg-x-cel-gaulish</td></tr>
 * <tr><th scope="row">en-GB-oed</th><td>en-GB-x-oed</td></tr>
 * <tr><th scope="row">i-default</th><td>en-x-i-default</td></tr>
 * <tr><th scope="row">i-enochian</th><td>und-x-i-enochian</td></tr>
 * <tr><th scope="row">i-mingo</th><td>see-x-i-mingo</td></tr>
 * <tr><th scope="row">zh-min</th><td>nan-x-zh-min</td></tr>
 * </tbody>
 * </table>
 *
 * <p>For a list of all grandfathered tags, see the
 * IANA Language Subtag Registry (search for "Type: grandfathered").
 *
 * <p><b>Note</b>: there is no guarantee that <code>toLanguageTag</code>
 * and <code>forLanguageTag</code> will round-trip.
 *
 * @param languageTag the language tag
 * @return The locale that best represents the language tag.
 * @throws NullPointerException if <code>languageTag</code> is <code>null</code>
 * @see #toLanguageTag()
 * @see java.util.Locale.Builder#setLanguageTag(String)
 * @since 1.7
 */
public static Locale forLanguageTag(String languageTag) {
    LanguageTag tag = LanguageTag.parse(languageTag, null);
    InternalLocaleBuilder bldr = new InternalLocaleBuilder();
    bldr.setLanguageTag(tag);
    BaseLocale base = bldr.getBaseLocale();
    LocaleExtensions exts = bldr.getLocaleExtensions();
    if (exts == null && base.getVariant().length() > 0) {
        exts = getCompatibilityExtensions(base.getLanguage(), base.getScript(), base.getRegion(), base.getVariant());
    }
    return getInstance(base, exts);
}
Also used : InternalLocaleBuilder(sun.util.locale.InternalLocaleBuilder) LanguageTag(sun.util.locale.LanguageTag) LocaleExtensions(sun.util.locale.LocaleExtensions) BaseLocale(sun.util.locale.BaseLocale)

Example 4 with LocaleExtensions

use of sun.util.locale.LocaleExtensions in project j2objc by google.

the class Locale method forLanguageTag.

/**
 * Returns a locale for the specified IETF BCP 47 language tag string.
 *
 * <p>If the specified language tag contains any ill-formed subtags,
 * the first such subtag and all following subtags are ignored.  Compare
 * to {@link Locale.Builder#setLanguageTag} which throws an exception
 * in this case.
 *
 * <p>The following <b>conversions</b> are performed:<ul>
 *
 * <li>The language code "und" is mapped to language "".
 *
 * <li>The language codes "he", "yi", and "id" are mapped to "iw",
 * "ji", and "in" respectively. (This is the same canonicalization
 * that's done in Locale's constructors.)
 *
 * <li>The portion of a private use subtag prefixed by "lvariant",
 * if any, is removed and appended to the variant field in the
 * result locale (without case normalization).  If it is then
 * empty, the private use subtag is discarded:
 *
 * <pre>
 *     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"
 * </pre>
 *
 * <li>When the languageTag argument contains an extlang subtag,
 * the first such subtag is used as the language, and the primary
 * language subtag and other extlang subtags are ignored:
 *
 * <pre>
 *     Locale.forLanguageTag("ar-aao").getLanguage(); // returns "aao"
 *     Locale.forLanguageTag("en-abc-def-us").toString(); // returns "abc_US"
 * </pre>
 *
 * <li>Case is normalized except for variant tags, which are left
 * unchanged.  Language is normalized to lower case, script to
 * title case, country to upper case, and extensions to lower
 * case.
 *
 * <li>If, after processing, the locale would exactly match either
 * ja_JP_JP or th_TH_TH with no extensions, the appropriate
 * extensions are added as though the constructor had been called:
 *
 * <pre>
 *    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"
 * </pre></ul>
 *
 * <p>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.
 *
 * <p>Grandfathered tags with canonical replacements are as follows:
 *
 * <table summary="Grandfathered tags with canonical replacements">
 * <tbody align="center">
 * <tr><th>grandfathered tag</th><th>&nbsp;</th><th>modern replacement</th></tr>
 * <tr><td>art-lojban</td><td>&nbsp;</td><td>jbo</td></tr>
 * <tr><td>i-ami</td><td>&nbsp;</td><td>ami</td></tr>
 * <tr><td>i-bnn</td><td>&nbsp;</td><td>bnn</td></tr>
 * <tr><td>i-hak</td><td>&nbsp;</td><td>hak</td></tr>
 * <tr><td>i-klingon</td><td>&nbsp;</td><td>tlh</td></tr>
 * <tr><td>i-lux</td><td>&nbsp;</td><td>lb</td></tr>
 * <tr><td>i-navajo</td><td>&nbsp;</td><td>nv</td></tr>
 * <tr><td>i-pwn</td><td>&nbsp;</td><td>pwn</td></tr>
 * <tr><td>i-tao</td><td>&nbsp;</td><td>tao</td></tr>
 * <tr><td>i-tay</td><td>&nbsp;</td><td>tay</td></tr>
 * <tr><td>i-tsu</td><td>&nbsp;</td><td>tsu</td></tr>
 * <tr><td>no-bok</td><td>&nbsp;</td><td>nb</td></tr>
 * <tr><td>no-nyn</td><td>&nbsp;</td><td>nn</td></tr>
 * <tr><td>sgn-BE-FR</td><td>&nbsp;</td><td>sfb</td></tr>
 * <tr><td>sgn-BE-NL</td><td>&nbsp;</td><td>vgt</td></tr>
 * <tr><td>sgn-CH-DE</td><td>&nbsp;</td><td>sgg</td></tr>
 * <tr><td>zh-guoyu</td><td>&nbsp;</td><td>cmn</td></tr>
 * <tr><td>zh-hakka</td><td>&nbsp;</td><td>hak</td></tr>
 * <tr><td>zh-min-nan</td><td>&nbsp;</td><td>nan</td></tr>
 * <tr><td>zh-xiang</td><td>&nbsp;</td><td>hsn</td></tr>
 * </tbody>
 * </table>
 *
 * <p>Grandfathered tags with no modern replacement will be
 * converted as follows:
 *
 * <table summary="Grandfathered tags with no modern replacement">
 * <tbody align="center">
 * <tr><th>grandfathered tag</th><th>&nbsp;</th><th>converts to</th></tr>
 * <tr><td>cel-gaulish</td><td>&nbsp;</td><td>xtg-x-cel-gaulish</td></tr>
 * <tr><td>en-GB-oed</td><td>&nbsp;</td><td>en-GB-x-oed</td></tr>
 * <tr><td>i-default</td><td>&nbsp;</td><td>en-x-i-default</td></tr>
 * <tr><td>i-enochian</td><td>&nbsp;</td><td>und-x-i-enochian</td></tr>
 * <tr><td>i-mingo</td><td>&nbsp;</td><td>see-x-i-mingo</td></tr>
 * <tr><td>zh-min</td><td>&nbsp;</td><td>nan-x-zh-min</td></tr>
 * </tbody>
 * </table>
 *
 * <p>For a list of all grandfathered tags, see the
 * IANA Language Subtag Registry (search for "Type: grandfathered").
 *
 * <p><b>Note</b>: there is no guarantee that <code>toLanguageTag</code>
 * and <code>forLanguageTag</code> will round-trip.
 *
 * @param languageTag the language tag
 * @return The locale that best represents the language tag.
 * @throws NullPointerException if <code>languageTag</code> is <code>null</code>
 * @see #toLanguageTag()
 * @see java.util.Locale.Builder#setLanguageTag(String)
 * @since 1.7
 */
public static Locale forLanguageTag(String languageTag) {
    LanguageTag tag = LanguageTag.parse(languageTag, null);
    InternalLocaleBuilder bldr = new InternalLocaleBuilder();
    bldr.setLanguageTag(tag);
    BaseLocale base = bldr.getBaseLocale();
    LocaleExtensions exts = bldr.getLocaleExtensions();
    if (exts == null && base.getVariant().length() > 0) {
        exts = getCompatibilityExtensions(base.getLanguage(), base.getScript(), base.getRegion(), base.getVariant());
    }
    return getInstance(base, exts);
}
Also used : InternalLocaleBuilder(sun.util.locale.InternalLocaleBuilder) LanguageTag(sun.util.locale.LanguageTag) LocaleExtensions(sun.util.locale.LocaleExtensions) BaseLocale(sun.util.locale.BaseLocale)

Aggregations

BaseLocale (sun.util.locale.BaseLocale)4 InternalLocaleBuilder (sun.util.locale.InternalLocaleBuilder)4 LanguageTag (sun.util.locale.LanguageTag)4 LocaleExtensions (sun.util.locale.LocaleExtensions)4