[英]Get locale in freemarker template
如何获取 freemarker 模板中使用的当前语言环境? 我见过<spring.message code />
我需要这个来做一个有条件的
<#if locale = DE >
.....
<#else>
....
</#if>
特殊变量是由 FreeMarker 引擎本身定义的变量。 要访问它们,您可以使用 .variable_name 语法
.locale:返回区域设置的当前值。 这是一个字符串,例如 en_US。 有关语言环境字符串的更多信息,请参阅设置指令。
因此,要访问 Freemarker 模板中的当前本地,您将使用
The current locale is: ${.locale}
要根据您的要求在条件语句中使用它,您可以执行以下操作:
<#if .locale == "DE">
...
<#else>
...
</#if>
@Rob Blake 的回答在技术上是正确的,但我仍然想补充一些想法......
1.其他locale相关的变量
不仅有.locale
,还有.lang
,从 FreeMarker 2.3.21 开始还有.locale_object
,它提供了实际的java.lang.Locale
对象(不仅仅是字符串)。
有关更多信息,请参阅Freemarker 特殊变量参考。
2. request的locale和RequestContext中locale的区别
在某些情况下,该Locale
被FreeMarker提供的是不一样的Locale
,您使用。
就我而言,我有一个带有LocaleChangeInterceptor
的 Freemarker Spring Boot 应用程序,它允许您设置自己的语言环境(例如在会话中),以便用户可以在使用<@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());
}
}
在这种情况下,区域设置已被改变之后,由Freemarker的(即所提供的区域设置${.locale}
, ${.lang}
和${.locale_object}
和区域设置在RequestContext
(即,区域设置,其用于<@spring.message />
例如)不同!
在这种情况下,您应该改为从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 - How to get the request context in a freemaker template in spring
自由标记模板
<#-- @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
属性将匹配来自<@spring.message/>
本地化文本的语言。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.