我无法使用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?
我仍然无法正常工作。
浏览器和操作系统设置为locale en_US。
如何解决问题?
答案 0 :(得分:3)
在这里使用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;
}
<强>更新强>
发现您需要为ReloadableReourceBundleMessageSource提供完整路径,因此如果您的/il8n
目录位于类路径中,则需要将基本名称设置为classpath:/il8n/messages
在此处查看我的帖子:Why does Thymeleaf International only works with ResourceBundleMessageSource
答案 1 :(得分:0)
@Bean(name="localeResolver")
public LocaleResolver localeResolver(){
SessionLocaleResolver resolver = new SessionLocaleResolver();
resolver.resolver.setDefaultLocale(new Locale("en"));
return resolver;
}
更改了localresolver bean,这可能会对您有所帮助。如果您将浏览器设置为en locale
,应用程序如何读取msg属性文件中pt_BR
的{{1}}更改
或者您可以将浏览器区域设置更改为_en
,而无需在任何地方更改代码
答案 2 :(得分:0)
我在这个问题上找到了问题的答案:
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;
}
从那以后,我按照我的预期运作了。
感谢您的见解和帮助!