spring mvc 国际化的几种方案

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

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化信息所在的文件名,根据ResourceBundleMessageSource类加载资源文件.\src\main\resources\messages\messages_en_US.properties -->
<property name="basename" value="messages/messages" />
<!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称 -->
<property name="useCodeAsDefaultMessage" value="true" />
</bean>
1. 一.基于浏览器请求的国际化实现:

使用Controller测试,

@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET})
@ResponseBody
public Result test(HttpServletRequest request){
public Result test(HttpServletRequest request,Model model){
//从后台代码获取国际化信息
RequestContext requestContext = new RequestContext(request);
String msg = requestContext.getMessage("msg");
return new Result(true, msg, "返回数据");
}

  

通过设置浏览器请求测试:http://localhost:8080/xxx/nation/test

  • 注意: 上述基于浏览器设置,根据浏览器的本地来确定message
  1. 基于session的国际化
    在项目中的源文件夹resources/messages中添加messages.properties、messages_zh_CN.properties、messages_en_US.properties三个文件,其中messages.properties、messages_zh_CN.properties里面添加msg="\u662F\u4E0D\u662F"为中文,messages_en_US.properties里面的为msg="ok"。
    在项目的service-servlet.xml文件添加的内容如下,(之前ResourceBundleMessageSource的配置任然保留)
<mvc:interceptors>
<!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 -->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />

使用controller测试

@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET})
@ResponseBody
public Result test(HttpServletRequest request, @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);
String msg = requestContext.getMessage("msg");
return new Result(true, msg, "返回数据");
}

通过设置浏览器请求测试:http://localhost:8080/xxx/nation/test?langType=zh 或者 http://localhost:8080/xxx/nation/test?langType=en

  1. 基于cookie,与session类似
    移除session国际化的设置
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" /> 

添加cookie设置

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

使用Controller测试

@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET})
@ResponseBody
public Result test(HttpServletRequest request, HttpServletResponse response,@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);
String msg = requestContext.getMessage("msg");
return new Result(true, msg, "返回数据");
}
  1. 基于url国际化方式
    配置如下,移除上述localeResolver的bean改为下面的:
<bean id="localeResolver" class="xx.xxx.xxx.UrlAcceptHeaderLocaleResolver"/>

UrlAcceptHeaderLocaleResolver为自定义实现,具体代码如下:

public class UrlAcceptHeaderLocaleResolver extends AcceptHeaderLocaleResolver {

    private Locale urlLocal;

    public Locale resolveLocale(HttpServletRequest request) {

        return urlLocal!=null?urlLocal:request.getLocale();
} public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
urlLocal = locale;
} }
  • 之后就可以在请求的URL后附上 locale=zh_CN 或 locale=en_US 如 http://xxxxxxxx?locale=zh_CN 来改变语言了
    使用Controller测试,
@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET})
@ResponseBody
public Result test(HttpServletRequest request){
public Result test(HttpServletRequest request,Model model){
//从后台代码获取国际化信息
RequestContext requestContext = new RequestContext(request);
String msg = requestContext.getMessage("msg");
return new Result(true, msg, "返回数据");
}

5.总结下,以上几种其实都是基于

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

这里无非是读取messages目录下以messages开头的几种配置文件,借助MessageSource根据local读取相应的配置文件中的信息

Locale locale = new Locale("en", "US");
String message = msr.getMessage("msg",
new Object [] {"userDao"}, "Required", locale);
System.out.println(message);

所以其实控制local即选择相应的处理方式,而以上几种均是通过拦截器注入不同的local来实现,这里我们可以自己实现符合自己业务场景的实现方式

 

作者:勃列日涅夫
链接:https://www.jianshu.com/p/680fc53dc3cc
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

spring mvc 国际化的几种方案的更多相关文章

  1. Spring MVC(十六)--Spring MVC国际化实例

    上一篇文章总结了一下Spring MVC中实现国际化所需的配置,本文继上一文举一个完整的例子,我选择用XML的方式.我的场景是这样的: 访问一个页面时,这个页面有个表格,对表头中的列名实现国际化. 第 ...

  2. spring mvc 国际化

    spring mvc 国际化 使用CookieLocaleResolver实现国际化的步骤:1.注册 messageSource,localeResolver 两个bean2.调用localeReso ...

  3. Spring入门(十四):Spring MVC控制器的2种测试方法

    作为一名研发人员,不管你愿不愿意对自己的代码进行测试,都得承认测试对于研发质量保证的重要性,这也就是为什么每个公司的技术部都需要质量控制部的原因,因为越早的发现代码的bug,成本越低,比如说,Dev环 ...

  4. Spring MVC国际化配置

    Spring MVC国际化配置 前言 项目开发中要考虑支持国际化,框架选用的是Spring MVC框架,那么问题来了Spring MVC如何配置并实现国际化. 实现过程(Maven项目) 对于Spri ...

  5. spring MVC 拦截有几种实现方式

    spring MVC 拦截有几种实现方式 实现HandelInterceptor接口方式        继承HandelInterceptor 的方式.一般有这两种方式 spring 如何走单元测式 ...

  6. Spring MVC国际化

    本文基于Spring MVC 注解-让Spring跑起来.本文提到的国际化是Spring实现国际化的方案之一. (1) 在applicationContext.xml中添加以下配置信息: <!- ...

  7. spring mvc 参数传递的三种方式

    springmvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  8. spring mvc和web-flow的整合方案

    发现了一份整合spring MVC 和webflow的很好的资料,日后翻译出来发布.先记着. http://docs.spring.io/spring-webflow/docs/2.3.x/refer ...

  9. SpringBoot + Spring MVC国际化使用示例

    项目中需要显示中英文两种语言,所以需要对显示的内容进行国际化,如下是一个示例程序. 程序文件结构,如下图,后面详细列出各文件的代码. 1. 编写maven的pom.xml文件,如下: <proj ...

随机推荐

  1. PHP nl_langinfo() 函数

    定义和用法 nl_langinfo() 函数返回指定的本地信息. 注释:该函数无法在 Windows 平台上工作. 提示:与返回所有本地格式化信息的 localeconv() 函数不同,nl_lang ...

  2. Maven知识记录(一)初识Maven私服

    Maven知识记录(一)初识Maven私服 什么是maven私服 私服即私有的仓库.maven把存放文件的地方叫做仓库,我们可以理解成我门家中的储物间.而maven把存放文件的具体位置叫做坐标.我们项 ...

  3. PV与UV你的网站也可以

    个人博客网站分析 阅读前面的文章,有助于理解本文. 1.是时候来一个个人博客网站了 2.什么?你还没有自己的域名? 3.你的个人博客网站该上线了! 为什么需要流量分析? 各位小伙伴,请看下图,你们发现 ...

  4. 【NOIP2016】换教室 题解(期望DP)

    前言:状态贼鸡儿多,眼睛快瞎了. ----------------------- 题目链接 题目大意:给定$n(课程数),m(可换次数),v(教室数),e(无向边数)$,同时给定原定教室$c[i]$和 ...

  5. 你不是说你会Aop吗?

    一大早,小王就急匆匆的跑过来找我,说:周哥,那个记录日志的功能我想请教一下. 因为公司某个项目要跟别的平台做对接,我们这边需要给他们提供一套接口.昨天,我就将记录接口日志的工作安排给了小王. 下面是我 ...

  6. 关于bin文件写法及导入

    正常的python项目,打开看到的应该是一个个文件包,不同的功能模块放在不同的包里面: 通常是bin目录下的bin.py是程序的入口,下面的bin.py如何导入main.py并执行呢:

  7. Python | 常见的反爬及解决方法,值得收藏

    我们都知道Python用来爬数据,为了不让自家的数据被别人随意的爬走,你知道怎么反爬吗?今天播妞带着大家一起见识见识常见的反爬技术. 很多人学习python,不知道从何学起.很多人学习python,掌 ...

  8. LinuX操作系统基础------>软件的安装方式,chmod权限,vi编辑器的使用

    RPM包管理 -rpm命令管理 RPM包管理 -yum在线管理 文件权限管理 vi编辑器的使用和常用的快捷键 1.RPM包管理: 一种用于互联网下载包的打包及安装工具,RPM包管理分为rpm命令管理和 ...

  9. js 事件对象相关笔记

    事件对象     event就是一个事件对象 写到我们的监听函数的括号里面 当形参来看     事件对象只有有了事件才存在,他是系统给我们自动创建的 不需要我们传递参数     事件对象是我们事件的一 ...

  10. C#LeetCode刷题之#189-旋转数组(Rotate Array)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3700 访问. 给定一个数组,将数组中的元素向右移动 k 个位置, ...