spring+freemarker 国际化i18n

来源:互联网 发布:苹果电脑软件卡死了 编辑:程序博客网 时间:2024/06/04 10:46

以下是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")@Overridepublic 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");


原创粉丝点击