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