5

如何获取 freemarker 模板中使用的当前语言环境?我已经看到了<spring.message code />

我需要这个来做一个有条件的

<#if locale = DE >
.....
<#else>
....
</#if>
4

2 回答 2

7

正如Freemarker 文档所述:

特殊变量是由 FreeMarker 引擎本身定义的变量。要访问它们,请使用 .variable_name 语法

.locale:返回区域设置的当前值。这是一个字符串,例如 en_US。有关区域设置字符串的更多信息,请参阅设置指令。

因此,要访问 Freemarker 模板中的当前本地,您将使用

The current locale is: ${.locale}

要根据您的要求在条件语句中使用它,您可以:

<#if .locale == "DE">
   ...
<#else>
   ...
</#if>
于 2013-11-04T10:43:12.227 回答
0

@Rob Blake 的回答在技术上是正确的,但我仍然想补充一些想法......

1. 其他与语言环境相关
的变量 不仅有.locale,而且.lang自 FreeMarker 2.3.21 起也有.locale_object,它提供了实际的java.lang.Locale对象(不仅仅是字符串)。

有关详细信息,请参阅Freemarker 特殊变量参考

2. request的locale和RequestContext中的locale的区别
在某些情况下,LocaleFreemarker提供的和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=enorhttp://<serverName>:<serverPort>/<contextPath>/index?lang=dehttp://<serverName>:<serverPort>/<contextPath>/index?lang=fr或您的应用程序支持的任何语言时,<html>标签的lang属性将与<@spring.message/>本地化文本中的语言相匹配。

于 2020-01-16T11:12:16.200 回答