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; }
从那以后,我按照我的预期运作了。
感谢您的见解和帮助!
- 为什么JDK1.8.0u121无法找到kerberos default_tkt_enctypes类型? (KrbException:default_tkt_enctypes没有支持的默认etypes)
- 德摩根定律
- Hello World不在IntelliJ Idea中运行
- 从.war文件加载类的顺序
- Lambda vs匿名内部类性能:减少ClassLoader的负载?
- Java – 如何在jasper报表中删除只有标题且没有可用数据的页面?
- 无法通过Java代码连接到服务器。 获取javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure
- 如何使用reflection定义动态setter和getter?
- Push in Vaadin 7 app(“@Push”)的最小例子
- 如何让IntelliJ提示我输入命令行参数
- 将Spring Security与SiteMinder集成