gpt4 book ai didi

java - Accept-Language header 和 ResourceBundle 之间缺少功能

转载 作者:行者123 更新时间:2023-12-02 03:59:54 27 4
gpt4 key购买 nike

Google foo 让我失望了。我想知道是否有一种标准的“按书本”方式将输入区域设置从 Accept-Language header 转换为正确的 ResourceBundle。

ResourceBundle::getBundle() 方法接受单个区域设置,但 Accept-Language 可以具有按索引加权的多个区域设置,例如:de; q=1.0,sl;q=0.9

当前代码:

@Context
private HttpServletRequest request;

public String getString(String key) {
ResourceBundle i18n = ResourceBundle.getBundle("locale/strings", this.request.getLocale());
return i18n.getString(key);
}

问题在于 getLocale() 返回首选语言环境,在本例中为 de。如果可用资源包是slen,这将尝试查找de,然后回退到 en,但客户端实际期望的结果是sl!

我的问题基本上是,我是否必须实现一个迭代 HttpServletRequest.getLocales() 的自定义回退代码(我不想重新发明轮子..)或者是否有更多标准且直接的方法?我还会选择一些能够填补这一空白的第 3 方库。

到目前为止的自定义解决方案:

@RequestScoped
public class Localization {

@Context
private HttpServletRequest request;

private ResourceBundle i18n;

@PostConstruct
void postConstruct() {
//List of locales from Accept-Language header
List<Locale> locales = Collections.list(request.getLocales());

if (locales.isEmpty()) {
//Fall back to default locale
locales.add(request.getLocale());
}

for (Locale locale : locales) {
try {
i18n = ResourceBundle.getBundle("bundles/translations", locale);
if (!languageEquals(i18n.getLocale(), locale)) {
//Default fallback detected
//The resource bundle that was returned has different language than the one requested, continue
//Only language tag is checked, no support for detecting different regions in this sample
continue;
}
break;
}
catch (MissingResourceException ignore) {
}
}
}

private boolean languageEquals(Locale first, Locale second) {
return getISO2Language(first).equalsIgnoreCase(getISO2Language(second));
}

private String languageGetISO2(Locale locale) {
String[] localeStrings = (locale.getLanguage().split("[-_]+"));
return localeStrings[0];
}

public ResourceBundle i18n() {
return this.i18n;
}
}

最佳答案

我会编写一个拦截器,在那里你可以设置你想要的语言并将你想要的逻辑应用到ThreadLocal中或将其传递下来。

即您检查可用语言并定义顺序或设置默认值。

如果您使用 Spring,则可以手动设置 LocaleContextHolder 或使用 LocaleContextResolver,而不是编写自己的拦截器。

关于java - Accept-Language header 和 ResourceBundle 之间缺少功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56739285/

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