欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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
        

三、参考资料