如何在Spring中处理多个文件和消息以实现国际化?

时间:2016-10-20 21:51:10

标签: java spring internationalization

一些关于Spring国际化的文章讲述了如何交换传递语言环境等的消息,但我只发现包含一些消息的用例 ..

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

  • 我知道Spring使用模式(定义的消息文件的名称)+ 语言环境。 例如: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

OR:

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

1 个答案:

答案 0 :(得分:15)

您可以为所有这些不同的消息文件定义全局MessageSource。使用setBasenames方法,这种方法很实用:

@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-12密钥仅退出与业务相关的消息来源。否则,最好为每个上下文定义一个MessageSource并根据您的上下文注入它们:

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