如何处理多个文件和消息在春季进行国际化?

2022-09-02 12:08:09

一些关于Spring国际化的文章告诉了如何交换通过区域设置等的消息,但我只发现了包含一些消息的用例

  • 如何组织和使用每个上下文的国际化文件?(验证、查看消息、默认消息、业务消息)

  • 我知道Spring使用模式(定义的消息文件的名称)+locale。例如:message_zh_CN。如何让每个上下文的文件了解此行为?

我认为应该是:

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

或:

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

答案 1

您可以为所有这些不同的消息文件定义一个全局变量。使用以下方法,此方法是实用的:MessageSourcesetBasenames

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

    return messageSource;
}

如果您的消息键在所有文件中都是唯一的,则此方法是有意义的,例如 键仅在与业务相关的消息源中退出。否则,最好为每个上下文定义一个,并根据您的上下文注入它们:business-12MessageSource

@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;
}

答案 2

推荐