Java Spring引导国际化(messages.properties)

Java Spring引导国际化(messages.properties),java,spring,internationalization,spring-boot,thymeleaf,Java,Spring,Internationalization,Spring Boot,Thymeleaf,我试图简单地将应用程序的版本号添加到Thymeleaf片段中。我使用的是Spring Boot 1.2.5。如果我有一个名为/resources/messages.properties的文件,其定义如下: application.version=1.0.0 我有一个带有以下片段的Thymeleaf视图: Application Version: <span th:text="#{application.version}"> WebConfig.java @SpringBootAp

我试图简单地将应用程序的版本号添加到Thymeleaf片段中。我使用的是Spring Boot 1.2.5。如果我有一个名为/resources/messages.properties的文件,其定义如下:

application.version=1.0.0
我有一个带有以下片段的Thymeleaf视图:

Application Version: <span th:text="#{application.version}">
WebConfig.java

@SpringBootApplication
@ComponentScan(basePackages = {"org.application"})
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class, ThymeleafAutoConfiguration.class})
@PropertySources(value = {@PropertySource("classpath:website.properties")})
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

}
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

@Bean
public SpelAwareProxyProjectionFactory projectionFactory() {
    return new SpelAwareProxyProjectionFactory();
}

@Bean
public SessionHandler sessionHandler() {
    return new SessionHandler();
}

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/web/auth/login").setViewName("auth/login");
    registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations(
            "/resources/");
}

@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
    LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
    localeChangeInterceptor.setParamName("language");
    return localeChangeInterceptor;
}

@Bean
public CookieLocaleResolver localeResolver() {
    CookieLocaleResolver localeResolver = new CookieLocaleResolver();
    localeResolver.setDefaultLocale(Locale.ENGLISH);
    return localeResolver;
}

@Bean
public ResourceBundleMessageSource messageSource() {
    return new ResourceBundleMessageSource();
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
    // Locale change interceptor
    registry.addInterceptor(localeChangeInterceptor());

    // Utility interceptor which helps with the "active" link styles in the navigation.  --mm
    registry.addInterceptor(new BaseInterceptor());

    // Expire session after a period of time
    registry.addInterceptor(sessionHandler());
}
}
@Configuration
public class ThymeleafConfig {

@Bean
public ServletContextTemplateResolver templateResolver() {
    ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".html");

    // must use Legacy HTML5 as the template, otherwise Handlebars will not parse!
    //
    // this should hopefully be fixed in Thymeleaf 3.0
    resolver.setTemplateMode("LEGACYHTML5");
    resolver.setCacheable(false);
    return resolver;
}

public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine engine = new SpringTemplateEngine();
    engine.setTemplateResolver(templateResolver());

    // Add Spring security
    Set<IDialect> dialects = new HashSet<IDialect>();
    engine.setAdditionalDialects(dialects);
    engine.addDialect(new SpringSecurityDialect());
    return engine;
}

@Bean
public ViewResolver viewResolver() {
    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(templateEngine());
    viewResolver.setOrder(1);
    viewResolver.setViewNames(new String[]{"*"});
    viewResolver.setCache(false);
    return viewResolver;
}
}
ThymeleafConfig.java

@SpringBootApplication
@ComponentScan(basePackages = {"org.application"})
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class, ThymeleafAutoConfiguration.class})
@PropertySources(value = {@PropertySource("classpath:website.properties")})
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

}
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

@Bean
public SpelAwareProxyProjectionFactory projectionFactory() {
    return new SpelAwareProxyProjectionFactory();
}

@Bean
public SessionHandler sessionHandler() {
    return new SessionHandler();
}

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/web/auth/login").setViewName("auth/login");
    registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations(
            "/resources/");
}

@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
    LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
    localeChangeInterceptor.setParamName("language");
    return localeChangeInterceptor;
}

@Bean
public CookieLocaleResolver localeResolver() {
    CookieLocaleResolver localeResolver = new CookieLocaleResolver();
    localeResolver.setDefaultLocale(Locale.ENGLISH);
    return localeResolver;
}

@Bean
public ResourceBundleMessageSource messageSource() {
    return new ResourceBundleMessageSource();
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
    // Locale change interceptor
    registry.addInterceptor(localeChangeInterceptor());

    // Utility interceptor which helps with the "active" link styles in the navigation.  --mm
    registry.addInterceptor(new BaseInterceptor());

    // Expire session after a period of time
    registry.addInterceptor(sessionHandler());
}
}
@Configuration
public class ThymeleafConfig {

@Bean
public ServletContextTemplateResolver templateResolver() {
    ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".html");

    // must use Legacy HTML5 as the template, otherwise Handlebars will not parse!
    //
    // this should hopefully be fixed in Thymeleaf 3.0
    resolver.setTemplateMode("LEGACYHTML5");
    resolver.setCacheable(false);
    return resolver;
}

public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine engine = new SpringTemplateEngine();
    engine.setTemplateResolver(templateResolver());

    // Add Spring security
    Set<IDialect> dialects = new HashSet<IDialect>();
    engine.setAdditionalDialects(dialects);
    engine.addDialect(new SpringSecurityDialect());
    return engine;
}

@Bean
public ViewResolver viewResolver() {
    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(templateEngine());
    viewResolver.setOrder(1);
    viewResolver.setViewNames(new String[]{"*"});
    viewResolver.setCache(false);
    return viewResolver;
}
}
@配置
公共类配置{
@豆子
public ServletContextTemplateResolver templateResolver(){
ServletContextTemplateResolver解析器=新的ServletContextTemplateResolver();
resolver.setPrefix(“/WEB-INF/views/”);
resolver.setSuffix(“.html”);
//必须使用传统HTML5作为模板,否则手柄将无法解析!
//
//这有望在Thymeleaf3.0中得到修复
resolver.setTemplateMode(“LEGACYHTML5”);
可设置缓存的解析器(false);
返回解析器;
}
公共SpringTemplateEngine模板引擎(){
SpringTemplateEngine=新的SpringTemplateEngine();
engine.setTemplateResolver(templateResolver());
//添加Spring安全性
Set方言=新HashSet();
引擎设置附加方言(方言);
engine.adddialent(新的SpringSecurityDialent());
返回引擎;
}
@豆子
公共ViewResolver ViewResolver(){
ThymileAfViewResolver viewResolver=新的ThymileAfViewResolver();
setTemplateEngine(templateEngine());
viewResolver.setOrder(1);
setViewNames(新字符串[]{“*”});
viewsolver.setCache(false);
返回视图解析器;
}
}

将为任何能够解决此问题的人购买虚拟的一轮射击

我想您可以在templateEngine方法中添加以下内容:

engine.addMessageResolver(new StandardMessageResolver());
or engine.setMessageResolver(new StandardMessageResolver());

另外,从设计的角度来看,我建议您尝试使用thymeleaf的自动配置(删除排除项),以及spring boot自动为您提供的许多其他功能。

我放弃了这个自制配置,只是将所有thymeleaf配置放在application.properties中。i18n现在像冠军一样工作。