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> </th><th>modern replacement</th></tr>
1593 * <tr><td>art-lojban</td><td> </td><td>jbo</td></tr>
1594 * <tr><td>i-ami</td><td> </td><td>ami</td></tr>
1595 * <tr><td>i-bnn</td><td> </td><td>bnn</td></tr>
1596 * <tr><td>i-hak</td><td> </td><td>hak</td></tr>
1597 * <tr><td>i-klingon</td><td> </td><td>tlh</td></tr>
1598 * <tr><td>i-lux</td><td> </td><td>lb</td></tr>
1599 * <tr><td>i-navajo</td><td> </td><td>nv</td></tr>
1600 * <tr><td>i-pwn</td><td> </td><td>pwn</td></tr>
1601 * <tr><td>i-tao</td><td> </td><td>tao</td></tr>
1602 * <tr><td>i-tay</td><td> </td><td>tay</td></tr>
1603 * <tr><td>i-tsu</td><td> </td><td>tsu</td></tr>
1604 * <tr><td>no-bok</td><td> </td><td>nb</td></tr>
1605 * <tr><td>no-nyn</td><td> </td><td>nn</td></tr>
1606 * <tr><td>sgn-BE-FR</td><td> </td><td>sfb</td></tr>
1607 * <tr><td>sgn-BE-NL</td><td> </td><td>vgt</td></tr>
1608 * <tr><td>sgn-CH-DE</td><td> </td><td>sgg</td></tr>
1609 * <tr><td>zh-guoyu</td><td> </td><td>cmn</td></tr>
1610 * <tr><td>zh-hakka</td><td> </td><td>hak</td></tr>
1611 * <tr><td>zh-min-nan</td><td> </td><td>nan</td></tr>
1612 * <tr><td>zh-xiang</td><td> </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> </th><th>converts to</th></tr>
1622 * <tr><td>cel-gaulish</td><td> </td><td>xtg-x-cel-gaulish</td></tr>
1623 * <tr><td>en-GB-oed</td><td> </td><td>en-GB-x-oed</td></tr>
1624 * <tr><td>i-default</td><td> </td><td>en-x-i-default</td></tr>
1625 * <tr><td>i-enochian</td><td> </td><td>und-x-i-enochian</td></tr>
1626 * <tr><td>i-mingo</td><td> </td><td>see-x-i-mingo</td></tr>
1627 * <tr><td>zh-min</td><td> </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,
|