spring mvc 国际化的几种方案

spring mvc 国际化的几种方案

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

<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测试,spring

@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测试cookie

@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=ensession

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

 

添加cookie设置mvc

<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测试app

@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读取相应的配置文件中的信息ui

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来源:简书简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。

相关文章
相关标签/搜索