The framework supports internationalization (i18n) in two different places: the UI Tags and the action/field error messages, including the Validation messages.
Resource Bundle Search Order
Resource bundles are searched in the following order:
- ActionClass.properties
- BaseClass.properties (all the way to Object.properties)
- Interface.properties (every interface and sub-interface)
- ModelDriven's model (if implements ModelDriven), for the model object repeat from 1
- package.properties (of the directory where class is located and every parent directory all the way to the root directory)
- search up the i18n message key hierarchy itself
- global resource properties
For more, see the LocalizedTextUtil class.
|
Package hierarchy
To clarify #5, while traversing the package hierarchy, WW will look for a file package.properties:
com/
acme/
package.properties
actions/
package.properties
FooAction.java
FooAction.properties
If FooAction.properties does not exist, com/acme/action/package.properties will be searched for, if
not found com/acme/package.properties, if not found com/package.properties, etc.
|
Examples
There are several ways to access the message resources, including getText, the text tag, and the i18n tag.
Using getText
To display i18n text, use a call to getText in the property tag, or any other tag, such as the UI tags. (The getText technique is especially useful for labels of UI tags.)
<s:property value="getText('some.key')" />
Using the text tag
The text tag retrieves a message from the default resource bundle.
<-- Fourth Example -->
<s:text name="some.key" />
<-- Fifth Example -->
<s:text name="some.invalid.key" >
The Default Message That Will Be Displayed
</s:text>
Using the I18n tag
The i18n
tag pushes an arbitrary resource bundle on to the value stack. Other
tags within the scope of the i18n tag can display messages from that
resource bundle.
<s:i18n name="some.package.bundle" >
<s:text name="some.key" />
</s:i18n>
|
Internationalizing SiteMesh decorators is possible, but there are quirks. See SiteMesh Plugin for more.
|
I18n Interceptor
Essentially, the i18n Interceptor pushes a locale into the
ActionContext map upon every request. The framework components that
support localization all utilize the ActionContext locale. See I18n Interceptor for details.
Global Resources (struts.custom.i18n.resources) in struts.properties
A global resource bundle could be specified programatically, as well as the locale.
Comparison with Struts 1
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 StrutsActionSupport.properties in org/apache/struts2 and
put it on your classpath. This will only work well if all your actions
subclass StrutsActionSupport.