根据 Spring Boot 中的 Accept-Language 检索语言环境

x80*_*486 6 java internationalization spring-boot

我有一个 Spring Boot ( 2.1.3.RELEASE) 应用程序,它使用 Jersey 来定义(RESTful)端点。我正在尝试根据用户代理发送的语言环境读取和传播一些消息。

我已经配置了这些 bean:

@Bean
public LocaleResolver localeResolver() {
  final AcceptHeaderLocaleResolver resolver = new AcceptHeaderLocaleResolver();
  resolver.setSupportedLocales(Arrays.asList(Locale.GERMANY, Locale.US));
  resolver.setDefaultLocale(Locale.ENGLISH);
  return resolver;
}

@Bean
public MessageSource messageSource() { // Not sure if this is needed
  final ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
  messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
  messageSource.setBasenames("classpath:/messages");
  messageSource.setUseCodeAsDefaultMessage(true);
  messageSource.setCacheSeconds(5);
  return messageSource;
}
Run Code Online (Sandbox Code Playgroud)

...还有包(内部../src/main/resources/),如:(messages.properties回退)messages_en_US.propertiesmessages_de_DE.properties、 等。

现在,挑战是我不确定如何“读取”用户代理发送的语言环境,以便适当地读取包中的消息。我正在注入一个MessageSource ms,并以编程方式读取消息,例如:

final Locale locale = ???
ms.getMessage("message.duplicate-token", null, locale);
Run Code Online (Sandbox Code Playgroud)

有什么线索吗?

我试过了,LocaleContextHolder.getLocale()但总是这样en_US。如果我为getMessage呼叫硬编码相应的语言环境,我就能够检索正确的消息。所以我知道设置/配置在很大程度上是有效的。


客户端使用Accept-Language标头发送区域设置- 以及诸如:de-DE、等值en-US

小智 7

我用的是豆子

  @Bean
  public LocaleResolver localeResolver() {
    AcceptHeaderLocaleResolver slr = new AcceptHeaderLocaleResolver();
    slr.setDefaultLocale(Locale.UK);
    return slr;
  }
Run Code Online (Sandbox Code Playgroud)

然后是另一个

  @Bean
  public LanguageUtil languageUtil() {
    return new LanguageUtil();
  }
Run Code Online (Sandbox Code Playgroud)

  private Locale getLocale() {
    return LocaleContextHolder.getLocale();
  }

  public String getLocalizedMessage(String messageKey) {
    return messageSource.getMessage(messageKey, null, getLocale());
  }
Run Code Online (Sandbox Code Playgroud)

header 被保存到 LocaleContextHolder 中,当你需要的时候就可以使用它。


DEB*_*NDA 5

您需要添加一个 LocaleChangeInterceptor 并按如下方式配置 bean:有关更多信息,请参阅Spring Boot 国际化

@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
    LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
    lci.setParamName("lang");
    return lci;
}
Run Code Online (Sandbox Code Playgroud)

如果您只想使用“Accept-Language”标头,那么您可以扩展 AcceptHeaderLocaleResolver 并可以自定义:

package com.deb.demo.config;

import java.util.Arrays;
import java.util.List;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;

import org.springframework.util.StringUtils;
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;

public class CustomLocaleResolver extends AcceptHeaderLocaleResolver {


    List<Locale> LOCALES = Arrays.asList(new Locale("en"),new Locale("es"),new Locale("fr"));


  @Override
  public Locale resolveLocale(HttpServletRequest request) {
     if (StringUtils.isEmpty(request.getHeader("Accept-Language"))) {
         return Locale.getDefault();
       }
     List<Locale.LanguageRange> list = Locale.LanguageRange.parse(request.getHeader("Accept-Language"));
     Locale locale = Locale.lookup(list,LOCALES);
      return locale;
     }
}
Run Code Online (Sandbox Code Playgroud)


Moh*_*bil 5

创建自定义 AcceptHeaderLocaleResolver

public class AcceptHeaderResolver extends AcceptHeaderLocaleResolver {

    List<Locale> LOCALES = Arrays.asList(new Locale("en"), new Locale("ar"));

    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        String headerLang = request.getHeader("Accept-Language");
        return headerLang == null || headerLang.isEmpty()
                ? Locale.getDefault()
                : Locale.lookup(Locale.LanguageRange.parse(headerLang), LOCALES);
    }


}
Run Code Online (Sandbox Code Playgroud)

@Configuration并且不要忘记在文件中使用它

@Bean
public LocaleResolver sessionLocaleResolver() {
    AcceptHeaderResolver localeResolver = new AcceptHeaderResolver();
    return localeResolver;
}
Run Code Online (Sandbox Code Playgroud)