package com.whyc.config; import com.whyc.constant.YamlProperties; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.lang.NonNull; import org.springframework.web.servlet.LocaleResolver; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Locale; /** * i18n自定义LocaleResolver */ @Configuration public class I18nLocaleResolver implements LocaleResolver { @Autowired private HttpServletRequest request; public Locale getLocal() { return resolveLocale(request); } /** * 从HttpServletRequest中获取Locale * 优先级: * 配置文件指定>从request指定lang>从session中获取lang>本机语言环境获取Locale * * @param httpServletRequest httpServletRequest * @return 语言Local */ @Override public Locale resolveLocale(HttpServletRequest httpServletRequest) { //如果没有就使用默认的(根据主机的语言环境生成一个 Locale Locale locale = Locale.getDefault(); //配置文件指定 String i18nLanguage = YamlProperties.i18nLanguage; if(StringUtils.isNotBlank(i18nLanguage)){ if(i18nLanguage.startsWith("zh")){ locale = Locale.CHINESE; }else{ locale = Locale.US; } } else if(httpServletRequest!=null) { //获取请求中的语言参数 String language = httpServletRequest.getParameter("lang"); //从session中获取lang String language2 = (String) httpServletRequest.getSession().getAttribute("lang"); //如果请求的链接中携带了 国际化的参数 if (!StringUtils.isEmpty(language)) { //zh_CN String[] s = language.split("_"); //国家,地区 locale = new Locale(s[0], s[1]); } else if (!StringUtils.isEmpty(language2)) { if ((language2.startsWith("zh"))) { locale = Locale.SIMPLIFIED_CHINESE; } else { //不是中文,则采用en_US locale = Locale.US; } } } return locale; } /** * 用于实现Locale的切换。比如SessionLocaleResolver获取Locale的方式是从session中读取,但如果 * 用户想要切换其展示的样式(由英文切换为中文),那么这里的setLocale()方法就提供了这样一种可能 * * @param request HttpServletRequest * @param httpServletResponse HttpServletResponse * @param locale locale */ @Override public void setLocale(@NonNull HttpServletRequest request, HttpServletResponse httpServletResponse, Locale locale) { } }