【问题标题】:Thymeleaf + Spring (not Boot) - how to show messages from messageSourceThymeleaf + Spring (not Boot) - 如何显示来自 messageSource 的消息
【发布时间】:2016-08-13 15:43:19
【问题描述】:

我在使用 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
}

应用程序的总体视图是:

messages_pt_BR.properties 文件是:

#messages
spring.messages.basename=i18n/messages

app.name=APPLICATION NAME

但是,当我尝试在页面上的某处显示 APPLICATION NAME 时,使用以下代码:

<p th:text="#{app.name}">app.name</p>

我只得到

??app.name_pt_BR??

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

I18n in Spring boot + Thymeleaf http://www.concretepage.com/spring-4/spring-4-mvc-internationalization-i18n-and-localization-l10n-annotation-example How to display messages in Thymeleaf and Spring Boot?

我还是不能让它工作。

浏览器和操作系统设置为语言环境 en_US。

如何解决?

【问题讨论】:

  • 检查src/main/resources/messages_pt_br.properties中的文件是否有相同的内容。 Spring取这个特定文件夹中的一个
  • Hassam,感谢您的意见,但我仍然没有运气。
  • 还在坚持吗?
  • 是的!仍然没有运气......
  • 什么版本的 Spring 和 Thymeleaf?

标签: java spring spring-mvc thymeleaf


【解决方案1】:

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

Spring 4 with thymeleaf Internationalization not identify message from resource properties file

基本上,解决问题的方法是将以下@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;
}

... 分成三个不同的 bean,例如:

@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;
}

从那以后,我得到了它按预期工作。

感谢您的见解和帮助!

【讨论】:

    【解决方案2】:

    在这里使用 Spring Boot,但我能够重现您的问题,并且一旦我将其更改为 ResourceBundleMessageSource,它就与 ReloadableResourceBundleMessageSource 相关联,它就可以正常工作。

    @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;
    }
    

    更新:

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

    在这里查看我的帖子:Why does Thymeleaf International only works with ResourceBundleMessageSource

    【讨论】:

    • @gtludwig 修改了发现可行的答案。
    【解决方案3】:
     @Bean(name="localeResolver")
        public LocaleResolver localeResolver(){
            SessionLocaleResolver  resolver = new SessionLocaleResolver();
            resolver.resolver.setDefaultLocale(new Locale("en"));
            return resolver;
        }  
    

    更改了您的 localresolver bean,这可能会对您有所帮助。如果您将浏览器设置为en locale,应用程序如何读取pt_BR,将其更改为味精属性文件中的_en

    或者您可以将浏览器区域设置更改为Portuguese - BRAZIL (BR) (pt_BR),而无需在任何地方更改代码

    【讨论】:

    • 您是否尝试过将浏览器区域设置更改为葡萄牙语-巴西?不改变任何东西
    猜你喜欢
    • 2015-06-14
    • 2021-06-03
    • 2015-04-29
    • 2017-03-07
    • 2023-04-02
    • 1970-01-01
    • 2019-11-26
    • 2018-09-05
    • 1970-01-01
    相关资源
    最近更新 更多