【发布时间】:2015-01-25 14:39:19
【问题描述】:
考虑一下
<constant name="struts.custom.i18n.resources"
value="messages/default,messages/customize" />
而default.properties的内容是
label.sample = Default Sample
而customize.properties的内容是
//Duplicate key
label.sample = Customize Sample
调用<s:text name="label.sample"> 将导致Customize Sample 如果我们查看上面的strust i18n,这似乎是正确的行为,因为我们首先定义了默认值,然后是自定义,因此自定义属性中的键将覆盖默认键。
现在我们尝试动态覆盖自定义消息。所以
<!--The customize is removed -->
<constant name="struts.custom.i18n.resources"
value="messages/default" />
在某些地方,例如启动 servlet,我们将自定义消息添加为:
LocalizedTextUtil.clearDefaultResourceBundles();
LocalizedTextUtil.addDefaultResourceBundle("messages/customize");
这行不通!作为替代方案,如果我们从 i18n 属性中删除默认值并按照以下方式进行操作,我们将获得自定义值
LocalizedTextUtil.clearDefaultResourceBundles();
LocalizedTextUtil.addDefaultResourceBundle("messages/default");
LocalizedTextUtil.addDefaultResourceBundle("messages/customize");
是否可以在 xml 中保留默认属性列表,只在运行时添加自定义属性
这就是我们需要它的原因 我们正在开发和托管一个销售给许多客户的网络应用程序。应用程序有一条默认消息。有可能我们的一位客户想要更改某些应用程序默认消息,而其他客户则不想。所以我们有一个自定义消息文件夹,让每个银行覆盖自己的消息。
我们为客户提供以下文件夹结构:
+messages
-resources_fa_IR.properties
-resources_en_US.properties
+customer1
-customize_fa_IR.properties
-customize_en_US.properties
+customer2
-customize_fa_IR.properties
-customize_en_US.properties
在 StartUpSerlvet 中
//Set customer customize messages
LocalizedTextUtil.addDefaultResourceBundle("messages/" + activeCustomer+"/customize");
【问题讨论】:
-
为什么需要这个?你真正想做什么?
-
亲爱的@AleksandrM 请看我的更新
-
首先,如果你想添加资源,你不应该调用
clearDefaultResourceBundles。您的StartUpSerlvet到底是什么以及它是如何配置的? -
clearDefaultResourceBundles你是对的。StartUpSevlet非常简单,ServletContextListener从一些属性文件中获取活跃客户并调用LocalizedTextUtil。如果你觉得有帮助,我可以把代码放在这里! -
如果你在
postInit方法中这样做对你有用吗?