spring-projects / spring-framework

Spring Framework
https://spring.io/projects/spring-framework
Apache License 2.0
56.66k stars 38.14k forks source link

Support additional file formats in `ReloadableResourceBundleMessageSource` #18990

Closed spring-projects-issues closed 1 year ago

spring-projects-issues commented 8 years ago

Loรฏc Dreux opened SPR-14419 and commented

ReloadableResourceBundleMessageSource could store and load Properties with a custom implementation of the PropertiesPersister like YamlPropertiesPersister.java but the extensions ".properties" and ".xml" are hard coded in Java Source.

A good solution could be to add a property "customExtension" to support other file format like yaml.


Affects: 4.2.6

spring-projects-issues commented 5 years ago

Bulk closing outdated, unresolved issues. Please, reopen if still relevant.

62mkv commented 5 years ago

I would say it's relevant!

pierrickrouxel commented 5 years ago

I think this is relevant too. All my application is YAML configured (properties, liquibase..) excepted messages. It's really frustrating. Without this support we must use two different markup language to maintain our projects.

Gorynych commented 4 years ago

Is it possible to reopen an issue?

MysteryMS commented 4 years ago

i think it is relevant too

tonyfarney commented 4 years ago

It's relevant!

ghahramani commented 3 years ago

any updates on this?

cristianchies commented 3 years ago

Really waiting for it!!! It's relevant!

ashutosh049 commented 3 years ago

At least tell us when will this be resolved.

m-a-g-i-c commented 3 years ago

This issue still relevant

ghost commented 3 years ago

I am here too. Seems relevant to me

wesleyody commented 3 years ago

Nice issue

renanfranca commented 3 years ago

I really like this issue! ๐Ÿ’•

5452 commented 3 years ago

look forward

christian-kocke commented 2 years ago

I would really appreciate this feature!

smunozudp commented 2 years ago

@christian-kocke I found a repo with a work around of this issue, hope it helps. https://github.com/akkinoc/yaml-resource-bundle

grzeg commented 2 years ago

it is relevant for sure!

viviendehorta commented 2 years ago

yes, it's relevant

luismarques99 commented 2 years ago

I agree, this is a very relevant feature

jmussman commented 2 years ago

Yep. Lots of us need this. Anything that's hard-coded is really bad code, so it's high time it was refactored anyways. Externalize it and use polymorphism to support Yaml!

slimane-deb commented 1 year ago

And here I am again too checking for any updates. Still find it relevant

javadev-jef commented 1 year ago

It's super relevant!

poutsma commented 1 year ago

Thanks for your input everyone, we will be addressing this feature request in 6.1.

malikalamgirian commented 1 year ago

It is relevant for me as well :)

MysteryMS commented 1 year ago

Thanks for your input everyone, we will be addressing this feature request in 6.1.

YES! it took almost 7 years... but we got it ๐ŸŽ‰๐ŸŽ‰๐ŸŽ‰

Thanthu commented 1 year ago

Thanks for your input everyone, we will be addressing this feature request in 6.1.

YES! it took almost 7 years... but we got it ๐ŸŽ‰๐ŸŽ‰๐ŸŽ‰

From which version of Spring Boot is this feature available ? Any resource available with example of its usage would be nice.

sbrannen commented 1 year ago

From which version of Spring Boot is this feature available ? Any resource available with example of its usage would be nice.

@Thanthu, this issue is still open, which means that the feature has not been released yet.

sdeleuze commented 1 year ago

Thanks everybody for your patience, this issue should be be fixed by this commit.

I was a bit confused initially by the fact that the description of the changes proposed looked irrelevant to ResourceBundleMessageSource, but I understood after digging deeper that it was a typo, and that the change was targeting ReloadableResourceBundleMessageSource which allows to set a custom PropertiesPersister and indeed had .properties and .xml extensions hard coded. The title and description of the issue have been updated accordingly.

In ReloadableResourceBundleMessageSource, it is now possible to customize the file extensions thanks to a new setFileExtensions setter, and combined with setPropertiesPersister, it is possible to implement support for custom file formats.

Since it seems to be a popular use case, I have implemented an example of YAML resource bundle support in https://github.com/sdeleuze/demo-yaml-message-source. The important bits are the YamlPropertiesLoader leveraging org.springframework.beans.factory.config.YamlMapFactoryBean and the declaration of a custom MessageSource bean here:

@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("classpath:messages");
    messageSource.setPropertiesPersister(new YamlPropertiesLoader());
    messageSource.setFileExtensions(List.of(".yml", ".yaml"));
    return messageSource;
}

Spring does not provide such out-of-the box YAML support yet, but hopefully that can serve as an example for the community for how to leverage this feature, and will allow the Spring team to observe how the community leverages those capabilities, which implementations get traction, etc.

hannah23280 commented 1 year ago

this issue has been closed. does that mean Spring framework out of the box finally support yaml format for message source?

hannah23280 commented 1 year ago

if out the box is supported, does spring boot able to autoconfigure to support both yaml and properties, instead of developer having to write codes to configure them.

sbrannen commented 1 year ago

this issue has been closed. does that mean Spring framework out of the box finally support yaml format for message source?

@hannah23280, please read the closing comments for an issue before asking a question.

This was answered in the comment immediately preceding yours.

Spring does not provide such out-of-the box YAML support yet, but hopefully that can serve as an example for the community for how to leverage this feature, and will allow the Spring team to observe how the community leverages those capabilities, which implementations get traction, etc.

hannah23280 commented 8 months ago

Thanks for your input everyone, we will be addressing this feature request in 6.1.

Currently is already 6.1.x, i look through the changes , but could not see anything mentioning this.

bclozel commented 8 months ago

@hannah23280 we don't list all changes on this page. This feature has been delivered with milestone 4 as listed on this page and the release notes: https://github.com/spring-projects/spring-framework/releases/tag/v6.1.0-M4

hannah23280 commented 8 months ago

@hannah23280 we don't list all changes on this page. This feature has been delivered with milestone 4 as listed on this page and the release notes: https://github.com/spring-projects/spring-framework/releases/tag/v6.1.0-M4

Thanks! Saw it. That means ReloadableResourceBundleMessageSource can support additional file formats. Hopefully spring boot will autoconfigure it to include yaml , without us developer having to manually do it

bclozel commented 8 months ago

@hannah23280 I'm not sure what feature you're expecting in Spring Boot, but there's nothing scheduled at the moment in that area.

hannah23280 commented 8 months ago

@hannah23280 I'm not sure what feature you're expecting in Spring Boot, but there's nothing scheduled at the moment in that area.

Since it is possible for ReloadableResourceBundleMessageSource to support additional file formats, and given the popular usage of yaml, so i thought i'ts might be a matter of time Spring Boot will autoconfigure the ReloadableResourceBundleMessageSource to include yaml as well, so that developers don't have to do it themselves.

sascha08-15 commented 8 months ago

Thanks everybody for your patience, this issue should be be fixed by this commit.

I was a bit confused initially by the fact that the description of the changes proposed looked irrelevant to ResourceBundleMessageSource, but I understood after digging deeper that it was a typo, and that the change was targeting ReloadableResourceBundleMessageSource which allows to set a custom PropertiesPersister and indeed had .properties and .xml extensions hard coded. The title and description of the issue have been updated accordingly.

In ReloadableResourceBundleMessageSource, it is now possible to customize the file extensions thanks to a new setFileExtensions setter, and combined with setPropertiesPersister, it is possible to implement support for custom file formats.

Since it seems to be a popular use case, I have implemented an example of YAML resource bundle support in https://github.com/sdeleuze/demo-yaml-message-source. The important bits are the YamlPropertiesLoader leveraging org.springframework.beans.factory.config.YamlMapFactoryBean and the declaration of a custom MessageSource bean here:

@Bean
public MessageSource messageSource() {
  ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
  messageSource.setBasename("classpath:messages");
  messageSource.setPropertiesPersister(new YamlPropertiesLoader());
  messageSource.setFileExtensions(List.of(".yml", ".yaml"));
  return messageSource;
}

Spring does not provide such out-of-the box YAML support yet, but hopefully that can serve as an example for the community for how to leverage this feature, and will allow the Spring team to observe how the community leverages those capabilities, which implementations get traction, etc.

I tried your implementation and it works IFF one uses the yml with a flat list of attributes. But isn't the entire point of yml vs. properties file to have a more object oriented way to specify i8n texts?

So working with this:

hello.world: hellรถ
hello:
  world: Hello

Only the first one works with Thymeleaf using <h1 th:text="#{hello.world}"></h1> in the template. The second one, I fail to address - any ideas why that happens and how to work around it?

Aniokrait commented 8 months ago

@sascha08-15 I had the same issue.
I replaced YamlMapFactoryBean with YamlPropertiesFactoryBean in the load method of YamlPropertiesLoader and it worked.

public class YamlPropertiesLoader implements PropertiesPersister {

    @Override
    public void load(Properties props, InputStream is) {
//      YamlMapFactoryBean yaml = new YamlMapFactoryBean();
                YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
        yaml.setResources(new InputStreamResource(is));
        props.putAll(yaml.getObject());
    }
sascha08-15 commented 8 months ago

@Aniokrait Thanks for the quick answer! Works like a charm now!