Lucas Lucas - 1 month ago 14
Java Question

How to handle multiple files and messages for internationalization in Spring?

Some articles about Spring internationalization tell how to swap messages passing the locale and etc, but I only found use cases that contains a few messages..


  • How can I organize and use internationalization files per context? (validation, view messages, default messages, business messages)

  • I know that Spring uses the pattern (name of message file defined) +
    locale. e.g: message_zh_CN. How can I have files per context knowing
    about this behavior?



What I think it should be:

resources
`-- messages
|-- validation
| |-- message_locale.properties
| `-- message_locale2.properties
|-- business
| |-- message_locale.properties
| `-- message_locale2.properties
`-- view
|-- message_locale.properties
`-- message_locale2.properties


OR:

resources
`-- messages
|-- validation
| |-- validation_locale.properties
| `-- validation_locale2.properties
|-- business
| |-- business_locale.properties
| `-- business_locale2.properties
`-- view
|-- view_locale.properties
`-- view_locale2.properties

Answer

You can either define a global MessageSource for all those different message files. This approach is practical using the setBasenames method:

@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource = 
                                               new ReloadableResourceBundleMessageSource();
    messageSource.setBasenames("classpath:/messages/business/message", 
                               "classpath:/messages/validation/message",
                               "classpath:/messages/view/message");

    return messageSource;
}

This approach makes sense if your message keys are unique across all files, e.g. business-12 key only exits in business related message sources. Otherwise, it's better to define one MessageSource per context and inject them according to your context:

@Bean
public MessageSource businessMessageSource() {
    ReloadableResourceBundleMessageSource messageSource = 
                                               new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("classpath:/messages/business/message");

    return messageSource;
}

@Bean
public MessageSource validationMessageSource() {
    ReloadableResourceBundleMessageSource messageSource = 
                                               new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("classpath:/messages/validation/message");

    return messageSource;
}

@Bean
public MessageSource viewMessageSource() {
    ReloadableResourceBundleMessageSource messageSource = 
                                               new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("classpath:/messages/view/message");

    return messageSource;
}