springboot国际化java
支持多国语言展现web
一、自动式国际化:经过浏览器发送请求头携带的信息自动使用国际化spring
二、手动式国际化:经过点击按钮,动态更改国际化浏览器
因为springboot自动配置中已集成国际化,直接使用便可springboot
一、建立语言包:(文件编码为: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 中文繁体
二、配置文件内容:(能够为空,但key不能不写)session
messages_zh_CN.properties user.title=用户登陆 user.welcome=欢迎使用 messages_en_US.properties user.title=User Login user.welcome=Welcome
三、初始化配置:jsp
spring.messages.basename=static/i18n/messages
四、取国际化内容:ide
<%@ 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
经过点击按钮,动态更改国际化
一、增长自定义区域解析器
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); } }
二、将自定义区域解析器注入容器
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(); } }
三、经过点击,使用对应的国际化
<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页面便可