繁体   English   中英

在 freemarker 模板中获取语言环境

[英]Get locale in freemarker template

如何获取 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相关的变量
不仅有.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=enhttp://<serverName>:<serverPort>/<contextPath>/index?lang=dehttp://<serverName>:<serverPort>/<contextPath>/index?lang=fr ,或者您应用程序支持的任何语言, <html>标签的lang属性将匹配来自<@spring.message/>本地化文本的语言。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM