首先配置咱们项目的service-servlet.xml文件添加的内容以下:web
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <!-- 国际化信息所在的文件名,根据ResourceBundleMessageSource类加载资源文件.\src\main\resources\messages\messages_en_US.properties --> <property name="basename" value="messages/messages" /> <!-- 若是在国际化资源文件中找不到对应代码的信息,就用这个代码做为名称 --> <property name="useCodeAsDefaultMessage" value="true" /> </bean> 1. 一.基于浏览器请求的国际化实现:
使用Controller测试,spring
@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET}) @ResponseBody public Result test(HttpServletRequest request){ public Result test(HttpServletRequest request,Model model){ //从后台代码获取国际化信息 RequestContext requestContext = new RequestContext(request); String msg = requestContext.getMessage("msg"); return new Result(true, msg, "返回数据"); }
经过设置浏览器请求测试:http://localhost:8080/xxx/nation/test浏览器
<mvc:interceptors> <!-- 国际化操做拦截器 若是采用基于(请求/Session/Cookie)则必需配置 --> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> </mvc:interceptors> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
使用controller测试cookie
@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET}) @ResponseBody public Result test(HttpServletRequest request, @RequestParam(value="langType", defaultValue="zh") String langType){ if(langType.equals("zh")){ Locale locale = new Locale("zh", "CN"); request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale); } else if(langType.equals("en")){ Locale locale = new Locale("en", "US"); request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale); }else{ request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale()); } //从后台代码获取国际化信息 RequestContext requestContext = new RequestContext(request); String msg = requestContext.getMessage("msg"); return new Result(true, msg, "返回数据"); }
经过设置浏览器请求测试:http://localhost:8080/xxx/nation/test?langType=zh 或者 http://localhost:8080/xxx/nation/test?langType=ensession
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
添加cookie设置mvc
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> <!-- 设置cookieName名称,能够根据名称经过js来修改设置,也能够像上面演示的那样修改设置,默认的名称为 类名+LOCALE(即:org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE--> <property name="cookieName" value="lang"/> <!-- 设置最大有效时间,若是是-1,则不存储,浏览器关闭后即失效,默认为Integer.MAX_INT--> <property name="cookieMaxAge" value="100000" /> <!-- 设置cookie可见的地址,默认是“/”即对网站全部地址都是可见的,若是设为其它地址,则只有该地址或其后的地址才可见--> <property name="cookiePath" value="/" /> </bean>
使用Controller测试app
@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET}) @ResponseBody public Result test(HttpServletRequest request, HttpServletResponse response,@RequestParam(value="langType", defaultValue="zh") String langType){ if(langType.equals("zh")){ Locale locale = new Locale("zh", "CN"); (new CookieLocaleResolver()).setLocale (request, response, locale); }else if(langType.equals("en")){ Locale locale = new Locale("en", "US"); (new CookieLocaleResolver()).setLocale (request, response, locale); }else (new CookieLocaleResolver()).setLocale (request, response, LocaleContextHolder.getLocale()); //从后台代码获取国际化信息 RequestContext requestContext = new RequestContext(request); String msg = requestContext.getMessage("msg"); return new Result(true, msg, "返回数据"); }
<bean id="localeResolver" class="xx.xxx.xxx.UrlAcceptHeaderLocaleResolver"/>
UrlAcceptHeaderLocaleResolver为自定义实现,具体代码以下:测试
public class UrlAcceptHeaderLocaleResolver extends AcceptHeaderLocaleResolver { private Locale urlLocal; public Locale resolveLocale(HttpServletRequest request) { return urlLocal!=null?urlLocal:request.getLocale(); } public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { urlLocal = locale; } }
@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET}) @ResponseBody public Result test(HttpServletRequest request){ public Result test(HttpServletRequest request,Model model){ //从后台代码获取国际化信息 RequestContext requestContext = new RequestContext(request); String msg = requestContext.getMessage("msg"); return new Result(true, msg, "返回数据"); }
5.总结下,以上几种其实都是基于网站
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <!-- 国际化信息所在的文件名 --> <property name="basename" value="messages/messages" /> <!-- 若是在国际化资源文件中找不到对应代码的信息,就用这个代码做为名称 --> <property name="useCodeAsDefaultMessage" value="true" /> </bean>
这里无非是读取messages目录下以messages开头的几种配置文件,借助MessageSource根据local读取相应的配置文件中的信息ui
Locale locale = new Locale("en", "US"); String message = msr.getMessage("msg", new Object [] {"userDao"}, "Required", locale); System.out.println(message);
因此其实控制local即选择相应的处理方式,而以上几种均是经过拦截器注入不一样的local来实现,这里咱们能够本身实现符合本身业务场景的实现方式
做者:勃列日涅夫连接:https://www.jianshu.com/p/680fc53dc3cc来源:简书简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。