我们的Web应用程序使用Spring 2.5。它由几个模块组成,每个模块都可以带来额外的Spring上下文文件,这些文件会自动加载(到一个应用程序上下文中)。我们希望让每个模块提供额外的资源包(用于I18N支持)。
Spring通过在配置文件中注册名为messageSource的bean来支持国际化,但这假设我确切知道包含翻译字符串的类或属性文件的完全限定名称是什么。这是一个问题,因为其他模块可能将自己的属性文件放在不同的位置。所以我正在寻找一种方法让每个模块使用自己的资源包定义自己的messageSource,我不知道该怎么做。
有人知道这个问题的解决方案吗?
感谢。
答案 0 :(得分:0)
我在Spring中使用了Message Sources来获得一些i18n支持。在我的情况下,我只需要一个,因此很容易将我需要的一个消息源注入到我正在创建的服务bean中。
我希望看到类似我后来在Spring资源中提出的内容。但我没有看到任何会聚合异构消息源的东西。如果所有这些都是资源包的一部分,比如属性文件,我相信你可以编写一个ResourceBundleMessageSource的包装器,它可以在注册bean时动态更新。
但是,如果您想聚合异构MessageSource,这就是我的建议。创建一个消息源聚合bean,在加载时向ApplicationContext询问MessageSource.class类型的bean。然后,此聚合bean可以让每个源尝试解析密钥并格式化消息。根据您拥有的文件/消息源类的数量,您可能希望允许聚合实现优先考虑它首先尝试使用的那些。如果性能成为问题,您还可以缓存哪个源解析了哪些密钥,以便聚合器不必每次都猜测。