>>分享流行的Java框架以及开源软件,对孙卫琴的《精通Spring》、《Spring Cloud Alibaba微服务开发零基础入门到实操》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 25748 个阅读者 刷新本主题
 * 贴子主题:  Spring MVC实现国际化的几种方式 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2025-07-05 03:27:04     消息  查看  搜索  好友  邮件  复制  引用

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

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

基于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, "返回数据");
    }

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






程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->面向对象开发方法概述之UML语言(下)
  JavaWeb开发-->Servlet技术详解(Ⅰ)
  JSP与Hibernate开发-->Spring、JPA与Hibernate的整合
  Java网络编程-->安全网络通信
  精通Spring-->绑定表单
  Vue3开发-->通过Vuex进行状态管理
  Netty初识
  Netty权威指南:I/O 多路复用技术
  Rust学习笔记 | 异步代码的几种写法
  9种设计模式在Spring中的运用,一定要非常熟练!
  微服务的拆分方式
  Redis solr一二事 - 在spring中使用jedis 连接调试单机redi...
  从零搭建一个基于 ELK 的日志、指标收集与监控系统
  使用 Flask-RESTful 设计 RESTful API
  【Web服务开发】基于Java开发代驾定位系统,2天完成脚手架
  网红框架SpringBoot2.x之定制参数浅析
  kubernetes 中的资源
  使用idea和gradle编译spring5源码
  vue项目编译75%时很慢的解决办法
  RESTful 架构详解
  Axis、Axis2和CXF比较
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。