Thymeleaf + Spring(不启动) - 如何显示来自messageSource的消息

gtl*_*wig 5 java spring spring-mvc thymeleaf

我在使用Thymeleaf设置我的Spring MVC(不使用Boot,因为我在发现Spring Initializr之前启动它)以显示来自我的资源包的消息时遇到了问题.

该应用程序的主要配置类是:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "b.c.m.h")
public class HrmConfiguration extends WebMvcConfigurerAdapter {

    @Bean
    public ViewResolver viewResolver() {
        ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
        templateResolver.setTemplateMode("HTML5");
        templateResolver.setCharacterEncoding("UTF-8");
        templateResolver.setPrefix("/WEB-INF/html/");
        templateResolver.setSuffix(".html");

        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.addDialect(new SpringSecurityDialect());
        engine.addDialect(new LayoutDialect(new GroupingStrategy()));
        engine.setTemplateResolver(templateResolver);

        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(engine);
        viewResolver.setCache(false);

        return viewResolver;
    }

    @Bean(name = "messageSource")
    public MessageSource messageSource() {

        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("/i18n/messages");
        messageSource.setFallbackToSystemLocale(false);
        messageSource.setCacheSeconds(0);
        messageSource.setDefaultEncoding("UTF-8");

        return messageSource;
    }

    @Bean(name="localeResolver")
    public LocaleResolver localeResolver(){
        SessionLocaleResolver  resolver = new SessionLocaleResolver();
        resolver.setDefaultLocale(new Locale("pt", "BR"));
        return resolver;
    } 

    @Bean
    public UrlTemplateResolver urlTemplateResolver() {
        return new UrlTemplateResolver();
    }

    // other beans and configs
}
Run Code Online (Sandbox Code Playgroud)

该应用程序的一般视图是:

在此输入图像描述

而messages_pt_BR.properties文件是:

#messages
spring.messages.basename=i18n/messages

app.name=APPLICATION NAME
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试APPLICATION NAME在页面上的某个位置显示时,使用此:

<p th:text="#{app.name}">app.name</p>
Run Code Online (Sandbox Code Playgroud)

我只得到

??app.name_pt_BR??
Run Code Online (Sandbox Code Playgroud)

我浏览了许多可能的解决方案和教程,包括:

I18n in Spring boot + Thymeleaf http://www.concretepage.com/spring-4/spring-4-mvc-internationalization-i18n-and-localization-l10n-annotation-example 如何在Thymeleaf和Spring Boot中显示消息?

我仍然无法让它发挥作用.

浏览器和操作系统设置为locale en_US.

如何解决这个问题?

ndr*_*one 5

在这里使用 Spring Boot,但我能够重现您的问题,并且它与ReloadableResourceBundleMessageSource我将它更改为ResourceBundleMessageSource它应该像它一样工作时有关。

@Bean(name = "messageSource")
public MessageSource messageSource() {

    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("/i18n/messages");
    messageSource.setFallbackToSystemLocale(false);
    messageSource.setCacheSeconds(0);
    messageSource.setDefaultEncoding("UTF-8");

    return messageSource;
}
Run Code Online (Sandbox Code Playgroud)

更新:

发现您需要为 ReloadableReourceBundleMessageSource 提供完整路径,因此如果您的/il8n目录在类路径中,则需要将 basename 设置为classpath:/il8n/messages

在此处查看我的帖子:为什么 Thymeleaf International 仅适用于 ResourceBundleMessageSource


gtl*_*wig 1

我在这个问题上找到了我的问题的答案:

Spring 4 与 thymeleaf 国际化无法识别资源属性文件中的消息

基本上,解决问题的方法是将以下内容分开@Bean......

@Bean
public ViewResolver viewResolver() {
    ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
    templateResolver.setTemplateMode("HTML5");
    templateResolver.setCharacterEncoding("UTF-8");
    templateResolver.setPrefix("/WEB-INF/html/");
    templateResolver.setSuffix(".html");

    SpringTemplateEngine engine = new SpringTemplateEngine();
    engine.addDialect(new SpringSecurityDialect());
    engine.addDialect(new LayoutDialect(new GroupingStrategy()));
    engine.setTemplateResolver(templateResolver);

    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(engine);
    viewResolver.setCache(false);

    return viewResolver;
}
Run Code Online (Sandbox Code Playgroud)

...分成三种不同的豆子,例如:

@Bean
public ServletContextTemplateResolver templateResolver() {
    ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
    templateResolver.setCacheable(false);
    templateResolver.setTemplateMode("HTML5");
    templateResolver.setCharacterEncoding("UTF-8");
    templateResolver.setPrefix(HTML_VIEWS);
    templateResolver.setSuffix(".html");

    return templateResolver;
}

@Bean
public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.addDialect(new SpringSecurityDialect());
    templateEngine.addDialect(new LayoutDialect(new GroupingStrategy()));
    templateEngine.setTemplateResolver(templateResolver());

    return templateEngine;
}

@Bean
public ViewResolver viewResolver() {

    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(templateEngine());
    viewResolver.setCharacterEncoding("UTF-8");
    viewResolver.setCache(false);
    viewResolver.setOrder(1);

    return viewResolver;
}
Run Code Online (Sandbox Code Playgroud)

从那时起,我就按照我的预期工作了。

感谢您的见解和帮助!