2014-10-07 28 views
0

我想國際化我的頁面,但我只找到映射屬性文件的解決方案,這不是一個好方法。如何處理多語言網址Spring mvc

http://example.com/action 
http://example.com/es/action

我想在控制器之前處理URL以瞭解應該返回哪一種語言並返回該語言。

請參閱下面的示例;

@RequestMapping(value= "/{lang}/action") 
public ModelAndView dashboard(@PathVariable String lang) { 
    ModelAndView mav; 

    if(lang.equals("")) mav = new ModelAndView("index"); 
    else if(lang.equals("es") mav = new ModelAndView("index-es"); 

    ... 
} 

我知道這也不是一個好的解決方案。這就是爲什麼我需要一些想法來解決它?

回答

0

我使用攔截器來確定語言,並使用spring localeResolver中的構建來使用該信息。我第一次閱讀網址(或任何地方的地方)。我使用xx-XX格式的語言環境。

private Locale getLocaleFromUrl(String url) { 
    Locale result = null; 
    String localePart; 
    int slashes = url.indexOf('/', 1); 
    if (slashes == -1) { 
     // Use full URL 
     localePart = url.substring(1); 
    } else { 
     localePart = url.substring(1, slashes); 
    } 
    int dashPosition = localePart.indexOf('-'); 
    if (dashPosition > -1) { 
     result = new Locale(localePart.substring(0, dashPosition), localePart.substring(dashPosition + 1)); 
    } 
    return result; 

} 

之後,我從進入的網址中去除的語言環境,做這樣的事情:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { 
boolean redirected = doRedirect(request, response, url, urlLocale, RequestHelper.getContextPath()); 
if (!redirected) { 
    String newUrl = stripUrl(locale, url); 
if (newUrl.isEmpty()) { 
    newUrl = "/"; 
} 
request.setAttribute("gsforwared", Boolean.TRUE); 
request.setAttribute("originalUrl", newUrl); 
RequestDispatcher rd = request.getRequestDispatcher(newUrl); 
rd.forward(request, response); 

}

private boolean doRedirect(HttpServletRequest request, HttpServletResponse response, String url, String urlLocale, String contextPath) { 
if (StringUtils.startsWith(url, "/".concat(urlLocale))) { 
return false; 
} 
if (url.startsWith("/static")) { 
return false; 
} 
if (url.startsWith("/error")) { 
return false; 
} 
String redirUrl = "/".concat(urlLocale).concat(url); 
if (request.getQueryString() != null) { 
redirUrl = redirUrl.concat("?").concat(request.getQueryString()); 
} 
response.setHeader("Location", contextPath + redirUrl); 
response.sendError(HttpServletResponse.SC_MOVED_PERMANENTLY); 
return true; 
} 

我也是一個屬性添加到我之前檢查請求這樣做,這樣我就不會連續循環。

您的請求應該沒有區域設置轉發