SpringMVC学习系列(8) 之 国际化

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

1)在 spring的配置文件中添加

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

2)在resources 下 建立文件夹 locale ,在locale下添加messages.properties、messages_zh_CN.properties、messages_en_US.properties三个文件

比如 resources/locale/messages_zh_CN.properties  下的内容

message.login.fail=登录失败
message.login.success=登录成功

比如 resources/locale/messages_en_US.properties  下的内容

message.login.fail=Login Fail
message.login.success=Login Success

3)在后台中读取资源化文件中的内容,并返回给前台

在Controller 文件添加一个方法

    @RequestMapping(value = "/testMessage.do")
    public String testMessage(HttpServletRequest request,Model model)
    {
        logger.debug("enter MainController.testMessage()");
        
        //从后台代码获取国际化信息
        RequestContext requestContext = new RequestContext(request);
        model.addAttribute("message", requestContext.getMessage("message.login.success"));
        return "testmessage";
    }

4)前台显示

<%@ 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/>
${message}

在前台上直接显示国际化文件中的内容
<spring:message code="message.login.fail" ></spring:message> </body> </html>

  

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

1)在 spring的配置文件中添加

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

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

2)在后台中

@RequestMapping(value = "/sessiontest", method = {RequestMethod.GET})
public String seesionTest(HttpServletRequest request, Model model,
@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);
model.addAttribute("message", requestContext.getMessage("message.login.success"));
return "testmessage";
}

 3) 同上

  4) 在jsp 页面上加入

使用session 切换
<a href="${ctx }/sessiontest?langType=zh">中文</a> | <a href="${ctx }/sessiontest?langType=en">英文</a><br/>
${message}<br>

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

同session 类似,不与session方式同时存在

1)在 spring的配置文件中添加

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

2)后台

@RequestMapping(value = "/cookietest", method = {RequestMethod.GET})
    public String cookietest(HttpServletRequest request, HttpServletResponse response, Model model,
        @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);
        model.addAttribute("message", requestContext.getMessage("message.login.success"));
        return "testmessage";
    }

 

 3) 同上

  4) 在jsp 页面上加入

使用cookie 切换
<a href="${ctx }/cookietest?langType=zh">中文</a> | <a href="${ctx }/cookietest?langType=en">英文</a><br/>
${message}<br>

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

1)自定义一个类

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;
    }
  
}

  2)在 spring的配置文件中添加

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

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

保存之后就可以在请求的URL后附上 locale=zh_CN 或 locale=en_US 

 

参考:http://www.cnblogs.com/liukemng/p/3750117.html

原文地址:https://www.cnblogs.com/panie2015/p/5855645.html