详解SpringMVC学习系列之国际化

时间:2022-08-22 13:59:02

在系列(7)中我们讲了数据的格式化显示,spring在做格式化展示的时候已经做了国际化处理,那么如何将我们网站的其它内容(如菜单、标题等)做国际化处理呢?这就是本篇要将的内容—>国际化。

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

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

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

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

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.demo.web.controllers;
 
import java.util.date;
import javax.servlet.http.httpservletrequest;
import org.springframework.stereotype.controller;
import org.springframework.ui.model;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.requestmethod;
import org.springframework.web.servlet.support.requestcontext;
import com.demo.web.models.formatmodel;
 
@controller
@requestmapping(value = "/global")
public class globalcontroller {
  
  @requestmapping(value="/test", method = {requestmethod.get})
  public string test(httpservletrequest request,model model){
    if(!model.containsattribute("contentmodel")){
      
      //从后台代码获取国际化信息
      requestcontext requestcontext = new requestcontext(request);
      model.addattribute("money", requestcontext.getmessage("money"));
      model.addattribute("date", requestcontext.getmessage("date"));
 
      
      formatmodel formatmodel=new formatmodel();
 
      formatmodel.setmoney(12345.678);
      formatmodel.setdate(new date());
      
      model.addattribute("contentmodel", formatmodel);
    }
    return "globaltest";
  }
  
}

这里展示模型还用系列(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
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<%@ page language="java" contenttype="text/html; charset=utf-8"
  pageencoding="utf-8"%>
<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">
 
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
 
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>insert title here</title>
</head>
<body>
 
 
  下面展示的是后台获取的国际化信息:<br/>
  ${money}<br/>
  ${date}<br/>
 
  下面展示的是视图中直接绑定的国际化信息:<br/>
  <spring:message code="money"/>:<br/>
  <spring:eval expression="contentmodel.money"></spring:eval><br/>
  <spring:message code="date"/>:<br/>
  <spring:eval expression="contentmodel.date"></spring:eval><br/>
  
</body>
</html>

运行测试:

详解SpringMVC学习系列之国际化

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

详解SpringMVC学习系列之国际化

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

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

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

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

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<%@ page language="java" contenttype="text/html; charset=utf-8"
  pageencoding="utf-8"%>
<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">
 
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
 
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>insert title here</title>
</head>
<body>
  <a href="test?langtype=zh" rel="external nofollow" >中文</a> | <a href="test?langtype=en" rel="external nofollow" >英文</a><br/>
 
  下面展示的是后台获取的国际化信息:<br/>
  ${money}<br/>
  ${date}<br/>
 
  下面展示的是视图中直接绑定的国际化信息:<br/>
  <spring:message code="money"/>:<br/>
  <spring:eval expression="contentmodel.money"></spring:eval><br/>
  <spring:message code="date"/>:<br/>
  <spring:eval expression="contentmodel.date"></spring:eval><br/>
  
</body>
</html>

更改globalcontroller.java为如下内容:

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.demo.web.controllers;
 
import java.util.date;
import java.util.locale;
import javax.servlet.http.httpservletrequest;
import org.springframework.context.i18n.localecontextholder;
import org.springframework.stereotype.controller;
import org.springframework.ui.model;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.requestmethod;
import org.springframework.web.bind.annotation.requestparam;
import org.springframework.web.servlet.i18n.sessionlocaleresolver;
import org.springframework.web.servlet.support.requestcontext;
import com.demo.web.models.formatmodel;
 
@controller
@requestmapping(value = "/global")
public class globalcontroller {
  
  @requestmapping(value="/test", method = {requestmethod.get})
  public string test(httpservletrequest request,model model, @requestparam(value="langtype", defaultvalue="zh") string langtype){
    if(!model.containsattribute("contentmodel")){
      
      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);
      model.addattribute("money", requestcontext.getmessage("money"));
      model.addattribute("date", requestcontext.getmessage("date"));
 
      
      formatmodel formatmodel=new formatmodel();
 
      formatmodel.setmoney(12345.678);
      formatmodel.setdate(new date());
      
      model.addattribute("contentmodel", formatmodel);
    }
    return "globaltest";
  }
  
}

运行测试:

详解SpringMVC学习系列之国际化

详解SpringMVC学习系列之国际化

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

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

 

复制代码 代码如下:

<bean id="localeresolver" class="org.springframework.web.servlet.i18n.sessionlocaleresolver" />

 

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

 

复制代码 代码如下:

<bean id="localeresolver" class="org.springframework.web.servlet.i18n.cookielocaleresolver" />

 

更改globalcontroller.java为如下内容:

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.demo.web.controllers;
 
import java.util.date;
import java.util.locale;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import org.springframework.context.i18n.localecontextholder;
import org.springframework.stereotype.controller;
import org.springframework.ui.model;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.requestmethod;
import org.springframework.web.bind.annotation.requestparam;
import org.springframework.web.servlet.i18n.cookielocaleresolver;
//import org.springframework.web.servlet.i18n.sessionlocaleresolver;
import org.springframework.web.servlet.support.requestcontext;
 
import com.demo.web.models.formatmodel;
 
@controller
@requestmapping(value = "/global")
public class globalcontroller {
  
  @requestmapping(value="/test", method = {requestmethod.get})
  public string test(httpservletrequest request, httpservletresponse response, model model, @requestparam(value="langtype", defaultvalue="zh") string langtype){
    if(!model.containsattribute("contentmodel")){
      
      /*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());*/
      
      if(langtype.equals("zh")){
        locale locale = new locale("zh", "cn");
        //request.getsession().setattribute(sessionlocaleresolver.locale_session_attribute_name,locale);
        (new cookielocaleresolver()).setlocale (request, response, locale);
      }
      else if(langtype.equals("en")){
        locale locale = new locale("en", "us");
        //request.getsession().setattribute(sessionlocaleresolver.locale_session_attribute_name,locale);
        (new cookielocaleresolver()).setlocale (request, response, locale);
      }
      else
        //request.getsession().setattribute(sessionlocaleresolver.locale_session_attribute_name,localecontextholder.getlocale());
        (new cookielocaleresolver()).setlocale (request, response, localecontextholder.getlocale());
      
      //从后台代码获取国际化信息
      requestcontext requestcontext = new requestcontext(request);
      model.addattribute("money", requestcontext.getmessage("money"));
      model.addattribute("date", requestcontext.getmessage("date"));
 
      
      formatmodel formatmodel=new formatmodel();
 
      formatmodel.setmoney(12345.678);
      formatmodel.setdate(new date());
      
      model.addattribute("contentmodel", formatmodel);
    }
    return "globaltest";
  }
  
}

运行测试:

详解SpringMVC学习系列之国际化

详解SpringMVC学习系列之国际化

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

 
?
1
 
2
3
4
5
6
7
8
<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>

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

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

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.locale;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import org.springframework.web.servlet.dispatcherservlet;
import org.springframework.web.servlet.localeresolver;
 
public class myacceptheaderlocaleresolver extends acceptheaderlocaleresolver {
 
  private locale mylocal;
 
  public locale resolvelocale(httpservletrequest request) {
    return mylocal;
  }
 
  public void setlocale(httpservletrequest request, httpservletresponse response, locale locale) {
    mylocal = locale;
  }
 
}

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

 

复制代码 代码如下:

<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 来改变语言了,具体这里不再做演示了。

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

代码下载:springmvci18n.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://www.cnblogs.com/liukemng/p/3750117.html