代码之家  ›  专栏  ›  技术社区  ›  x80486

基于spring boot中的accept语言检索语言环境

  •  0
  • x80486  · 技术社区  · 5 年前

    我有一个弹簧靴( 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;
    }
    

    …还有包裹(里面 ../src/main/resources/ )比如: messages.properties (后退) messages_en_US.properties 我是说, messages_de_DE.properties 等等。

    现在,我面临的挑战是,我不确定如何“读取”用户代理发送的区域设置,以便正确地读取捆绑包中的消息。我在注射 MessageSource ms ,并以编程方式读取以下消息:

    final Locale locale = ???
    ms.getMessage("message.duplicate-token", null, locale);
    

    有线索吗?

    我试过了 LocaleContextHolder.getLocale() 但它总是 en_US 是的。如果我硬编码 getMessage 打电话,我能找回正确的信息。所以我知道设置/配置在很大程度上是有效的。


    客户端正在使用 Accept-Language 标题和值,如: de-DE 我是说, en-US 等等。

    0 回复  |  直到 5 年前
        1
  •  2
  •   DEBENDRA DHINDA    5 年前

    您需要添加一个LocaleChangeInterceptor并按如下方式配置bean: 参考 Spring Boot internationalization 更多

    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        lci.setParamName("lang");
        return lci;
    }
    

    如果只想使用“Accept Language”头,则可以扩展AcceptHeaderLocalerResolver并可以自定义:

    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;
         }
    }