spring+freemarker 国际化i18n

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值