zoukankan      html  css  js  c++  java
  • spring mvc 国际化的几种方案

    spring mvc 国际化的几种方案

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

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <!-- 国际化信息所在的文件名,根据ResourceBundleMessageSource类加载资源文件.srcmain
    esourcesmessagesmessages_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="u662Fu4E0Du662F"为中文,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
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 相关阅读:
    CAM350中DFM检验
    减少VMware中虚拟系统占用的内存资源
    嵌入式系统开发学习如何起步、如何深入
    GNOME3介绍与使用技巧
    局域网网络相关的问题
    开篇:讲讲peopleeditor遇到的问题
    WSDL
    常用shell命令(持续更新)
    X86寄存器及指令介绍
    float型与零值比较的语句;float型与float型如何判断相等
  • 原文地址:https://www.cnblogs.com/windy-xmwh/p/11245083.html
Copyright © 2011-2022 走看看