gpt4 book ai didi

java - 在 Java 中从 Locale 创建 Locale.LanguageRange 的标准方法

转载 作者:搜寻专家 更新时间:2023-11-01 03:17:53 25 4
gpt4 key购买 nike

在 Java 中有没有一种方法可以从 Locale 创建 Locale.LanguageRange?

目前我这样做:

List<LanguageRange> ranges = 
Locale.LanguageRange.parse(
locale.toString() // locale.toString() gives en_GB
.replace('_', '-') // parse() needs en-GB
+ ";q=1.0"); // weight

感觉很脏,很不雅观。

是否有更好甚至标准的方法来做到这一点?我找不到。

最小工作示例:

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);
}
}

最佳答案

我使用 new LanguageRange(locale.toLanguageTag()) 从负责语法的 Locale 派生 LanguageRange

然而,通过将其提供给 Locale.lookup(),匹配是有限制的(它不会为 en 返回 en_GB)。

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

  1. 根据请求的区域设置过滤所有系统区域设置
  2. 查找第 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());
}

注意:考虑一个默认值以防 findBestMatch 返回 null

关于java - 在 Java 中从 Locale 创建 Locale.LanguageRange 的标准方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41824197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com