Pus*_*kar 36 java servlets http-accept-language
请求中的accept-language标头通常是一个很长的复杂字符串 -
例如.
Accept-Language : en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法在java中解析它?或者API可以帮助我做到这一点?
Bre*_*ail 44
我建议使用ServletRequest.getLocales()容器解析Accept-Language而不是试图自己管理复杂性.
Qia*_* Li 34
为了记录,现在可以使用Java 8:
Locale.LanguageRange.parse()
Run Code Online (Sandbox Code Playgroud)
Pet*_*ter 15
这是解析不需要servlet容器的Accept-Language头的另一种方法:
String header = "en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2";
for (String str : header.split(",")){
String[] arr = str.trim().replace("-", "_").split(";");
//Parse the locale
Locale locale = null;
String[] l = arr[0].split("_");
switch(l.length){
case 2: locale = new Locale(l[0], l[1]); break;
case 3: locale = new Locale(l[0], l[1], l[2]); break;
default: locale = new Locale(l[0]); break;
}
//Parse the q-value
Double q = 1.0D;
for (String s : arr){
s = s.trim();
if (s.startsWith("q=")){
q = Double.parseDouble(s.substring(2).trim());
break;
}
}
//Print the Locale and associated q-value
System.out.println(q + " - " + arr[0] + "\t " + locale.getDisplayLanguage());
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处找到Accept-Language标头和相关q值的说明:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
非常感谢Karl Knechtel和Mike Samuel.对原始问题的评论有助于我指出正确的方向.
我们正在使用 Spring boot 和 Java 8。这有效
在ApplicationConfig.java中这样写
@Bean
public LocaleResolver localeResolver() {
return new SmartLocaleResolver();
}
Run Code Online (Sandbox Code Playgroud)
我的常量类中有这个列表,其中包含我们支持的语言
List<Locale> locales = Arrays.asList(new Locale("en"),
new Locale("es"),
new Locale("fr"),
new Locale("es", "MX"),
new Locale("zh"),
new Locale("ja"));
Run Code Online (Sandbox Code Playgroud)
并将逻辑写在下面的类中。
public class SmartLocaleResolver extends AcceptHeaderLocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
if (StringUtils.isBlank(request.getHeader("Accept-Language"))) {
return Locale.getDefault();
}
List<Locale.LanguageRange> ranges = Locale.LanguageRange.parse("da,es-MX;q=0.8");
Locale locale = Locale.lookup(ranges, locales);
return locale ;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25766 次 |
| 最近记录: |