如何将我们网站的其它内容(如菜单、标题等)做国际化处理呢?这就是本篇要将的内容—>国际化。

一.基于浏览器请求的国际化实现:

首先配置我们项目的springservlet-config.xml文件添加的内容如下:

  1. <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  2. <!-- 国际化信息所在的文件名 -->
  3. <property name="basename" value="messages" />
  4. <!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称 -->
  5. <property name="useCodeAsDefaultMessage" value="true" />
  6. </bean>

在com.demo.web.controllers包中添加GlobalController.java内容如下:

  1. package com.demo.web.controllers;
  2.  
  3. import java.util.Date;
  4. import javax.servlet.http.HttpServletRequest;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.ui.Model;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RequestMethod;
  9. import org.springframework.web.servlet.support.RequestContext;
  10. import com.demo.web.models.FormatModel;
  11.  
  12. @Controller
  13. @RequestMapping(value = "/global")
  14. public class GlobalController {
  15.  
  16. @RequestMapping(value="/test", method = {RequestMethod.GET})
  17. public String test(HttpServletRequest request,Model model){
  18. if(!model.containsAttribute("contentModel")){
  19.  
  20. //从后台代码获取国际化信息
  21. RequestContext requestContext = new RequestContext(request);
  22. model.addAttribute("money", requestContext.getMessage("money"));
  23. model.addAttribute("date", requestContext.getMessage("date"));
  24.  
  25. FormatModel formatModel=new FormatModel();
  26.  
  27. formatModel.setMoney(12345.678);
  28. formatModel.setDate(new Date());
  29.  
  30. model.addAttribute("contentModel", formatModel);
  31. }
  32. return "globaltest";
  33. }
  34.  
  35. }

这里展示模型还用系列(7)中的作为演示。

在项目中的源文件夹resources中添加messages.properties、messages_zh_CN.properties、 messages_en_US.properties三个文件,其中messages.properties、 messages_zh_CN.properties里面的"money", "date",为中文,messages_en_US.properties里面的为英文。

在views文件夹中添加globaltest.jsp视图,内容如下:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4.  
  5. <%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
  6.  
  7. <html>
  8. <head>
  9. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  10. <title>Insert title here</title>
  11. </head>
  12. <body>
  13.  
  14. 下面展示的是后台获取的国际化信息:<br/>
  15. ${money}<br/>
  16. ${date}<br/>
  17.  
  18. 下面展示的是视图中直接绑定的国际化信息:<br/>
  19. <spring:message code="money"/>:<br/>
  20. <spring:eval expression="contentModel.money"></spring:eval><br/>
  21. <spring:message code="date"/>:<br/>
  22. <spring:eval expression="contentModel.date"></spring:eval><br/>
  23.  
  24. </body>
  25. </html>

运行测试:

更改浏览器语言顺序,刷新页面:

二.基于Session的国际化实现:

在项目的springservlet-config.xml文件添加的内容如下(第一种时添加的内容要保留):

  1. <mvc:interceptors>
  2. <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 -->
  3. <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
  4. </mvc:interceptors>
  5.  
  6. <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />

更改globaltest.jsp视图为如下内容:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4.  
  5. <%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
  6.  
  7. <html>
  8. <head>
  9. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  10. <title>Insert title here</title>
  11. </head>
  12. <body>
  13. <a href="test?langType=zh">中文</a> | <a href="test?langType=en">英文</a><br/>
  14.  
  15. 下面展示的是后台获取的国际化信息:<br/>
  16. ${money}<br/>
  17. ${date}<br/>
  18.  
  19. 下面展示的是视图中直接绑定的国际化信息:<br/>
  20. <spring:message code="money"/>:<br/>
  21. <spring:eval expression="contentModel.money"></spring:eval><br/>
  22. <spring:message code="date"/>:<br/>
  23. <spring:eval expression="contentModel.date"></spring:eval><br/>
  24.  
  25. </body>
  26. </html>

更改GlobalController.java为如下内容:

  1. package com.demo.web.controllers;
  2.  
  3. import java.util.Date;
  4. import java.util.Locale;
  5. import javax.servlet.http.HttpServletRequest;
  6. import org.springframework.context.i18n.LocaleContextHolder;
  7. import org.springframework.stereotype.Controller;
  8. import org.springframework.ui.Model;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.RequestMethod;
  11. import org.springframework.web.bind.annotation.RequestParam;
  12. import org.springframework.web.servlet.i18n.SessionLocaleResolver;
  13. import org.springframework.web.servlet.support.RequestContext;
  14. import com.demo.web.models.FormatModel;
  15.  
  16. @Controller
  17. @RequestMapping(value = "/global")
  18. public class GlobalController {
  19.  
  20. @RequestMapping(value="/test", method = {RequestMethod.GET})
  21. public String test(HttpServletRequest request,Model model, @RequestParam(value="langType", defaultValue="zh") String langType){
  22. if(!model.containsAttribute("contentModel")){
  23.  
  24. if(langType.equals("zh")){
  25. Locale locale = new Locale("zh", "CN");
  26. request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
  27. }
  28. else if(langType.equals("en")){
  29. Locale locale = new Locale("en", "US");
  30. request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
  31. }
  32. else
  33. request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale());
  34.  
  35. //从后台代码获取国际化信息
  36. RequestContext requestContext = new RequestContext(request);
  37. model.addAttribute("money", requestContext.getMessage("money"));
  38. model.addAttribute("date", requestContext.getMessage("date"));
  39.  
  40. FormatModel formatModel=new FormatModel();
  41.  
  42. formatModel.setMoney(12345.678);
  43. formatModel.setDate(new Date());
  44.  
  45. model.addAttribute("contentModel", formatModel);
  46. }
  47. return "globaltest";
  48. }
  49.  
  50. }

运行测试:

三.基于Cookie的国际化实现:

把实现第二种方法时在项目的springservlet-config.xml文件中添加的

  1. <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />

注释掉,并添加以下内容:

  1. <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />

更改GlobalController.java为如下内容:

  1. package com.demo.web.controllers;
  2.  
  3. import java.util.Date;
  4. import java.util.Locale;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.springframework.context.i18n.LocaleContextHolder;
  8. import org.springframework.stereotype.Controller;
  9. import org.springframework.ui.Model;
  10. import org.springframework.web.bind.annotation.RequestMapping;
  11. import org.springframework.web.bind.annotation.RequestMethod;
  12. import org.springframework.web.bind.annotation.RequestParam;
  13. import org.springframework.web.servlet.i18n.CookieLocaleResolver;
  14. //import org.springframework.web.servlet.i18n.SessionLocaleResolver;
  15. import org.springframework.web.servlet.support.RequestContext;
  16.  
  17. import com.demo.web.models.FormatModel;
  18.  
  19. @Controller
  20. @RequestMapping(value = "/global")
  21. public class GlobalController {
  22.  
  23. @RequestMapping(value="/test", method = {RequestMethod.GET})
  24. public String test(HttpServletRequest request, HttpServletResponse response, Model model, @RequestParam(value="langType", defaultValue="zh") String langType){
  25. if(!model.containsAttribute("contentModel")){
  26.  
  27. /*if(langType.equals("zh")){
  28. Locale locale = new Locale("zh", "CN");
  29. request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
  30. }
  31. else if(langType.equals("en")){
  32. Locale locale = new Locale("en", "US");
  33. request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
  34. }
  35. else
  36. request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale());*/
  37.  
  38. if(langType.equals("zh")){
  39. Locale locale = new Locale("zh", "CN");
  40. //request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
  41. (new CookieLocaleResolver()).setLocale (request, response, locale);
  42. }
  43. else if(langType.equals("en")){
  44. Locale locale = new Locale("en", "US");
  45. //request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
  46. (new CookieLocaleResolver()).setLocale (request, response, locale);
  47. }
  48. else
  49. //request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale());
  50. (new CookieLocaleResolver()).setLocale (request, response, LocaleContextHolder.getLocale());
  51.  
  52. //从后台代码获取国际化信息
  53. RequestContext requestContext = new RequestContext(request);
  54. model.addAttribute("money", requestContext.getMessage("money"));
  55. model.addAttribute("date", requestContext.getMessage("date"));
  56.  
  57. FormatModel formatModel=new FormatModel();
  58.  
  59. formatModel.setMoney(12345.678);
  60. formatModel.setDate(new Date());
  61.  
  62. model.addAttribute("contentModel", formatModel);
  63. }
  64. return "globaltest";
  65. }
  66.  
  67. }

运行测试:

关于<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />3个属性的说明(可以都不设置而用其默认值):

  1. <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
  2. <!-- 设置cookieName名称,可以根据名称通过js来修改设置,也可以像上面演示的那样修改设置,默认的名称为 类名+LOCALE(即:org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE-->
  3. <property name="cookieName" value="lang"/>
  4. <!-- 设置最大有效时间,如果是-1,则不存储,浏览器关闭后即失效,默认为Integer.MAX_INT-->
  5. <property name="cookieMaxAge" value="100000">
  6. <!-- 设置cookie可见的地址,默认是“/”即对网站所有地址都是可见的,如果设为其它地址,则只有该地址或其后的地址才可见-->
  7. <property name="cookiePath" value="/">
  8. </bean>

四.基于URL请求的国际化的实现:

首先添加一个类,内容如下:

  1. import java.util.Locale;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import org.springframework.web.servlet.DispatcherServlet;
  5. import org.springframework.web.servlet.LocaleResolver;
  6.  
  7. public class MyAcceptHeaderLocaleResolver extends AcceptHeaderLocaleResolver {
  8.  
  9. private Locale myLocal;
  10.  
  11. public Locale resolveLocale(HttpServletRequest request) {
  12. return myLocal;
  13. }
  14.  
  15. public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
  16. myLocal = locale;
  17. }
  18.  
  19. }

然后把实现第二种方法时在项目的springservlet-config.xml文件中添加的

  1. <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />

注释掉,并添加以下内容:

  1. <bean id="localeResolver" class="xx.xxx.xxx.MyAcceptHeaderLocaleResolver"/>

“xx.xxx.xxx”是刚才添加的MyAcceptHeaderLocaleResolver 类所在的包名。

保存之后就可以在请求的URL后附上 locale=zh_CN 或 locale=en_US 如 http://xxxxxxxx?locale=zh_CN 来改变语言了,具体这里不再做演示了。

国际化部分的内容到此结束。

SpringMVC国际化的更多相关文章

  1. 【SpringMVC】SpringMVC系列14之SpringMVC国际化

    14.SpringMVC国际化 14.1.概述 14.2.用户切换选择语言

  2. springmvc国际化 基于请求的国际化配置

    springmvc国际化 基于请求的国际化配置 基于请求的国际化配置是指,在当前请求内,国际化配置生效,否则自动以浏览器为主. 项目结构图: 说明:properties文件中为国际化资源文件.格式相关 ...

  3. springmvc国际化 基于浏览器语言的国际化配置

    当前标签: springmvc   springmvc国际化 基于浏览器语言的国际化配置 苏若年 2013-10-09 13:03 阅读:305 评论:0   SpringMVC中应用Ajax异步通讯 ...

  4. 基于session 的springMvc 国际化

    项目中采用springMvc的框架,需要动态切换语言,找了一些资料,最后决定采用基于session的动态切换,实现动态切换中文,英文,韩文,其实就是把中文翻译成其他语言显示 springMvc国际化包 ...

  5. JAVA记录-SpringMVC国际化配置

    1.搭建SpringMVC框架,不过多阐述 2.spring-mvc.xml加入以下配置: <!-- 国际化资源配置,资源文件绑定器--> <bean id="messag ...

  6. 【问题记录】springmvc国际化问题

    异常-Cannot change HTTP accept header - use a different locale resolution strategy springmvc国际化时,local ...

  7. 学习SpringMVC——国际化+上传+下载

    每个星期一道菜,这个星期也不例外~~~ 一个软件,一个产品,都是一点点开发并完善起来的,功能越来越多,性能越来越强,用户体验越来越好……这每个指标的提高都需要切切实实的做点东西出来,好比,你的这个产品 ...

  8. SpringMVC 国际化

    SpringMVC学习系列(8) 之 国际化 在系列(7)中我们讲了数据的格式化显示,Spring在做格式化展示的时候已经做了国际化处理,那么如何将我们网站的其它内容(如菜单.标题等)做国际化处理呢? ...

  9. SpringMVC 国际化-中英文切换

    项目结构 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http: ...

  10. SpringMVC国际化支持

    这周公司领导希望我对一个项目,出一个国际化的解决方案,研究两个小时,采用了SpringMVC的国际化支持,在此记录下. 原理: 在DispatchServlet中注册localeResolver(区域 ...

随机推荐

  1. css常用公共样式

    /*style reset*/ body,ul,p,h1,h2,h3,h4,h5,h6,dl,dd,form,input,textarea,select{padding:0; margin:0;fon ...

  2. oracle查询一个时间段每天的数据量

    1.需求: 从所有数据中,查出一个时间段中每天的数据量,即:按日做汇总. 2.SQL语句模板: select trunc(date_col) date, sum(num_col) num, count ...

  3. Jquery 点击图片在弹出层显示大图

    http://blog.csdn.net/wongwaidah/article/details/28432427(案例链接出处,本人只是转载收藏) <html> <head> ...

  4. win10删除或更改需要SYSTEM或Administrators权限的文件夹

    有时候我们需要删除一些系统文件夹或者文件,但是却经常会出现如下提示: 遇到这些情况,我们可以采用如下的解决手段. 一.右键单击需要更改或删除的文件夹,选择属性. 二.在弹出的窗口菜单里,选择“安全”选 ...

  5. tomcat 7.0 之文件配置

  6. SpaceSniffer 硬盘透视软件

    SpaceSniffer是一个可以让您硬盘中文件和文件夹的分布情况的应用程序. 可以用来查找一些不易发现的文件,因为它提供一些特殊的搜索方式,特别是对于清理磁盘,找出占磁盘空间较大文件的位置很有帮助.

  7. Java中封装、继承和多态

    封装: 封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度. 适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性. 访问修饰符有public,private,prot ...

  8. ubuntu kylin 16.04系统的基本安装

    系统版本:ubuntu kylin 16.04 硬件状况:500G HDD+120G SSD 已安装操作系统:WIN 10专业版(craked) ——WIN 10系统是装在SSD的第一个盘符内的.以前 ...

  9. Kindle Unlimited上的技术书籍

            直达链接:Kindle Unlimited         前不久,亚马逊在中国也推出了电子书包月服务.消息不灵通的我过了好久才看到这个消息,随后第一时间上官网查看具体情况.      ...

  10. jd-gui报错INTERNAL ERROR 解决办法

    问题:我用dex2jar工具反编译了apk文件,但当我用jd-gui反编译前面操作获得的jar文件的时,能很完美地看到大部分类反编译后的代码,但有一部分类不能显示出来--constants类,仅仅显示 ...