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

Aru*_*run 11 java rest spring localization spring-boot

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

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

并且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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在下面的常量类中比较了标题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'并用西班牙语给出我想要的值.我需要在这里进行哪些更改才能使代码生效?

Aru*_*run 16

解决方案是:

public class SmartLocaleResolver extends AcceptHeaderLocaleResolver 
Run Code Online (Sandbox Code Playgroud)

代替

public class SmartLocaleResolver extends SessionLocaleResolver
Run Code Online (Sandbox Code Playgroud)

以下是更新的代码:

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Locale;

import com.bbtransact.tss.api.commons.http.HttpConstants;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;

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