Spring整合FreeMarker進行國際化的過程很簡單,將spring-webmvc里的org/springframework/web/servlet/view/freemarker下的spring.ftl include到各個要國際化的ftl文件里就行了,比如將這個spring.ftl復制在ftl文件目錄的common下,可以這樣直接在ftl里include進來
<#import "/common/spring.ftl" as spring/>
當然也可以在spring配置文件里對freemarkerConfig配置的時候自動導入
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> ... <property name="freemarkerSettings"> <props> <prop key="defaultEncoding">UTF-8</prop> ... <prop key="auto_import">common/spring.ftl as spring</prop> </props> </property>
然后在spring的配置文件里聲明下
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>MessageResources</value>
</list>
</property>
</bean>
在源文件目錄resource下有相應的MessageResources.zh_CN.properties和MessageResources.en_US.propertes等屬性文件
在ftl文件里這樣使用
<@spring.message "hello"/>
這樣系統會根據用戶當前環境下的locale進行國際化。但是如果要自己手動指定某個用戶的locale要怎么辦呢?
參考了下org.springframework.web.servlet.i18n.LocaleChangeInterceptor對locale的設置,首先要在spring的配置文件里聲明一個LocaleResolver (比如 CookieLocaleResolver,不然的話后面的操作會出現異常),我這里對Locale的設置只要在session范圍里就行了
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> <property name="defaultLocale" value="zh" /> </bean>
接着在spring的controller里控制locale的方法里加入以下代碼就可以了
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(lang); localeResolver.setLocale(request, response, (Locale) localeEditor.getValue());
最后總結下我的方式
1.spring的配置里必須要有的
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/ftl/"/> <property name="freemarkerSettings"> <props> <prop key="defaultEncoding">UTF-8</prop> <!-- 在生產環境下更新模板的間隔要根據實際情況設置,這里為開發方便設置為5秒 --> <prop key="template_update_delay">5</prop> <!-- 我把spring.ftl里的內容和項目里要用到的公共的macro合在一起了 --> <prop key="auto_import">common/website.ftl as website</prop> </props> </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="cache" value="true"/> <property name="prefix" value=""/> <property name="suffix" value=".ftl"/> <property name="contentType" value="text/html;charset=utf-8"></property> </bean> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> <property name="defaultLocale" value="zh" /> </bean> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>MessageResources</value> </list> </property> </bean>
2.在設置用戶Locale的Controller里設置Locale
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(lang); localeResolver.setLocale(request, response, (Locale) localeEditor.getValue());
3.在ftl里這樣使用
