Class -- 09 -- Locale类常用方法解析

  • 2022-07-16 22:42:39

这次主要整理下 Java 中 Locale 类的常用方法


一、Locale 类定义

  • Locale 类位于 java.util 包中,主要用于语言的国际化

  • Locale 表示语言环境,每一个 Locale 对象都代表了一个特定的地理、政治或文化区域

  • Locale 类提供了三种方式来获取 Locale 对象

    • 使用 Locale.getDefault() 方法

      • 获取默认 Locale
    • 使用 Locale 类提供的静态对象

      • 如:Locale.CHINA
    • 使用构造方法

      • Locale(String language)

      • Locale(String language, String country)

      • Locale(String language, String country, String variant)


二、Locale 类常用方法

  • 实例方法

    • getLanguage()

      • 获取当前 Locale 的语言代码

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getLanguage()); // zh
        

    • getCountry()

      • 获取当前 Locale 的国家/地区代码

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getCountry()); // CN
        

    • getScript()

      • 获取当前 Locale 的脚本

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getScript()); // ""
        

    • getVariant()

      • 获取当前 Locale 的语言变体 (可以理解为方言,如:粤语 (yue))

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getVariant()); // yue
        

    • getDisplayLanguage()

      • 获取适合展示给用户的 Locale 语言名称

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getDisplayLanguage()); // 中文
        
    • getDisplayLanguage(Locale inLocale)

      • inLocale

        • 需要展示的 Locale
      • 获取适合展示给用户的 Locale 语言名称,并根据 inLocale 进行本地化

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getDisplayLanguage(Locale.CHINA)); // 中文
        System.out.println(locale.getDisplayLanguage(Locale.US)); // Chinese
        

    • getDisplayCountry()

      • 获取适合展示给用户的 Locale 国家/地区名称

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getDisplayCountry()); // 中国
        
    • getDisplayCountry(Locale inLocale)

      • inLocale

        • 需要展示的 Locale
      • 获取适合展示给用户的 Locale 国家/地区名称,并根据 inLocale 进行本地化

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getDisplayCountry(Locale.CHINA)); // 中国
        System.out.println(locale.getDisplayCountry(Locale.US)); // China
        

    • getDisplayScript()

      • 获取适合展示给用户的 Locale 脚本名称

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getDisplayScript()); // ""
        
    • getDisplayScript(Locale inLocale)

      • inLocale

        • 需要展示的 Locale
      • 获取适合展示给用户的 Locale 脚本名称,并根据 inLocale 进行本地化

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getDisplayScript(Locale.CHINA)); // ""
        System.out.println(locale.getDisplayScript(Locale.US)); // ""
        

    • getDisplayVariant()

      • 获取适合展示给用户的 Locale 语言变体名称 (可以理解为方言)

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getDisplayVariant()); // yue
        
    • getDisplayVariant(Locale inLocale)

      • inLocale

        • 需要展示的 Locale
      • 获取适合展示给用户的 Locale 语言变体名称 (可以理解为方言),并根据 inLocale 进行本地化

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getDisplayVariant(Locale.CHINA)); // yue
        System.out.println(locale.getDisplayVariant(Locale.US)); // yue
        

    • getDisplayName()

      • 获取适合展示给用户的 Locale 名称

      • 是 getDisplayLanguage()、getDisplayScript()、getDisplayCountry()、getDisplayVariant() 四个方法返回值组成的一个字符串

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getDisplayName()); // 中文 (中国,yue)
        
    • getDisplayName(Locale inLocale)

      • inLocale

        • 需要展示的 Locale
      • 获取适合展示给用户的 Locale 名称,并根据 inLocale 进行本地化

      • 是 getDisplayLanguage()、getDisplayScript()、getDisplayCountry()、getDisplayVariant() 四个方法返回值组成的一个字符串

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getDisplayName(Locale.CHINA)); // 中文 (中国,yue)
        System.out.println(locale.getDisplayName(Locale.US)); // Chinese (China,yue)
        

    • getISO3Country()

      • 获取当前 Locale 的国家/地区代码的三字母缩写 (多用于国际上的正式场合)

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getISO3Country()); // CHN
        

    • getISO3Language()

      • 获取当前 Locale 的语言代码的三字母缩写 (多用于国际上的正式场合)

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getISO3Language()); // zho
        

    • stripExtensions()

      • 获取当前 Locale 不带扩展的副本

      • 如果当前 Locale 没有扩展名,则返回此 Locale

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.stripExtensions()); // zh_CN_yue
        

    • toLanguageTag()

      • 获取当前 Locale 设置的格式完好的语言标记

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.toLanguageTag()); // zh-CN-x-lvariant-yue
        

    • hasExtensions()

      • 如果当前 Locale 带有扩展,则返回 true;否则返回 false

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.hasExtensions()); // false
        

    • getExtensionKeys()

      • 获取与当前 Locale 相关联的扩展键值集

      • 如果当前 Locale 不带有扩展,则返回空的扩展键值集 (返回的集合是不可修改的,且键值都是小写的)

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getExtensionKeys()); // []
        

    • getUnicodeLocaleKeys()

      • 获取与当前 Locale 相关联的 Unicode 语言环境键值集

      • 如果当前 Locale 没有,则返回空的 Unicode 语言环境键值集 (返回的集合是不可修改的,且键值都是小写的)

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getUnicodeLocaleKeys()); // []
        

    • getUnicodeLocaleAttributes()

      • 获取与当前 Locale 相关联的 Unicode 语言环境属性集

      • 如果当前 Locale 没有,则返回空的 Unicode 语言环境属性集 (返回的集合是不可修改的)

        Locale locale = new Locale("zh", "CN", "yue");
        System.out.println(locale.getUnicodeLocaleAttributes()); // []
        

    • getExtension(char key)

      • key

        • 扩展的 key 值
      • 获取与当前 Locale 相关联的指定 key 值的扩展

      • 如果没有与该 key 值相关联的扩展,则返回 null

      • 为了格式整齐, key 值不区分大小写,且必须从 [0-9A-Za-z] 中取值

        Locale locale = new Locale("zh", "CN", "yue");
        locale.getExtension('A'); // ""
        

    • getUnicodeLocaleType(String key)

      • key

        • Unicode Locale 的 key 值
      • 获取与当前 Locale 相关联的指定 key 值的 Unicode 语言环境类型

      • 若果 key 值未定义,则返回 null

      • 为了格式整齐, key 值为两个字符,不区分大小写,且必须从 [0-9A-Za-z] 中取值

        Locale locale = new Locale("zh", "CN", "yue");
        locale.getUnicodeLocaleType("AA"); // ""
        

  • 静态方法

    • Locale.getDefault()

      • 获取默认 Locale

        System.out.println(Locale.getDefault()); // zh_CN
        

    • setDefault(Locale newLocale)

      • newLocale

        • 新的默认 Locale
      • 设置默认 Locale

        Locale.setDefault(new Locale("zh", "CN", "yue"));
        System.out.println(Locale.getDefault()); // zh_CN_yue
        

    • Locale.getAvailableLocales()

      • 获取所有可获得的 Locale

        System.out.println(Arrays.toString(Locale.getAvailableLocales()));
        
        // [, ar_AE, ar_JO, ar_SY, hr_HR, fr_BE, es_PA, mt_MT, es_VE, bg, zh_TW, it, ko, 
        // uk, lv, da_DK, es_PR, vi_VN, en_US, sr_ME, sv_SE, es_BO, en_SG, ar_BH, pt, 
        // ar_SA, sk, ar_YE, hi_IN, ga, en_MT, fi_FI, et, sv, cs, sr_BA_#Latn, el, uk_UA,
        // hu, fr_CH, in, es_AR, ar_EG, ja_JP_JP_#u-ca-japanese, es_SV, pt_BR, be,
        // is_IS, cs_CZ, es, pl_PL, tr, ca_ES, sr_CS, ms_MY, hr, lt, es_ES, es_CO, bg_BG, 
        // sq, fr, ja, sr_BA, is, es_PY, de, es_EC, es_US, ar_SD, en, ro_RO, en_PH, 
        // ca, ar_TN, sr_ME_#Latn, es_GT, sl, ko_KR, el_CY, es_MX, ru_RU, es_HN, zh_HK, 
        // no_NO_NY, hu_HU, th_TH, ar_IQ, es_CL, fi, ar_MA, ga_IE, mk, tr_TR, et_EE,
        // ar_QA, sr__#Latn, pt_PT, fr_LU, ar_OM, th, sq_AL, es_DO, es_CU, ar, ru, en_NZ, 
        // sr_RS, de_CH, es_UY, ms, el_GR, iw_IL, en_ZA, th_TH_TH_#u-nu-thai, hi,
        // fr_FR, de_AT, nl, no_NO, en_AU, vi, nl_NL, fr_CA, lv_LV, de_LU, es_CR, ar_KW, 
        // sr, ar_LY, mt, it_CH, da, de_DE, ar_DZ, sk_SK, lt_LT, it_IT, en_IE, zh_SG, 
        // ro, en_CA, nl_BE, no, pl, zh_CN, ja_JP, de_GR, sr_RS_#Latn, iw, en_IN, ar_LB, 
        // es_NI, zh, mk_MK, be_BY, sl_SI, es_PE, in_ID, en_GB]
        

    • Locale.getISOCountries()

      • 获取 ISO 3166 标准中定义的所有国家/地区代码

        System.out.println(Arrays.toString(Locale.getISOCountries()));
        
        // [AD, AE, AF, AG, AI, AL, AM, AN, AO, AQ, AR, AS, AT, AU, AW, AX, AZ, BA, BB, BD, 
        // BE, BF, BG, BH, BI, BJ, BL, BM, BN, BO, BQ, BR, BS, BT, BV, BW, BY, BZ, CA, CC, CD, 
        // CF, CG, CH, CI, CK, CL, CM, CN, CO, CR, CU, CV, CW, CX, CY, CZ, DE, DJ, DK, DM, DO, 
        // DZ, EC, EE, EG, EH, ER, ES, ET, FI, FJ, FK, FM, FO, FR, GA, GB, GD, GE, GF, GG, GH, 
        // GI, GL, GM, GN, GP, GQ, GR, GS, GT, GU, GW, GY, HK, HM, HN, HR, HT, HU, ID, IE, IL, 
        // IM, IN, IO, IQ, IR, IS, IT, JE, JM, JO, JP, KE, KG, KH, KI, KM, KN, KP, KR, KW, KY, 
        // KZ, LA, LB, LC, LI, LK, LR, LS, LT, LU, LV, LY, MA, MC, MD, ME, MF, MG, MH, MK, ML, 
        // MM, MN, MO, MP, MQ, MR, MS, MT, MU, MV, MW, MX, MY, MZ, NA, NC, NE, NF, NG, NI, NL, 
        // NO, NP, NR, NU, NZ, OM, PA, PE, PF, PG, PH, PK, PL, PM, PN, PR, PS, PT, PW, PY, QA, 
        // RE, RO, RS, RU, RW, SA, SB, SC, SD, SE, SG, SH, SI, SJ, SK, SL, SM, SN, SO, SR, SS, 
        // ST, SV, SX, SY, SZ, TC, TD, TF, TG, TH, TJ, TK, TL, TM, TN, TO, TR, TT, TV, TW, TZ, 
        // UA, UG, UM, US, UY, UZ, VA, VC, VE, VG, VI, VN, VU, WF, WS, YE, YT, ZA, ZM, ZW]
        

    • Locale.getISOLanguages()

      • 获取 ISO 639 标准中定义的所有语言代码

        // [aa, ab, ae, af, ak, am, an, ar, as, av, ay, az, ba, be, bg, bh, bi, bm, bn, bo, br, 
        // bs, ca, ce, ch, co, cr, cs, cu, cv, cy, da, de, dv, dz, ee, el, en, eo, es, et, eu, fa, 
        // ff, fi, fj, fo, fr, fy, ga, gd, gl, gn, gu, gv, ha, he, hi, ho, hr, ht, hu, hy, hz, ia, 
        // id, ie, ig, ii, ik, in, io, is, it, iu, iw, ja, ji, jv, ka, kg, ki, kj, kk, kl, km, kn, 
        // ko, kr, ks, ku, kv, kw, ky, la, lb, lg, li, ln, lo, lt, lu, lv, mg, mh, mi, mk, ml, mn, 
        // mo, mr, ms, mt, my, na, nb, nd, ne, ng, nl, nn, no, nr, nv, ny, oc, oj, om, or, os, pa, 
        // pi, pl, ps, pt, qu, rm, rn, ro, ru, rw, sa, sc, sd, se, sg, si, sk, sl, sm, sn, so, sq, 
        // sr, ss, st, su, sv, sw, ta, te, tg, th, ti, tk, tl, tn, to, tr, ts, tt, tw, ty, ug, uk, 
        // ur, uz, ve, vi, vo, wa, wo, xh, yi, yo, za, zh, zu]
        

    • Locale.filter(List priorityList, Collection locales)

      • priorityList

        • 用户的语言优先级列表,其中每个语言标记根据优先级降序排序
      • locales

        • 用于匹配的 Locale 实例列表
      • 根据 RFC 4647 标准中定义的过滤机制筛选出匹配的 Locale 实例列表

      • 其底层调用了 filter(priorityList, locales, FilteringMode.AUTOSELECT_FILTERING) 方法

        String ranges = "zh-CN;q=0.2, ja-JP;q=0.4, en-US;q=0.6";
        List<Locale.LanguageRange> priorityList = Locale.LanguageRange.parse(ranges);
        List<Locale> locales = Arrays.asList(new Locale("zh", "CN"), new Locale("en", "US"));
        List<Locale> filter = Locale.filter(priorityList, locales);
        System.out.println(filter); // [en_US, zh_CN]
        
    • Locale.filter(List priorityList, Collection locales, FilteringMode mode)

      • priorityList

        • 用户的语言优先级列表,其中每个语言标记根据优先级降序排序
      • locales

        • 用于匹配的 Locale 实例列表
      • mode

        • 过滤模式

          名称 作用
          AUTOSELECT_FILTERING 基于给定 Locale 列表的自动过滤模式
          EXTENDED_FILTERING 扩展过滤模式
          IGNORE_EXTENDED_RANGES 指定过滤模式,将忽略给定 Locale 列表中包含的扩展语言范围
          MAP_EXTENDED_RANGES 指定过滤模式,如果给定的 Locale 列表中包含扩展语言范围,
          则将其映射到基本语言范围
          REJECT_EXTENDED_RANGES 指定过滤模式,如果给定的 Locale 列表中包含扩展语言范围,
          则拒绝该列表,并抛出异常
      • 根据 RFC 4647 标准中定义的过滤机制筛选出匹配的 Locale 实例列表

        String ranges = "zh-CN;q=0.2, ja-JP;q=0.4, en-US;q=0.6";
        List<Locale.LanguageRange> priorityList = Locale.LanguageRange.parse(ranges);
        List<Locale> locales = Arrays.asList(new Locale("zh", "CN"), new Locale("en", "US"));
        List<Locale> filter = Locale.filter(priorityList, locales, Locale.FilteringMode.AUTOSELECT_FILTERING);
        System.out.println(filter); // [en_US, zh_CN]
        

    • Locale.filterTags(List priorityList, Collection tags)

      • priorityList

        • 用户的语言优先级列表,其中每个语言标记根据优先级降序排序
      • tags

        • 用于匹配的语言标记列表
      • 根据 RFC 4647 标准中定义的过滤机制筛选出匹配的语言标记列表

      • 其底层调用了 filterTags(priorityList, tags, FilteringMode.AUTOSELECT_FILTERING) 方法

        String ranges = "zh-CN;q=0.2, ja-JP;q=0.4, en-US;q=0.6";
        List<Locale.LanguageRange> priorityList = Locale.LanguageRange.parse(ranges);
        List<String> tags = Arrays.asList("zh-CN", "en-US");
        List<String> filterTags = Locale.filterTags(priorityList, tags);
        System.out.println(filterTags); // [en-us, zh-cn]
        
    • Locale.filterTags(List priorityList, Collection tags, FilteringMode mode)

      • priorityList

        • 用户的语言优先级列表,其中每个语言标记根据优先级降序排序
      • tags

        • 用于匹配的语言标记列表
      • mode

        • 过滤模式
      • 根据 RFC 4647 标准中定义的过滤机制筛选出匹配的语言标记列表

        String ranges = "zh-CN;q=0.2, ja-JP;q=0.4, en-US;q=0.6";
        List<Locale.LanguageRange> priorityList = Locale.LanguageRange.parse(ranges);
        List<String> tags = Arrays.asList("zh-CN", "en-US");
        List<String> filterTags = Locale.filterTags(priorityList, tags, Locale.FilteringMode.AUTOSELECT_FILTERING);
        System.out.println(filterTags); // [en-us, zh-cn]
        

    • Locale.lookup(List priorityList, Collection locales)

      • priorityList

        • 用户的语言优先级列表,其中每个语言标记根据优先级降序排序
      • locales

        • 用于匹配的 Locale 实例列表
      • 根据 RFC 4647 标准中定义的查找机制返回最佳匹配的 Locale 实例

        String ranges = "zh-CN;q=0.2, ja-JP;q=0.4, en-US;q=0.6";
        List<Locale.LanguageRange> priorityList = Locale.LanguageRange.parse(ranges);
        List<Locale> locales = Arrays.asList(new Locale("zh", "CN"), new Locale("en", "US"));
        Locale lookup = Locale.lookup(priorityList, locales);
        System.out.println(lookup); // en_US
        

    • Locale.lookupTag(List priorityList, Collection tags)

      • priorityList

        • 用户的语言优先级列表,其中每个语言标记根据优先级降序排序
      • tags

        • 用于匹配的语言标记列表
      • 根据 RFC 4647 标准中定义的查找机制返回最佳匹配的语言标记

        String ranges = "zh-CN;q=0.2, ja-JP;q=0.4, en-US;q=0.6";
        List<Locale.LanguageRange> priorityList = Locale.LanguageRange.parse(ranges);
        List<String> tags = Arrays.asList("zh-CN", "en-US");
        String tag = Locale.lookupTag(priorityList, tags);
        System.out.println(tag); // en-us
        

    • Locale.forLanguageTag(String languageTag)

      • languageTag

        • 语言标记
      • 根据 IETF BCP 47 标准获取指定语言标记代表的 Locale

        Locale locale = Locale.forLanguageTag("zh-CN-x-lvariant-yue");
        System.out.println(locale); // zh_CN_yue
        

三、参考资料

猜你喜欢