Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java语言环境创建Locale.LanguageRange的标准方法_Java_Localization_Java 8 - Fatal编程技术网

从Java语言环境创建Locale.LanguageRange的标准方法

从Java语言环境创建Locale.LanguageRange的标准方法,java,localization,java-8,Java,Localization,Java 8,在Java中,有没有一种方法可以从区域设置创建Locale.LanguageRange 目前,我这样做: List<LanguageRange> ranges = Locale.LanguageRange.parse( locale.toString() // locale.toString() gives en_GB .replace('_', '-') // parse() needs en-GB

在Java中,有没有一种方法可以从区域设置创建Locale.LanguageRange

目前,我这样做:

List<LanguageRange> ranges = 
        Locale.LanguageRange.parse(
                locale.toString()  // locale.toString() gives en_GB
                .replace('_', '-') // parse() needs en-GB
                + ";q=1.0");       // weight
列表范围=
Locale.LanguageRange.parse(
locale.toString()//locale.toString()给出了en_GB
.replace(“”,“-”)//parse()需要en GB
+“q=1.0”);//重量
它摸起来很脏,很不雅观

有没有更好的甚至是标准的方法?我找不到

最简单的工作示例:

import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Locale.LanguageRange;

public class LanguageUtil {
        public static Locale getClosestMatch(Locale locale, Locale defaultLocale, Collection<Locale> allowedLanguages) {
            List<LanguageRange> ranges = Locale.LanguageRange.parse(
                    locale.toString().replace('_', '-') + ";q=1.0," +           //exact match e.g. en-GB -> en-GB
                    locale.getLanguage() + ";q=0.5," +                          //close match e.g. en-US -> en-GB
                    defaultLocale.toString().replace('_', '-') + ";q=0.0"));    //default match e.g. fr-FR -> en-GB
            return Locale.filter(ranges, allowedLanguages).get(0);
        }
    }
import java.util.Collection;
导入java.util.List;
导入java.util.Locale;
导入java.util.Locale.LanguageRange;
公共类语言util{
公共静态区域设置getClosestMatch(区域设置、区域设置defaultLocale、集合允许语言){
列表范围=Locale.LanguageRange.parse(
locale.toString().replace(“”,“-”)+“q=1.0,”+//精确匹配,例如en-GB->en-GB
locale.getLanguage()+“q=0.5”,+//接近匹配,例如en-US->en-GB
defaultLocale.toString().replace(“”,“-”)+“q=0.0”);//默认匹配,例如fr fr->en GB
返回Locale.filter(范围、允许的语言).get(0);
}
}

我使用
新的LanguageRange(locale.toLanguageTag())
从负责语法的
区域设置派生
LanguageRange

但是,通过将其输入到
Locale.lookup()
中,匹配将受到限制(对于
en
,它不会返回
en\u GB

因此,我最终采用了两步机制:

  • 按请求的区域设置筛选所有系统区域设置
  • lookup
    步骤1的结果列表与支持的区域设置的最佳匹配
  • 源代码:

    List<Locale> allAvailableLocales = Arrays.asList(Locale.getAvailableLocales());
    
    private Locale findBestMatch(final List<Locale> requested, final List<Locale> supported) {
        final List<LanguageRange> languageRanges = toLanguageRanges(requested);
    
        final List<Locale> allMatches = Locale.filter(languageRanges, allAvailableLocales);
        final Locale bestMatch = Locale.lookup(toLanguageRanges(allMatches), supported);
    
        return bestMatch;
    }
    
    private static List<LanguageRange> toLanguageRanges(final List<Locale> locales) {
        final ArrayList<LanguageRange> languageRanges = new ArrayList<>();
        for (final Locale locale : locales) {
            languageRanges.add(toLanguageRange(locale));
        }
        return languageRanges;
    }
    
    private static LanguageRange toLanguageRange(final Locale locale) {
        return new LanguageRange(locale.toLanguageTag());
    }
    
    List allAvailableLocales=Arrays.asList(Locale.getavailablecales());
    专用区域设置findBestMatch(请求最终列表,支持最终列表){
    最终列表语言范围=toLanguageRanges(请求);
    最终列表allMatches=Locale.filter(languageRanges,allAvailableLocales);
    final Locale bestMatch=Locale.lookup(支持toLanguageRanges(所有匹配项));
    返回最佳匹配;
    }
    专用静态列表toLanguageRanges(最终列表区域设置){
    最终ArrayList languageRanges=新ArrayList();
    for(最终语言环境:语言环境){
    add(toLanguageRange(locale));
    }
    返回语言范围;
    }
    私有静态LanguageRange到LanguageRange(最终语言环境){
    返回新的LanguageRange(locale.toLanguageTag());
    }
    

    备注:考虑默认情况下<代码> FunBestMatals<代码>返回>代码> NUL> /COD> .< /P>使用此方法,并在执行语言标记查找示例代码上运行以下测试:1。将

    allAvailableLocales
    supported
    设置为一个由“en-US”、“de-de”、“fr-fr”、“zh-CN”和“en-GB”表示的区域设置列表。2.将请求的
    设置为“fr CA”表示的区域设置列表。两个代码示例(此答案和链接教程中的答案)都返回
    null
    。返回“fr”区域设置作为“fr CA”的最佳匹配是否有意义?