在现有Web应用程序(JSP,Struts)中,本地化通过JSTL标记fmt:setbundle,fmt:message和.properties文件进行管理。
我想摆脱.properties文件并使用替代数据源进行本地化。
为了我的目标,我已经创建了自定义ResourceBundle和ResourceControl实现(有关数据选取位置的详细信息,xml,数据库,超出范围),但我想知道如何注册和使用它们默认/基于工厂文件的实现,因此我不必在Web应用程序文件中修改标记代码(fmt:message ...)。
我看到的示例指向替换fmtResourceKey会话值,但它仅限于一个捆绑包,它看起来像是" hack"。
有什么好主意吗?
感谢您的帮助!
答案 0 :(得分:3)
好吧,我似乎整理了子类化/自定义 java.util.ResourceBundle ,它还带有自定义 ResourceBundleControl 和 ResourceBundleControlProvider 的实现(通过服务提供商接口注入 - SPI)。
此页面中描述了类似的解决方案:
https://docs.oracle.com/javase/tutorial/i18n/serviceproviders/resourcebundlecontrolprovider.html
但缺少一个重要提示:“将您的JAR放入VM”,因为 ResourceBundle.GetBundle 方法在内部使用Serviceloader.LoadInstalled,它搜索安装在Java VM中的自定义提供程序,如中所述LoadInstalled 文档:
此方法仅供安装的提供程序使用 期望。生成的服务将仅查找并加载提供者 已经安装到当前的Java虚拟机中;供应商 在应用程序的类路径上将被忽略。
谢谢!