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

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

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

1
2
3
4
5
6
<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  下的内容

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

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

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

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

在Controller 文件添加一个方法

1
2
3
4
5
6
7
8
9
10
@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)前台显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ 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}<br><br>在前台上直接显示国际化文件中的内容<br><spring:message code="message.login.fail" ></spring:message>
</body>
</html>

  

 

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

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

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" />

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 页面上加入

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

 

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

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

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

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

2)后台

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@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 页面上加入

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

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

1)自定义一个类

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

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

1
<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

 

posted @   panie2015  阅读(230)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示