三. SessionLocaleResolver 实现全程国际化
上面那个,只能够根据浏览器设置的语言来决定,是由浏览器来控制的,并不是由服务器代码进行控制的。 如果使用者想更换语言,那么还得修改自己浏览器的使用语言。 而浏览器使用语言,是与浏览器息息相关的,在搜索时是这样,在邮箱时也是这样, 不能因为你这一个服务程序就更换整个浏览器的设置。
需要有一个链接之类的东西,可以动态的进行选择性改变。 如,根据前台的链接选项,来进行动态的改变语言。
三.一 前端页面添加 两个语言的链接
<body> <h2>两个蝴蝶飞,国际化的使用</h2> <label>选择语言:</label> <a href="toLogin.action?request_locale=zh_CN">中文</a> <a href="toLogin.action?request_locale=en_US">美国</a> <form:form commandName="user" action="login.action" method="post"> <form:label path="name"><spring:message code="login.name"></spring:message>:</form:label> <form:input path="name"/><br/> <form:label path="age"><spring:message code="login.age"></spring:message>:</form:label> <form:input path="age"/><br/> <form:label path="description"><spring:message code="login.description"></spring:message>:</form:label> <form:textarea path="description"/><br/> <form:button><spring:message code="login.submit"></spring:message></form:button> </form:form> </body>
可以设置成链接,但最好是设置成 select 选择框。当改变option时,进行访问toLogin方法。 为了简便,这里使用链接来说明。
三.二 springmvc.xml 配置文件,配置SessionLocaleResolver
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <value>login</value> <!-- 可依次写多个 <value>success</value>--> </property> </bean> <!-- 配置国际化的拦截器 --> <mvc:interceptors> <!-- 必须配置 --> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean> </mvc:interceptors> <!-- 配置 SessionLocaleResolver 国际化bean,必须写 --> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
三.三 后端 toLogin() 方法时,设置 国际化语言
//转到登录的页面 @RequestMapping(value="toLogin") public String toLogin(String request_locale,Model model,HttpServletRequest request){ if(request_locale!=null&&!"".equals(request_locale)){ Locale locale=null; if("zh_CN".equals(request_locale)){ locale=new Locale("zh","CN"); System.out.println("1"); }else if("en_US".equals(request_locale)){ locale=new Locale("en","US"); System.out.println("2"); }else{ locale=LocaleContextHolder.getLocale(); System.out.println("3"); } request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, locale); }else{ request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, LocaleContextHolder.getLocale()); } model.addAttribute("user",new User()); return "user/login"; } //绑定到user对象。 @RequestMapping(value="login") public String login(@Validated User user,HttpServletRequest request,Model model){ System.out.println("接收值:"+user.toString()); model.addAttribute("user",user); return "user/list"; }
要求使用 SessionLocaleResolver 类中的 LOCALE_SESSION_ATTRIBUTE_NAME 这个属性,来进行设置更改。
三.四 重启服务器,进行测试
浏览器环境是 英文的,
刚进去访问时:
点击中文时,进行访问,页面上的国际化信息会改变
点击英文时,进行访问,会改变。
可以根据链接,进行随意的更改转换,与浏览器语言无关。
四. CookieLocaleResolver 国际化的使用
上面那个SessionLocaleResolver 可以通过链接进行改变,但在第一次进行访问的时候,没有传入参数值,是默认的英文。 当关闭浏览器时,再次访问,还是显示英文,即使上次保留的是中文。 Session在浏览器关闭时,被销毁了,这也是session的作用域。 没有办法将最后选择存储起来。 而Cookie 可以解决这一点,将国际化的信息放置在cookie 里面。
前端页面保持不变。
四.一 springmvc.xml 配置文件,配置CookieLocaleResolver
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <value>login</value> <!-- 可依次写多个 <value>success</value>--> </property> </bean> <!-- 配置国际化的拦截器 --> <mvc:interceptors> <!-- 必须配置 --> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean> </mvc:interceptors> <!-- 配置 SessionLocaleResolver 国际化bean,必须写 --> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"></bean>
四.二 后端 toLogin() 方法时,设置 国际化语言
@RequestMapping(value="toLogin") public String toLogin(String request_locale,Model model,HttpServletRequest request, HttpServletResponse response){ CookieLocaleResolver cookieResolver=new CookieLocaleResolver(); Cookie [] cookies=request.getCookies(); Cookie newCookie=getCookieByName(cookies,"locale"); if(newCookie==null){ //没有这个cookie,则设置为当前的。 默认是没有的,当点击那两个链接之后,就有了。 if(request_locale!=null&&!"".equals(request_locale)){ newCookie=new Cookie("locale",request_locale); newCookie.setMaxAge(60*60*24*7); newCookie.setPath("/SpringMVC06"); //设置项目名 response.addCookie(newCookie); Locale locale=null; if("zh_CN".equals(request_locale)){ locale=new Locale("zh","CN"); }else if("en_US".equals(request_locale)){ locale=new Locale("en","US"); }else{ locale=LocaleContextHolder.getLocale(); } cookieResolver.setLocale(request, response, locale); }else{ cookieResolver.setLocale(request, response, LocaleContextHolder.getLocale()); } }else{ if(request_locale!=null&&!"".equals(request_locale)){ Locale locale=null; if("zh_CN".equals(request_locale)){ locale=new Locale("zh","CN"); }else if("en_US".equals(request_locale)){ locale=new Locale("en","US"); }else{ locale=LocaleContextHolder.getLocale(); } if(newCookie!=null){ newCookie=new Cookie("locale",request_locale); newCookie.setValue(request_locale); newCookie.setMaxAge(60*60*24*7); newCookie.setPath("/SpringMVC06"); } response.addCookie(newCookie); cookieResolver.setLocale(request, response, locale); }else{ String value=newCookie.getValue(); Locale locale=null; if("zh_CN".equals(value)){ locale=new Locale("zh","CN"); }else if("en_US".equals(value)){ locale=new Locale("en","US"); }else{ locale=LocaleContextHolder.getLocale(); } cookieResolver.setLocale(request, response, locale); } } model.addAttribute("user",new User()); return "user/login"; } private Cookie getCookieByName(Cookie []cookies,String name){ if(cookies!=null){ for(int i=0;i<cookies.length;i++){ if(cookies[i].getName().equals(name)){ return cookies[i]; } } } return null; } //绑定到user对象。 @RequestMapping(value="login") public String login(@Validated User user,HttpServletRequest request,Model model){ System.out.println("接收值:"+user.toString()); model.addAttribute("user",user); return "user/list"; }
设置的是 CookieLocaleResolver .
四.三 重启服务器,进行验证。
还是浏览器是英文的状态下。
第一次访问时:
点击中文的链接,设置成中文之后,页面变成了中文,添加了cookie.
关闭浏览器。
再次进行访问时:
可知,可以保留上次的cookie值。
SpringMVC 设置的默认的cookie 名为 : org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE, 但不知道怎么使用的。
谢谢!!!