Spring Boot本地化问题 – Accept-Language标头

我们正在使用Spring Boot作为应用程序。 在ApplicationConfig.java中,我有以下代码

@Bean public LocaleResolver localeResolver() { return new SmartLocaleResolver(); } 

并且SmartLocaleResolver.java位于下方

 public class SmartLocaleResolver extends SessionLocaleResolver { @Override public Locale resolveLocale(HttpServletRequest request) { final String acceptLanguage = request.getHeader("Accept-Language"); if (acceptLanguage.contains(",")) { String[] aheader = acceptLanguage.split(",[ ]*"); for (String locale : aheader) { if (ApplicationConstants.LOCALE.contains(locale)) { locale.trim(); return Locale.forLanguageTag(locale); } } } else if (!acceptLanguage.contains(",") && !acceptLanguage.isEmpty()) { if (ApplicationConstants.LOCALE.contains(acceptLanguage)) { return Locale.forLanguageTag(acceptLanguage); } } return request.getLocale(); } } 

我在下面的常量类中比较了标题Accept-Language中的值。

public static final List LOCALE = Collections .unmodifiableList(Arrays.asList(“en”,“es”));

我知道在实际情况下,标题将像Accept-Language:fr,es; q = 0.8,en-us; q = 0.6但是出于测试目的,我将其传递如下。

接受语言:fr,es,en

代码还没有完成,但我只是测试邮递员,看看代码是否选择“es”作为语言环境并给我本地化的结果。

我没有messages_fr.properties文件,但我有messages_es.properties所以我希望如果应用程序从下面的代码中设置区域设置,它会选择Locale作为’es’并以西class牙语提供我想要的值。 我需要在这里进行哪些更改才能使代码生效?

解决方案是:公共类SmartLocaleResolver扩展AcceptHeaderLocaleResolver而不是公共类SmartLocaleResolver扩展SessionLocaleResolver

以下是更新的代码:

  public class SmartLocaleResolver extends AcceptHeaderLocaleResolver { @Override public Locale resolveLocale(HttpServletRequest request) { if (StringUtils.isBlank(request.getHeader("Accept-Language"))) { return Locale.getDefault(); } List list = Locale.LanguageRange.parse(request.getHeader("Accept-Language")); Locale locale = Locale.lookup(list, ApplicationConstants.LOCALES); return locale ; } } 

在我的常数类我有:

 List LOCALES = Arrays.asList(new Locale("en"), new Locale("es"), new Locale("fr"), new Locale("es", "MX"), new Locale("zh"), new Locale("ja"));