< prev index next >

src/java.base/share/classes/java/util/Locale.java

Print this page




1570      * <li>If, after processing, the locale would exactly match either
1571      * ja_JP_JP or th_TH_TH with no extensions, the appropriate
1572      * extensions are added as though the constructor had been called:
1573      *
1574      * <pre>
1575      *    Locale.forLanguageTag("ja-JP-x-lvariant-JP").toLanguageTag();
1576      *    // returns "ja-JP-u-ca-japanese-x-lvariant-JP"
1577      *    Locale.forLanguageTag("th-TH-x-lvariant-TH").toLanguageTag();
1578      *    // returns "th-TH-u-nu-thai-x-lvariant-TH"
1579      * </pre></ul>
1580      *
1581      * <p>This implements the 'Language-Tag' production of BCP47, and
1582      * so supports grandfathered (regular and irregular) as well as
1583      * private use language tags.  Stand alone private use tags are
1584      * represented as empty language and extension 'x-whatever',
1585      * and grandfathered tags are converted to their canonical replacements
1586      * where they exist.
1587      *
1588      * <p>Grandfathered tags with canonical replacements are as follows:
1589      *
1590      * <table summary="Grandfathered tags with canonical replacements">




1591      * <tbody style="text-align:center">
1592      * <tr><th>grandfathered tag</th><th>&nbsp;</th><th>modern replacement</th></tr>
1593      * <tr><td>art-lojban</td><td>&nbsp;</td><td>jbo</td></tr>
1594      * <tr><td>i-ami</td><td>&nbsp;</td><td>ami</td></tr>
1595      * <tr><td>i-bnn</td><td>&nbsp;</td><td>bnn</td></tr>
1596      * <tr><td>i-hak</td><td>&nbsp;</td><td>hak</td></tr>
1597      * <tr><td>i-klingon</td><td>&nbsp;</td><td>tlh</td></tr>
1598      * <tr><td>i-lux</td><td>&nbsp;</td><td>lb</td></tr>
1599      * <tr><td>i-navajo</td><td>&nbsp;</td><td>nv</td></tr>
1600      * <tr><td>i-pwn</td><td>&nbsp;</td><td>pwn</td></tr>
1601      * <tr><td>i-tao</td><td>&nbsp;</td><td>tao</td></tr>
1602      * <tr><td>i-tay</td><td>&nbsp;</td><td>tay</td></tr>
1603      * <tr><td>i-tsu</td><td>&nbsp;</td><td>tsu</td></tr>
1604      * <tr><td>no-bok</td><td>&nbsp;</td><td>nb</td></tr>
1605      * <tr><td>no-nyn</td><td>&nbsp;</td><td>nn</td></tr>
1606      * <tr><td>sgn-BE-FR</td><td>&nbsp;</td><td>sfb</td></tr>
1607      * <tr><td>sgn-BE-NL</td><td>&nbsp;</td><td>vgt</td></tr>
1608      * <tr><td>sgn-CH-DE</td><td>&nbsp;</td><td>sgg</td></tr>
1609      * <tr><td>zh-guoyu</td><td>&nbsp;</td><td>cmn</td></tr>
1610      * <tr><td>zh-hakka</td><td>&nbsp;</td><td>hak</td></tr>
1611      * <tr><td>zh-min-nan</td><td>&nbsp;</td><td>nan</td></tr>
1612      * <tr><td>zh-xiang</td><td>&nbsp;</td><td>hsn</td></tr>
1613      * </tbody>
1614      * </table>
1615      *
1616      * <p>Grandfathered tags with no modern replacement will be
1617      * converted as follows:
1618      *
1619      * <table summary="Grandfathered tags with no modern replacement">




1620      * <tbody style="text-align:center">
1621      * <tr><th>grandfathered tag</th><th>&nbsp;</th><th>converts to</th></tr>
1622      * <tr><td>cel-gaulish</td><td>&nbsp;</td><td>xtg-x-cel-gaulish</td></tr>
1623      * <tr><td>en-GB-oed</td><td>&nbsp;</td><td>en-GB-x-oed</td></tr>
1624      * <tr><td>i-default</td><td>&nbsp;</td><td>en-x-i-default</td></tr>
1625      * <tr><td>i-enochian</td><td>&nbsp;</td><td>und-x-i-enochian</td></tr>
1626      * <tr><td>i-mingo</td><td>&nbsp;</td><td>see-x-i-mingo</td></tr>
1627      * <tr><td>zh-min</td><td>&nbsp;</td><td>nan-x-zh-min</td></tr>
1628      * </tbody>
1629      * </table>
1630      *
1631      * <p>For a list of all grandfathered tags, see the
1632      * IANA Language Subtag Registry (search for "Type: grandfathered").
1633      *
1634      * <p><b>Note</b>: there is no guarantee that <code>toLanguageTag</code>
1635      * and <code>forLanguageTag</code> will round-trip.
1636      *
1637      * @param languageTag the language tag
1638      * @return The locale that best represents the language tag.
1639      * @throws NullPointerException if <code>languageTag</code> is <code>null</code>
1640      * @see #toLanguageTag()
1641      * @see java.util.Locale.Builder#setLanguageTag(String)
1642      * @since 1.7
1643      */
1644     public static Locale forLanguageTag(String languageTag) {
1645         LanguageTag tag = LanguageTag.parse(languageTag, null);
1646         InternalLocaleBuilder bldr = new InternalLocaleBuilder();
1647         bldr.setLanguageTag(tag);


2750     /**
2751      * This enum provides constants to select a filtering mode for locale
2752      * matching. Refer to <a href="http://tools.ietf.org/html/rfc4647">RFC 4647
2753      * Matching of Language Tags</a> for details.
2754      *
2755      * <p>As an example, think of two Language Priority Lists each of which
2756      * includes only one language range and a set of following language tags:
2757      *
2758      * <pre>
2759      *    de (German)
2760      *    de-DE (German, Germany)
2761      *    de-Deva (German, in Devanagari script)
2762      *    de-Deva-DE (German, in Devanagari script, Germany)
2763      *    de-DE-1996 (German, Germany, orthography of 1996)
2764      *    de-Latn-DE (German, in Latin script, Germany)
2765      *    de-Latn-DE-1996 (German, in Latin script, Germany, orthography of 1996)
2766      * </pre>
2767      *
2768      * The filtering method will behave as follows:
2769      *
2770      * <table cellpadding=2 summary="Filtering method behavior">


2771      * <tr>
2772      * <th>Filtering Mode</th>
2773      * <th>Language Priority List: {@code "de-DE"}</th>
2774      * <th>Language Priority List: {@code "de-*-DE"}</th>
2775      * </tr>


2776      * <tr>
2777      * <td style="vertical-align:top">
2778      * {@link FilteringMode#AUTOSELECT_FILTERING AUTOSELECT_FILTERING}
2779      * </td>
2780      * <td style="vertical-align:top">
2781      * Performs <em>basic</em> filtering and returns {@code "de-DE"} and
2782      * {@code "de-DE-1996"}.
2783      * </td>
2784      * <td style="vertical-align:top">
2785      * Performs <em>extended</em> filtering and returns {@code "de-DE"},
2786      * {@code "de-Deva-DE"}, {@code "de-DE-1996"}, {@code "de-Latn-DE"}, and
2787      * {@code "de-Latn-DE-1996"}.
2788      * </td>
2789      * </tr>
2790      * <tr>
2791      * <td style="vertical-align:top">
2792      * {@link FilteringMode#EXTENDED_FILTERING EXTENDED_FILTERING}
2793      * </td>
2794      * <td style="vertical-align:top">
2795      * Performs <em>extended</em> filtering and returns {@code "de-DE"},


2815      * <td style="vertical-align:top">
2816      * {@link FilteringMode#MAP_EXTENDED_RANGES MAP_EXTENDED_RANGES}
2817      * </td>
2818      * <td style="vertical-align:top">Same as above.</td>
2819      * <td style="vertical-align:top">
2820      * Performs <em>basic</em> filtering and returns {@code "de-DE"} and
2821      * {@code "de-DE-1996"} because {@code "de-*-DE"} is mapped to
2822      * {@code "de-DE"}.
2823      * </td>
2824      * </tr>
2825      * <tr>
2826      * <td style="vertical-align:top">
2827      * {@link FilteringMode#REJECT_EXTENDED_RANGES REJECT_EXTENDED_RANGES}
2828      * </td>
2829      * <td style="vertical-align:top">Same as above.</td>
2830      * <td style="vertical-align:top">
2831      * Throws {@link IllegalArgumentException} because {@code "de-*-DE"} is
2832      * not a valid basic language range.
2833      * </td>
2834      * </tr>

2835      * </table>
2836      *
2837      * @see #filter(List, Collection, FilteringMode)
2838      * @see #filterTags(List, Collection, FilteringMode)
2839      *
2840      * @since 1.8
2841      */
2842     public static enum FilteringMode {
2843         /**
2844          * Specifies automatic filtering mode based on the given Language
2845          * Priority List consisting of language ranges. If all of the ranges
2846          * are basic, basic filtering is selected. Otherwise, extended
2847          * filtering is selected.
2848          */
2849         AUTOSELECT_FILTERING,
2850 
2851         /**
2852          * Specifies extended filtering.
2853          */
2854         EXTENDED_FILTERING,




1570      * <li>If, after processing, the locale would exactly match either
1571      * ja_JP_JP or th_TH_TH with no extensions, the appropriate
1572      * extensions are added as though the constructor had been called:
1573      *
1574      * <pre>
1575      *    Locale.forLanguageTag("ja-JP-x-lvariant-JP").toLanguageTag();
1576      *    // returns "ja-JP-u-ca-japanese-x-lvariant-JP"
1577      *    Locale.forLanguageTag("th-TH-x-lvariant-TH").toLanguageTag();
1578      *    // returns "th-TH-u-nu-thai-x-lvariant-TH"
1579      * </pre></ul>
1580      *
1581      * <p>This implements the 'Language-Tag' production of BCP47, and
1582      * so supports grandfathered (regular and irregular) as well as
1583      * private use language tags.  Stand alone private use tags are
1584      * represented as empty language and extension 'x-whatever',
1585      * and grandfathered tags are converted to their canonical replacements
1586      * where they exist.
1587      *
1588      * <p>Grandfathered tags with canonical replacements are as follows:
1589      *
1590      * <table class="striped">
1591      * <caption style="display:none">Grandfathered tags with canonical replacements</caption>
1592      * <thead style="text-align:center">
1593      * <tr><th style="padding: 0 2px">grandfathered tag</th><th style="padding: 0 2px">modern replacement</th></tr>
1594      * </thead>
1595      * <tbody style="text-align:center">
1596      * <tr><td>art-lojban</td><td>jbo</td></tr>
1597      * <tr><td>i-ami</td><td>ami</td></tr>
1598      * <tr><td>i-bnn</td><td>bnn</td></tr>
1599      * <tr><td>i-hak</td><td>hak</td></tr>
1600      * <tr><td>i-klingon</td><td>tlh</td></tr>
1601      * <tr><td>i-lux</td><td>lb</td></tr>
1602      * <tr><td>i-navajo</td><td>nv</td></tr>
1603      * <tr><td>i-pwn</td><td>pwn</td></tr>
1604      * <tr><td>i-tao</td><td>tao</td></tr>
1605      * <tr><td>i-tay</td><td>tay</td></tr>
1606      * <tr><td>i-tsu</td><td>tsu</td></tr>
1607      * <tr><td>no-bok</td><td>nb</td></tr>
1608      * <tr><td>no-nyn</td><td>nn</td></tr>
1609      * <tr><td>sgn-BE-FR</td><td>sfb</td></tr>
1610      * <tr><td>sgn-BE-NL</td><td>vgt</td></tr>
1611      * <tr><td>sgn-CH-DE</td><td>sgg</td></tr>
1612      * <tr><td>zh-guoyu</td><td>cmn</td></tr>
1613      * <tr><td>zh-hakka</td><td>hak</td></tr>
1614      * <tr><td>zh-min-nan</td><td>nan</td></tr>
1615      * <tr><td>zh-xiang</td><td>hsn</td></tr>

1616      * </tbody>
1617      * </table>
1618      *
1619      * <p>Grandfathered tags with no modern replacement will be
1620      * converted as follows:
1621      *
1622      * <table class="striped">
1623      * <caption style="display:none">Grandfathered tags with no modern replacement</caption>
1624      * <thead style="text-align:center">
1625      * <tr><th style="padding: 0 2px">grandfathered tag</th><th style="padding: 0 2px">converts to</th></tr>
1626      * </thead>
1627      * <tbody style="text-align:center">
1628      * <tr><td>cel-gaulish</td><td>xtg-x-cel-gaulish</td></tr>
1629      * <tr><td>en-GB-oed</td><td>en-GB-x-oed</td></tr>
1630      * <tr><td>i-default</td><td>en-x-i-default</td></tr>
1631      * <tr><td>i-enochian</td><td>und-x-i-enochian</td></tr>
1632      * <tr><td>i-mingo</td><td>see-x-i-mingo</td></tr>
1633      * <tr><td>zh-min</td><td>nan-x-zh-min</td></tr>

1634      * </tbody>
1635      * </table>
1636      *
1637      * <p>For a list of all grandfathered tags, see the
1638      * IANA Language Subtag Registry (search for "Type: grandfathered").
1639      *
1640      * <p><b>Note</b>: there is no guarantee that <code>toLanguageTag</code>
1641      * and <code>forLanguageTag</code> will round-trip.
1642      *
1643      * @param languageTag the language tag
1644      * @return The locale that best represents the language tag.
1645      * @throws NullPointerException if <code>languageTag</code> is <code>null</code>
1646      * @see #toLanguageTag()
1647      * @see java.util.Locale.Builder#setLanguageTag(String)
1648      * @since 1.7
1649      */
1650     public static Locale forLanguageTag(String languageTag) {
1651         LanguageTag tag = LanguageTag.parse(languageTag, null);
1652         InternalLocaleBuilder bldr = new InternalLocaleBuilder();
1653         bldr.setLanguageTag(tag);


2756     /**
2757      * This enum provides constants to select a filtering mode for locale
2758      * matching. Refer to <a href="http://tools.ietf.org/html/rfc4647">RFC 4647
2759      * Matching of Language Tags</a> for details.
2760      *
2761      * <p>As an example, think of two Language Priority Lists each of which
2762      * includes only one language range and a set of following language tags:
2763      *
2764      * <pre>
2765      *    de (German)
2766      *    de-DE (German, Germany)
2767      *    de-Deva (German, in Devanagari script)
2768      *    de-Deva-DE (German, in Devanagari script, Germany)
2769      *    de-DE-1996 (German, Germany, orthography of 1996)
2770      *    de-Latn-DE (German, in Latin script, Germany)
2771      *    de-Latn-DE-1996 (German, in Latin script, Germany, orthography of 1996)
2772      * </pre>
2773      *
2774      * The filtering method will behave as follows:
2775      *
2776      * <table class="striped">
2777      * <caption>Filtering method behavior</caption>
2778      * <thead>
2779      * <tr>
2780      * <th>Filtering Mode</th>
2781      * <th>Language Priority List: {@code "de-DE"}</th>
2782      * <th>Language Priority List: {@code "de-*-DE"}</th>
2783      * </tr>
2784      * </thead>
2785      * <tbody>
2786      * <tr>
2787      * <td style="vertical-align:top">
2788      * {@link FilteringMode#AUTOSELECT_FILTERING AUTOSELECT_FILTERING}
2789      * </td>
2790      * <td style="vertical-align:top">
2791      * Performs <em>basic</em> filtering and returns {@code "de-DE"} and
2792      * {@code "de-DE-1996"}.
2793      * </td>
2794      * <td style="vertical-align:top">
2795      * Performs <em>extended</em> filtering and returns {@code "de-DE"},
2796      * {@code "de-Deva-DE"}, {@code "de-DE-1996"}, {@code "de-Latn-DE"}, and
2797      * {@code "de-Latn-DE-1996"}.
2798      * </td>
2799      * </tr>
2800      * <tr>
2801      * <td style="vertical-align:top">
2802      * {@link FilteringMode#EXTENDED_FILTERING EXTENDED_FILTERING}
2803      * </td>
2804      * <td style="vertical-align:top">
2805      * Performs <em>extended</em> filtering and returns {@code "de-DE"},


2825      * <td style="vertical-align:top">
2826      * {@link FilteringMode#MAP_EXTENDED_RANGES MAP_EXTENDED_RANGES}
2827      * </td>
2828      * <td style="vertical-align:top">Same as above.</td>
2829      * <td style="vertical-align:top">
2830      * Performs <em>basic</em> filtering and returns {@code "de-DE"} and
2831      * {@code "de-DE-1996"} because {@code "de-*-DE"} is mapped to
2832      * {@code "de-DE"}.
2833      * </td>
2834      * </tr>
2835      * <tr>
2836      * <td style="vertical-align:top">
2837      * {@link FilteringMode#REJECT_EXTENDED_RANGES REJECT_EXTENDED_RANGES}
2838      * </td>
2839      * <td style="vertical-align:top">Same as above.</td>
2840      * <td style="vertical-align:top">
2841      * Throws {@link IllegalArgumentException} because {@code "de-*-DE"} is
2842      * not a valid basic language range.
2843      * </td>
2844      * </tr>
2845      * </tbody>
2846      * </table>
2847      *
2848      * @see #filter(List, Collection, FilteringMode)
2849      * @see #filterTags(List, Collection, FilteringMode)
2850      *
2851      * @since 1.8
2852      */
2853     public static enum FilteringMode {
2854         /**
2855          * Specifies automatic filtering mode based on the given Language
2856          * Priority List consisting of language ranges. If all of the ranges
2857          * are basic, basic filtering is selected. Otherwise, extended
2858          * filtering is selected.
2859          */
2860         AUTOSELECT_FILTERING,
2861 
2862         /**
2863          * Specifies extended filtering.
2864          */
2865         EXTENDED_FILTERING,


< prev index next >