我想用使用国际化的胡子模板构建Spring Boot Web应用程序。
遵循本指南https://www.baeldung.com/spring-boot-internationalization,我尝试了一个带有gradle和kotlin的迷你示例,该示例可与百里香模板一起使用,但对胡须失败
为了使指南适用于胡须,我进行了以下更改:
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
与
implementation 'org.springframework.boot:spring-boot-starter-mustache'
更改international.mustache像这样
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>{{#i18n}}greeting{{/i18n}} test</h1>
</body>
</html>
messages.properties文件包含以下行
greeting=Hello! Welcome to our website!
只需在这里提供所有必要的代码就是我的配置类
@Configuration
@ComponentScan(basePackages = ["com.example.translationtest.config"])
class AppConfig: WebMvcConfigurer {
@Bean
fun localeResolver(): LocaleResolver {
val slr = SessionLocaleResolver()
slr.setDefaultLocale(Locale.US)
return slr
}
@Bean
fun localeChangeInterceptor(): LocaleChangeInterceptor {
val lci = LocaleChangeInterceptor()
lci.paramName = "lang"
return lci
}
override fun addInterceptors(registry: InterceptorRegistry) {
registry.addInterceptor(localeChangeInterceptor())
}
}
当我在浏览器中访问页面时,我仅看到字符串test
虽然我希望看到
Hello! Welcome to our website! test
答案 0 :(得分:1)
spring-boot-starter-mustache
使用的 this question并没有提供任何国际化支持。模板中的{{#i18n}}greeting{{/i18n}}
被忽略,因为JMustache无法识别i18n
。
如自述文件所述,您可以使用Mustache.Lamda
来实现国际化支持:
您还可以获得片段执行的结果,以进行国际化或缓存之类的操作:
Object ctx = new Object() { Mustache.Lambda i18n = new Mustache.Lambda() { public void execute (Template.Fragment frag, Writer out) throws IOException { String key = frag.execute(); String text = // look up key in i18n system out.write(text); } }; }; // template might look something like: <h2>{{#i18n}}title{{/i18n}</h2> {{#i18n}}welcome_msg{{/i18n}}
答案 1 :(得分:0)
添加Andy Winlkinson的答案并加入Rotzlucky的期望,我分享我为实现JMustache国际化工作所做的工作。
@ControllerAdvice
public class InternacionalizationAdvice {
@Autowired
private MessageSource message;
@ModelAttribute("i18n")
public Mustache.Lambda i18n(Locale locale){
return (frag, out) -> {
String body = frag.execute();
String message = this.message.getMessage(body, null, locale);
out.write(message);
};
}
}