以下是Spring整合FreeMarker进行国际化的过程:
1、在spring-servlet.xml(具体看自己项目中的命名)加入以下代码段:
<!-- Configures Handler Interceptors -->
<mvc:interceptors>
<bean class="cn.com.web.interceptor.UserLocaleChangeInterceptor" />
</mvc:interceptors>
<!-- Saves a locale change using a cookie -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" >
<property name="cookieName">
<value>locale</value>
</property>
<property name="cookieMaxAge">
<!-- one year -->
<value>31536000</value>
</property>
</bean>
<!-- Application Message Bundle -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- i18n资源文件路径 -->
<property name="basename" value="classpath:messages/messages" />
<property name="cacheSeconds" value="0" />
</bean>
2、添加资源文件messages_en_US.properties、messages_zh_CN.properties,注意路径和上面配置的一致,在classpath的messages目录下。
3、将spring-webmvc里的org/springframework/web/servlet/view/freemarker下的spring.ftl拷贝到你的ftl目录(views/inc),再在spring-servlet.xml文件中加入以下代码段
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/views" />
<property name="freemarkerSettings">
<props>
<prop key="defaultEncoding">UTF-8</prop>
<prop key="template_update_delay">0</prop>
<prop key="locale">zh_CN</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="number_format">0.##</prop>
<!-- 自动获取spring.ftl宏,此处路径是上面templateLoaderPath的相对路径 -->
<prop key="auto_import">inc/spring.ftl as spring</prop>
</props>
</property>
</bean>
4、在cn.com.web.interceptor包下创建UserLocaleChangeInterceptor类,此处的包名与类名对应第一步中mvc:interceptors的bean class。
package cn.com.web.interceptor;
import java.util.Locale;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.propertyeditors.LocaleEditor;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.support.RequestContextUtils;
public class UserLocaleChangeInterceptor extends LocaleChangeInterceptor {
@SuppressWarnings("unchecked")
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws ServletException {
String newLocale = request.getParameter(getParamName());
if (StringUtils.isBlank(newLocale)) {
newLocale = (String)request.getSession().getAttribute("language");
//-- 设置默认语言为中文
if (StringUtils.isBlank(newLocale)) {
newLocale = "zh_CN";
}
}
//-- 如果没有改变语言返回true,否则要重置session中的值
if (newLocale.equals((String)request.getSession().getAttribute("language"))) return true;
reSetSessionLocale(request, response, newLocale);
return true;
}
private void reSetSessionLocale(HttpServletRequest request, HttpServletResponse response, String newLocale) {
request.getSession().setAttribute("language", newLocale);
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
if (localeResolver == null) {
throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");
}
LocaleEditor localeEditor = new LocaleEditor();
localeEditor.setAsText(newLocale);
localeResolver.setLocale(request, response, (Locale) localeEditor.getValue());
}
}
5、在请求URL后加上 locale?zhCN 即可切换到中文版,要切换到英文版则 ?locale=en_US 。
在web前端页面的引用,用该标签形式<@spring.message "web.home" />即可输出当前语言资源文件的相应信息。如,messages_en_US.properties、messages_zh_CN.properties两个文件中分别有以下内容:web.home=home、web.home=首页。则<@spring.message "web.home" />在页面中输出“首页”。
如果第3步中没有配置自动获取spring.ftl宏,则在引用<@spring.message ""/>标签的相应页面中要加入ftl中加入: <#import "/WEB-INF/views/inc/spring.ftl" as spring/>
6、后台程序获取当前语言资源文件的相应信息的代码片段
//-- 以下language为UserLocaleChangeInterceptor类中设置session对应的变量名
String locale = (String)request.getSession().getAttribute("language");
ResourceBundle resourceBundle;
resourceBundle = ResourceBundle.getBundle("messages.messages", new Locale(getLocale()));
String home = resourceBundle.getString("web.home");