考虑一下
<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中保留默认属性列表,并且只在运行时添加自定义属性
这就是我们需要的原因 我们正在开发和托管一个销售给许多客户的Web应用程序。该应用程序有一个默认消息。我们的一个客户可能想要更改一些应用程序默认消息而其他客户不想更改。因此,我们有一个自定义消息文件夹,让每个银行覆盖自己的消息。
我们为客户提供以下文件夹结构:
+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");
答案 0 :(得分:1)
它不起作用,因为您的自定义ServletContextListener
在S2添加struts.custom.i18n.resources
的默认资源包之前运行。
解决方案是从S2添加所有默认资源包之后执行的某个地方执行LocalizedTextUtil.addDefaultResourceBundle
。
例如,您可以扩展StrutsPrepareAndExecuteFilter
并在postInit
方法中执行此操作。