springboot国际化
支持多国语言展示
1、自动式国际化:通过浏览器发送请求头携带的信息自动使用国际化
2、手动式国际化:通过点击按钮,动态更改国际化
由于springboot自动配置中已集成国际化,直接使用即可
1、创建语言包:(文件编码为:ascii)
/src/main/resources/
static/i18n/messages.properties 默认配置
static/i18n/messages_zh_CN.properties 中文配置
static/i18n/messages_en_US.properties 英文配置
static/i18n/messages_zh_TW.properties 中文繁体
2、配置文件内容:(可以为空,但key不能不写)
messages_zh_CN.properties
user.title=用户登录
user.welcome=欢迎使用
messages_en_US.properties
user.title=User Login
user.welcome=Welcome
3、初始化配置:
spring.messages.basename=static/i18n/messages
4、取国际化内容:
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<fmt:message key="user.welcome" />
注:
此种方法是根据浏览器请求中的Accept-Language决定的
Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
切换语言:
谷歌--设置--高级--语言--等
2.1
通过点击按钮,动态更改国际化
1、增加自定义区域解析器
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
/**
* @title: 自定义区域解析器
* @time: 2019年11月19日
*
* <msg>
* SpringBoot默认的Locale解析器是根据请求头的区域信息进行解析的(浏览器语言)
* 使用自定义的Locale解析器对url的区域信息进行解析达到点击切换区域效果
* 一旦我们自定义的区域解析器注册到Spring容器中,则SpringBoot提供的将不自动注册
* </msg>
*
*/
public class LocaleResolverConfig implements LocaleResolver {
/**
* 获取页面传输信息,执行对应的国际化
*/
@Override
public Locale resolveLocale(HttpServletRequest request) {
String lang = request.getParameter("lang");
if (!StringUtils.isEmpty(lang)) {
String[] langSplit = lang.split("_");
return new Locale(langSplit[0],langSplit[1]);
}
return Locale.getDefault();//使用默认配置
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
// 增加新语言时使用
//SessionLocaleResolver localeResolver = new SessionLocaleResolver();
//localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
}
}
2、将自定义区域解析器注入容器
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
/**
*
* @title: 初始化自定义bean
* @time: 2019年11月19日
*
*/
@Configuration
public class InitLocalConfig {
/**
* 注入-自定义区域解析器
* @return
*/
@Bean
public LocaleResolver localeResolver() {
return new LocaleResolverConfig();
}
}
3、通过点击,使用对应的国际化
<a href="<%=request.getContextPath()%>/?lang=zh_CN" >中文简体</a>
<a href="<%=request.getContextPath()%>/?lang=zh_TW" >中文繁体</a>
<a href="<%=request.getContextPath()%>/?lang=en_US" >English</a>
存在的问题一:
存在iframe跳转时,请求中的Accept-Language会改变原来解析,利用session转存即可
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import com.axa.pricingplatform.constants.CommonConstant;
/**
*
* @title: 自定义区域解析器
* @time: 2019年11月19日
*
* <msg>
* SpringBoot默认的Locale解析器是根据请求头的区域信息进行解析的(浏览器语言)
* 使用自定义的Locale解析器对url的区域信息进行解析达到点击切换区域效果
* 一旦我们自定义的区域解析器注册到Spring容器中,则SpringBoot提供的将不自动注册
* </msg>
*
*/
public class LocaleResolverConfig implements LocaleResolver {
/**
* 获取页面传输信息,执行对应的国际化
*/
@Override
public Locale resolveLocale(HttpServletRequest request) {
String lang = request.getParameter("lang");
if (!StringUtils.isEmpty(lang)) {
request.getSession().setAttribute(CommonConstant.LOGIN_LANG, lang);
String[] langSplit = lang.split("_");
return new Locale(langSplit[0],langSplit[1]);
}
lang = (String) request.getSession().getAttribute(CommonConstant.LOGIN_LANG);
if(!StringUtils.isEmpty(lang)){
String[] langSplit = lang.split("_");
return new Locale(langSplit[0],langSplit[1]);
}
return Locale.getDefault();//使用默认配置
}
}
问题二:
jstl在单独的js文件中,获取不到国际化的值
原因:
jstl、el的标签会转化为服务器端的代码执行,而js代码则在客户端执行
如果是单独的js文件,jstl、el表达式是不起作用的,
jstl、EL表达式是在服务端执行的,服务端执行完成后再传给客户端的,js是在客户端执行的,el在js前就被执行了
解决办法:
将单独的js合并至对应的jsp页面即可