spring+freemarker 国际化i18n

以下是Spring整合FreeMarker进行国际化的过程:

1、在spring-servlet.xml(具体看自己项目中的命名)加入以下代码段:



	




	
		locale
	
	
		
		31536000
	




	
	
	


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文件中加入以下代码段


	
	
		
			UTF-8
			0
			zh_CN
			yyyy-MM-dd HH:mm:ss
			0.##
			
			inc/spring.ftl as spring
		
	

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");


你可能感兴趣的:(Java技术,spring,mvc)