从Java语言环境创建Locale.LanguageRange的标准方法
在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
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”的最佳匹配是否有意义?