Spring MVC 如何在Thymeleaf和Sping Boot 中显示消息?

6l7fqoea  于 2023-10-24  发布在  Spring
关注(0)|答案(6)|浏览(165)

我创建了一个使用Thymeleaf作为模板引擎的Sping Boot Web应用程序。我将MessageSource配置为在子文件夹中查找消息:

@Bean
public MessageSource messageSource() {
    final ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();

    messageSource.setBasename("i18n/messages");
    messageSource.setFallbackToSystemLocale(false);
    messageSource.setCacheSeconds(0);

    return messageSource;
}

在这个文件夹中,我创建了messages_de.properties文件,内容为ticket.type.BUG=Fehler。在我的模板中,我尝试像这样显示文本:

<p th:text="#{ticket.type.BUG}">BUG</p>

但是当页面被渲染时,我得到以下内容:

<p>??ticket.type.BUG_de_DE??</p>

我缺少了什么?我必须配置任何额外的bean吗?

附:

在“服务器端”,我可以使用MessageSource#getMessage("ticket.type.BUG", null, Locale.GERMANY)获取消息。

rqmkfv5c

rqmkfv5c1#

因为我使用的是Sping Boot ,所以MessageSource配置了MessageSourceAutoConfiguration。这些设置可以在application.properties文件中轻松更改。在我的情况下,我不得不将以下内容添加到该文件中:

spring.messages.basename=i18n/messages
n3h0vuf2

n3h0vuf22#

并将其添加到application.properties文件中

#messages
spring.messages.basename=i18n/messages

并将文件存储在上面指定的正确文件夹中。
你不需要messageSource bean

uurity8g

uurity8g3#

我解决i18n消息传递的方法是像你一样定义MessagesSource bean。另外,我必须覆盖WebMvcConfigurerAdaptergetValidator()方法。

@Override
public Validator getValidator() {
    LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
    validator.setValidationMessageSource( messageSource() );
    return validator;
}

在这之后,它为我工作。

6ojccjat

6ojccjat4#

是否存在允许回退的文件messages.properties(无_de)?它是否有效?您的浏览器是否设置为区域设置DE_de

pengsaosao

pengsaosao5#

消息源与类路径相关:

messageSource.setBasename("  classpath:i18n/messages");

下面是我参考的关于thymeleaf和spring = http://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html的教程

7dl7o3gd

7dl7o3gd6#

我遇到了类似的问题。在我的例子中,faraj的方法起作用了。但我想知道为什么我不能用bean配置来做。我的代码是:

@Bean
public MessageSource getMessageResource()  {
    ResourceBundleMessageSource messageResource= new ResourceBundleMessageSource();
    messageResource.setBasename("localization/messages");
    messageResource.setDefaultEncoding("UTF-8");
    return messageResource;
}

然后我突然想到,默认情况下,方法名称将是bean名称。所以我的bean名称是getMessageResource。我认为这种命名可能是配置中的问题,所以我自己命名了bean。像这样:

@Bean("messageSource")
public MessageSource getMessageResource()  {
    ResourceBundleMessageSource messageResource= new ResourceBundleMessageSource();
    messageResource.setBasename("localization/messages");
    messageResource.setDefaultEncoding("UTF-8");
    return messageResource;
}

因此,无需进行任何其他更改,也无需对属性文件进行任何配置即可解决该问题。
我附上整个类作为一个例子:

@Configuration
public class LocaleConfig implements WebMvcConfigurer {

    @Bean
    public LocaleResolver localeResolver() {
        return new CookieLocaleResolver();
    }

    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
        localeChangeInterceptor.setParamName("lang");
        return localeChangeInterceptor;
    }

    @Bean("messageSource")
    public MessageSource getMessageResource()  {
        ResourceBundleMessageSource messageResource= new ResourceBundleMessageSource();
        messageResource.setBasename("localization/messages");
        messageResource.setDefaultEncoding("UTF-8");
        return messageResource;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }

}

我的资源文件结构:structure
谢谢.

相关问题