spring mvc 國際化的幾種方案


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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM