上一篇博客 springMVC源碼分析--國際化LocaleResolver(一)中我們介紹了springMVC提供的國際化的解決方案,接下來我們根據springMVC提供的解決方案來簡單的實現一個多語言的支持。
一、基於Session的國際化實現
基於Session的國際化實現其實說來也簡單,就是在Session中保存語言信息Locale,這樣springMVC會從我們提供的多語言配置文件中讀取相關語言的信息。
(1)首先我們需要配置springMVC的多語言配置,因爲我們打算使用Session來實現,所有對於localeResolver我們要配置其實現類SessionLocaleResolver,在springMVC的配置文件中添加如下配置:
-
<span style="font-size:14px;"><bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/></span>
(2)這裏我們提供了一個多語言攔截器LanguageInterceptor,通過這個攔截器設置多語言信息,其實主要的代碼就是request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale),這樣springMVC會根據Locale的信息來獲得多語言。
-
<span style="font-size:14px;"> public class LanguageInterceptor implements HandlerInterceptor{
-
-
@Override
-
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
-
throws Exception {
-
String language = request.getParameter("language");
-
if (language != null&&language.equals("zh")) {
-
Locale locale = new Locale("zh", "CN");
-
request.getSession()
-
.setAttribute(
-
SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,
-
locale);
-
request.setAttribute("language", language);
-
} else if (language != null&&language.equals("en")) {
-
Locale locale = new Locale("en", "US");
-
request.getSession()
-
.setAttribute(
-
SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,
-
locale);
-
request.setAttribute("language", language);
-
} else {
-
request.getSession().setAttribute(
-
SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,
-
LocaleContextHolder.getLocale());
-
language = LocaleContextHolder.getLocale().getLanguage();
-
request.setAttribute("language", language);
-
}
-
return true;
-
}
-
@Override
-
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
-
ModelAndView modelAndView) throws Exception {
-
}
-
@Override
-
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
-
throws Exception {
-
}
-
-
}</span>
在springMVC的配置文件中配置攔截器
-
<span style="font-size:14px;"><mvc:interceptors>
-
-
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
-
<bean class="com.tianjunwei.interceptor.LanguageInterceptor"></bean>
-
</mvc:interceptors></span>
在工程中添加多語言配置文件,在src/main/resources目錄下新建messages目錄,分別添加中英文的多語言配置文件message_en_US.properties和message_zh_CN.properties,文件中以key = value的形式保存多語言信息
運行結果圖:
二、基於Cookie的國際化實現
與上面類似,我們首先創建一個攔截器用來將多語言信息寫到Cookie中,這樣就可以通過cookie來切換多語言了。
-
<span style="font-size:14px;"> public class LanguageCookieInterceptor implements HandlerInterceptor{
-
-
@Override
-
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
-
throws Exception {
-
String language = request.getParameter("language");
-
if (language != null&&language.equals("zh")) {
-
Locale locale = new Locale("zh", "CN");
-
(new CookieLocaleResolver()).setLocale (request, response, locale);
-
request.setAttribute("language", language);
-
} else if (language != null&&language.equals("en")) {
-
Locale locale = new Locale("en", "US");
-
(new CookieLocaleResolver()).setLocale (request, response, locale);
-
request.setAttribute("language", language);
-
} else {
-
(new CookieLocaleResolver()).setLocale (request, response,
-
LocaleContextHolder.getLocale());
-
language = LocaleContextHolder.getLocale().getLanguage();
-
request.setAttribute("language", language);
-
}
-
return true;
-
}
-
-
@Override
-
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
-
ModelAndView modelAndView) throws Exception {
-
-
}
-
-
@Override
-
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
-
throws Exception {
-
-
}
-
-
}</span>
springMVC的配置文件如下:
-
<span style="font-size:14px;"><mvc:interceptors>
-
-
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
-
-
<bean class="com.tianjunwei.interceptor.LanguageCookieInterceptor"></bean>
-
</mvc:interceptors>
-
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/></span>
這樣我們也可以實現通過Session實現的效果。