如何获取freemarker模板中使用的当前区域设置?我见过<spring.message code />
我需要这个来做条件
<#if locale = DE >
.....
<#else>
....
</#if>
答案 0 :(得分:5)
特殊变量是由FreeMarker引擎本身定义的变量。要访问它们,请使用.variable_name语法
.locale:返回语言环境设置的当前值。这是一个字符串,例如en_US。有关区域设置字符串的更多信息,请参阅设置指令。
因此,要访问Freemarker模板中的当前本地,您将使用
The current locale is: ${.locale}
要根据您的要求在条件语句中使用它,您可以这样做:
<#if .locale == "DE">
...
<#else>
...
</#if>
答案 1 :(得分:0)
@Rob Blake的回答在技术上是正确的,但我仍然想补充一些想法...
1。其他与语言环境相关的变量
不仅有.locale
,还有.lang
,而且由于FreeMarker 2.3.21也有.locale_object
,它提供了实际的java.lang.Locale
对象(不仅是字符串)。
有关更多信息,请参见Freemarker Special Variable Reference。
2。请求的语言环境与RequestContext中的语言环境之间的区别
在某些情况下,Freemarker提供的Locale
与您使用的Locale
不同。
在我的情况下,我有一个带有LocaleChangeInterceptor
的Freemarker Spring Boot应用程序,该应用程序允许您设置自己的语言环境(例如,在会话中),以便用户在使用{{1 }}以不同的语言呈现文本。
此代码段是受以下baeldung.com Spring Boot I18N tutorial启发的:
<@spring.message />
在这种情况下,更改语言环境后,由Freemarker提供的语言环境(即@Configuration
public class McvConfiguration extends WebMvcConfigurerAdapter {
@Bean
public LocaleResolver localeResolver() {
return new SessionLocaleResolver();
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
,${.locale}
和${.lang}
)和${.locale_object}
中的语言环境(即(例如,用于RequestContext
的语言环境)不同!
在这种情况下,您应该改为从<@spring.message />
中读取语言环境。
配置类
RequestContext
另请参阅SO - How to get the request context in a freemaker template in spring
Freemarker模板
@Bean
public ViewResolver viewResolver() {
final UrlBasedViewResolver viewResolver = new UrlBasedViewResolver(); // or TilesViewResolver or whatever
// make requestContext available for Freemarker templates as "${rc}"
viewResolver.setRequestContextAttribute("rc");
return viewResolver;
}
因此,当您按下<#-- @ftlvariable name="rc" type="org.springframework.web.servlet.support.RequestContext" -->
<!DOCTYPE html>
<html lang="${rc.locale.language!"en"}">
<!-- ... -->
</html>
或http://<serverName>:<serverPort>/<contextPath>/index?lang=en
或http://<serverName>:<serverPort>/<contextPath>/index?lang=de
或应用程序支持的任何语言时,http://<serverName>:<serverPort>/<contextPath>/index?lang=fr
标记的<html>
属性将与lang
本地化文本。