Struts 1 users should be familiar with the application.properties resource bundle, where you can put all the messages in the application that are going to be translated. Struts 2, though, splits the resource bundles per action or model class, and you may end up with duplicated messages in those resource bundles. A quick fix for that is to create a file called ActionSupport.properties in com/opensymphony/xwork2 and put it on your classpath. This will only work well if all your actions subclass XWork2's ActionSupport.
If you don't need to use the package-scan-functionality and only base on the global bundles (those provided by the framework and via
struts.custom.i18n.resources) you can use existing
GlobalLocalizedTextProvider implementation. To use this please define the following option in your
<constant name="struts.localizedTextProvider" value="defaultglobal-only" />
Custom TextProvider and TextProviderFactory