如何获取 freemarker 模板中使用的当前语言环境?我已经看到了<spring.message code />
我需要这个来做一个有条件的
<#if locale = DE >
.....
<#else>
....
</#if>
如何获取 freemarker 模板中使用的当前语言环境?我已经看到了<spring.message code />
我需要这个来做一个有条件的
<#if locale = DE >
.....
<#else>
....
</#if>
正如Freemarker 文档所述:
特殊变量是由 FreeMarker 引擎本身定义的变量。要访问它们,请使用 .variable_name 语法
.locale:返回区域设置的当前值。这是一个字符串,例如 en_US。有关区域设置字符串的更多信息,请参阅设置指令。
因此,要访问 Freemarker 模板中的当前本地,您将使用
The current locale is: ${.locale}
要根据您的要求在条件语句中使用它,您可以:
<#if .locale == "DE">
...
<#else>
...
</#if>
@Rob Blake 的回答在技术上是正确的,但我仍然想补充一些想法......
1. 其他与语言环境相关
的变量 不仅有.locale
,而且.lang
自 FreeMarker 2.3.21 起也有.locale_object
,它提供了实际的java.lang.Locale
对象(不仅仅是字符串)。
有关详细信息,请参阅Freemarker 特殊变量参考。
2. request的locale和RequestContext中的locale的区别
在某些情况下,Locale
Freemarker提供的和Locale
你使用的不一样。
就我而言,我有一个带有 的 Freemarker Spring Boot 应用程序LocaleChangeInterceptor
,它允许您设置自己的语言环境(例如在会话中),以便用户可以在您使用<@spring.message />
以不同语言呈现文本时切换语言。
此代码片段的灵感来自baeldung.com Spring Boot I18N 教程:
@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 更改后,Freemarker 提供的语言环境(即${.locale}
,${.lang}
和${.locale_object}
)和 in 中的 Locale RequestContext
(即<@spring.message />
例如使用的 Locale )不同!
在这种情况下,您应该改为阅读 Locale RequestContext
。
配置类
@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;
}
另请参阅SO - 如何在 spring 中获取 freemaker 模板中的请求上下文
自由标记模板
<#-- @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
orhttp://<serverName>:<serverPort>/<contextPath>/index?lang=de
或http://<serverName>:<serverPort>/<contextPath>/index?lang=fr
或您的应用程序支持的任何语言时,<html>
标签的lang
属性将与<@spring.message/>
本地化文本中的语言相匹配。