为什么我的Spring Boot应用程序不在小胡子模板中呈现messages.properties

时间:2019-01-16 20:55:51

标签: spring-boot gradle kotlin mustache

我想用使用国际化的胡子模板构建Spring Boot Web应用程序。

遵循本指南https://www.baeldung.com/spring-boot-internationalization,我尝试了一个带有gradle和kotlin的迷你示例,该示例可与百里香模板一起使用,但对胡须失败

为了使指南适用于胡须,我进行了以下更改:

  1. 开关 implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'implementation 'org.springframework.boot:spring-boot-starter-mustache'
  2. 将international.html重命名为international.mustache
  3. 更改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

2 个答案:

答案 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);
        };
    }
}