如何在 thymeleaf 中使用消息属性文件的自定义位置?

问题描述 投票:0回答:5

我使用 thymeleaf 和 spring,我的 messages.properties 文件需要与模板具有相同的名称才能正常工作。我尝试使用 webConfigurer.Java 创建自定义路径,但它不起作用。

WebConfigurer.java 来源:

...
...
@EnableWebMvc
@EnableTransactionManagement
@Configuration
@ComponentScan({"en.irp.project.*"})
@PropertySource("classpath:/application.properties")
@Import({SecurityConfigurer.class})
public class WebConfigurer extends WebMvcConfigurerAdapter {
    ...
    ...
    ...
    @Bean(name="messageSource")
    public ReloadableResourceBundleMessageSource messageSource() {
        ReloadableResourceBundleMessageSource resource = new ReloadableResourceBundleMessageSource();
        resource.setBasename("WEB-INF/languages/messages");
        resource.setDefaultEncoding("UTF-8");
        return resource;
    }

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

    @Bean(name = "localeResolver")
    public SessionLocaleResolver localeResolver() {
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(new Locale("en"));
        return localeResolver;
    }
    ...
    ...
}
spring thymeleaf
5个回答
10
投票

仅供以后参考。

如果使用Spring Boot,您还可以在application.properties文件中设置其自定义位置:

spring.messages.basename=i18n/messages

Javadoc:

以逗号分隔的基本名称列表,每个都位于 ResourceBundle 后面 习俗。本质上是一个完全限定的类路径位置。如果它 不包含包限定符(例如“org.mypackage”),它将 从类路径根解析。


3
投票

messages.properties 文件需要与模板同名的想法并不常见。但是,您可以通过侦听配置中的所有文件来解决此问题。

messageSource.setBasenames("classpath:i18n/template1","classpath:i18n/template2"...);

如果将它们放入类路径中或将

classpath:i18n
替换为
WEB-INF/languages
。 也许您可以通过程序逻辑创建基本名称列表。 请记住,即使使用这种方法,消息键也只能在应用程序中定义一次。


1
投票

我遇到了同样的问题,我的工作如下。

@Bean
public MessageSource messageSource()
{       
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasenames( "file:" + System.getProperty( "web.server.message" ), "/WEB-INF/languages/messages" );
    messageSource.setDefaultEncoding( CHARACTER_ENCODING );
    return messageSource;
}

这里我想在 DEV 模式下使用不同的消息文件集,因此我在 pom.xml 中使用了系统属性作为消息文件路径。我的消息文件采用以下格式:语言文件夹下的 messages_en.properties。

<systemProperties>                    
     <web.server.message>${basedir}/src/main/resources/conf/languages/messages</web.server.message>
</systemProperties>

0
投票

在您的 application.properties 文件中,只需提及 spring.messages.baseDir 的值即可。

@Bean
public ReloadableResourceBundleMessageSource messageSource() {
    ReloadableResourceBundleMessageSource resource = new ReloadableResourceBundleMessageSource();
    List<String> baseNames = new ArrayList<>();
    String baseName = applicationProperties.getString("spring.messages.basename", DEFAULT_MESSAGE_BASENAME);
    String messageResourcePath = applicationProperties.getString("spring.messages.baseDir");
    if(isNotEmpty(messageResourcePath)){
        baseNames.add(String.format("file:%s", Paths.get(messageResourcePath, baseName)));
    }
    baseNames.add(String.format("classpath:%s", baseName));
    resource.setBasenames(baseNames.toArray(new String[baseNames.size()]));
    String encoding = applicationProperties.getString("spring.messages.encoding", CHARACTER_ENCODING);
    LOGGER.debug("Encoding is set to :: {}", encoding);
    resource.setDefaultEncoding(encoding);
    resource.setUseCodeAsDefaultMessage(true);
    return resource;
}

0
投票

我知道这是一个老问题,但在 Google 中得到了很好的引用。

我终于在Github中找到了这个问题的解决方案https://github.com/thymeleaf/thymeleaf-spring/issues/9

你必须使用

setTemplateEngineMessageSource(MessageSource)

我做了什么

@Service
public class TemplateEngineService {
    private Logger log = LoggerFactory.getLogger(getClass());

    private final SpringTemplateEngine thymeleafTemplateEngine;

    public TemplateEngineService(SpringTemplateEngine thymeleafTemplateEngine) {
        this.thymeleafTemplateEngine = thymeleafTemplateEngine;
    }

    public String processTemplate(String templatePath, String messagePath, String locale, Map<String, Object> variables) {
        thymeleafTemplateEngine.setTemplateEngineMessageSource(getMessageSource(messagePath));
        // ...
    }

    public MessageSource getMessageSource(String messagePath) {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename( messagePath);
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

}

© www.soinside.com 2019 - 2024. All rights reserved.