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

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

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

@Configuration @EnableWebMvc @ComponentScan(basePackages = "bcmh") 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 ,请执行以下操作:

 

app.name

我只得到

 ??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 如何在Thymeleaf和Spring Boot中显示消息?

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

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

如何解决这个问题?

在这里使用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; } 

更新:

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

在这里看到我的post: 为什么Thymeleaf International只适用于ResourceBundleMessageSource

  @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在msg属性文件中

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

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

具有百日咳国际化的Spring 4无法识别来自资源属性文件的消息

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

从那以后,我按照我的预期运作了。

感谢您的见解和帮助!