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. リクエストのロケールと RequestContext のロケールの違い
場合によってはLocale
、Freemarker によって提供される が、使用するものと同じではないLocale
ことがあります。
私の場合、Freemarker Spring Boot ApplicationLocaleChangeInterceptor
に<@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
代わりに から Locale を読み取る必要があります。
構成クラス
@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 - 春にフリーメーカーテンプレートでリクエストコンテキストを取得する方法も参照してください
フリーマーカー テンプレート
<#-- @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/>
ローカライズされたテキストの言語と一致します。