【问题标题】:Spring Thymleaf internationalization does't getting messages from resourcesSpring Thymeleaf 国际化没有从资源中获取消息
【发布时间】:2017-05-30 04:53:19
【问题描述】:

我有 Spring web 项目。我想用 ThymLeaf 实现国际化。 我在资源下添加了消息文件。但我总是在页面上出现错误,例如??page.title_en_US??,或者如果在 QueryString 中传递lang=en,那么它看起来像??page.title_en??。 何时使用 MessageResource 在 Controller 中获取消息,它返回属性文件中定义的所有消息:messageSource.getMessage("page.title",null,locale) 我的资源文件结构是: 资源

                                       i18n/messages.properties
                                       i18n/messages_en.properties

这是我的 Bean 配置:

    /**
 * This method is used for configure thymeleaf view resolver.
 * This view resolver have second priority.
 * */
private ViewResolver thymeleafViewResolver() {
    ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();
    thymeleafViewResolver.setViewClass(ThymeleafView.class);
    thymeleafViewResolver.setTemplateEngine(templateEngine());

    return thymeleafViewResolver;
}


/**
 * This method is used to configure template engine for thymeleaf.
 * */
private SpringTemplateEngine templateEngine() {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResolver(templateResolver());

    return templateEngine;
}

/**
 * This method is used for configure the thymeleaf view configuration.
 * */
private SpringResourceTemplateResolver templateResolver() {
    SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
    //ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
    //ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
    resolver.setApplicationContext(applicationContext);
    resolver.setPrefix("/WEB-INF/views/templates/");
    resolver.setSuffix(".html");
    resolver.setTemplateMode(TemplateMode.HTML);

    resolver.setCharacterEncoding("UTF8");

    resolver.setOrder(2);
    return resolver;
}


@Override
public void configureDefaultServletHandling(
        DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

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

@Bean
public LocaleResolver localeResolver() {
    SessionLocaleResolver slr = new SessionLocaleResolver();
    slr.setDefaultLocale(Locale.US);
    return slr;
}


@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("i18n/messages");
    messageSource.setDefaultEncoding("UTF-8");
    // messageSource.setCacheSeconds(3600); //refresh cache once per hour
    return messageSource;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
    LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
    lci.setParamName("lang");
    return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(localeChangeInterceptor());
}

【问题讨论】:

  • Spring 自动获取资源文件夹下的消息属性文件。如果你删除 addResourceHandlers 和 messageSource bean 定义并直接移动资源文件夹下的文件有什么不同?
  • 我的问题已经解决了,我找到了解决方案。我错过了 templateResolvertemplateEngine 方法上的 @Bean 注释。

标签: java spring-mvc internationalization thymeleaf


【解决方案1】:

可能错过了bean配置类中“@Configuration”的注解。

【讨论】:

  • 这不应该是一个答案,而是一个评论
【解决方案2】:

我已经解决了我的问题。 @Bean 注释在 templateResolvertemplateEngine 上丢失。这些方法也应该是public

【讨论】:

    猜你喜欢
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多