blob: ec6542176075466a9a82f96bb323bc147a8356aa [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="Date-Revision-yyyymmdd" content="20140918"/>
<meta http-equiv="Content-Language" content="en"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Message Resource Files</title>
<link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
<link href="/css/custom.css" rel="stylesheet">
<link href="/css/syntax.css" rel="stylesheet">
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="/bootstrap/js/bootstrap.js"></script>
<script type="text/javascript" src="/js/community.js"></script>
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/* We explicitly disable cookie tracking to avoid privacy issues */
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '41']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
</head>
<body>
<a href="https://github.com/apache/struts" class="github-ribbon">
<img decoding="async" loading="lazy" style="position: absolute; right: 0; border: 0;" width="149" height="149" src="https://github.blog/wp-content/uploads/2008/12/forkme_right_red_aa0000.png?resize=149%2C149" class="attachment-full size-full" alt="Fork me on GitHub" data-recalc-dims="1">
</a>
<header>
<nav>
<div role="navigation" class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" data-toggle="collapse" data-target="#struts-menu" class="navbar-toggle">
Menu
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="/index.html" class="navbar-brand logo"><img src="/img/struts-logo.svg"></a>
</div>
<div id="struts-menu" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Home<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/index.html">Welcome</a></li>
<li><a href="/download.cgi">Download</a></li>
<li><a href="/releases.html">Releases</a></li>
<li><a href="/announce-2024.html">Announcements</a></li>
<li><a href="http://www.apache.org/licenses/">License</a></li>
<li><a href="https://www.apache.org/foundation/thanks.html">Thanks!</a></li>
<li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
<li><a href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy Policy</a></li>
</ul>
</li>
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Support<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/mail.html">User Mailing List</a></li>
<li><a href="https://issues.apache.org/jira/browse/WW">Issue Tracker</a></li>
<li><a href="/security.html">Reporting Security Issues</a></li>
<li><a href="/commercial-support.html">Commercial Support</a></li>
<li class="divider"></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Migration+Guide">Version Notes</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Security+Bulletins">Security Bulletins</a></li>
<li class="divider"></li>
<li><a href="/maven/project-info.html">Maven Project Info</a></li>
<li><a href="/maven/struts2-core/dependencies.html">Struts Core Dependencies</a></li>
<li><a href="/maven/struts2-plugins/modules.html">Plugin Dependencies</a></li>
</ul>
</li>
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Documentation<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/birdseye.html">Birds Eye</a></li>
<li><a href="/primer.html">Key Technologies</a></li>
<li><a href="/kickstart.html">Kickstart FAQ</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Home">Wiki</a></li>
<li class="divider"></li>
<li><a href="/getting-started/">Getting Started</a></li>
<li><a href="/security/">Security Guide</a></li>
<li><a href="/core-developers/">Core Developers Guide</a></li>
<li><a href="/tag-developers/">Tag Developers Guide</a></li>
<li><a href="/maven-archetypes/">Maven Archetypes</a></li>
<li><a href="/plugins/">Plugins</a></li>
<li><a href="/maven/struts2-core/apidocs/index.html">Struts Core API</a></li>
<li><a href="/tag-developers/tag-reference.html">Tag reference</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/FAQs">FAQs</a></li>
<li><a href="http://cwiki.apache.org/S2PLUGINS/home.html">Plugin registry</a></li>
</ul>
</li>
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Contributing<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/youatstruts.html">You at Struts</a></li>
<li><a href="/helping.html">How to Help FAQ</a></li>
<li><a href="/dev-mail.html">Development Lists</a></li>
<li class="divider"></li>
<li><a href="/submitting-patches.html">Submitting patches</a></li>
<li><a href="/builds.html">Source Code and Builds</a></li>
<li><a href="/coding-standards.html">Coding standards</a></li>
<li><a href="/contributors/">Contributors Guide</a></li>
<li class="divider"></li>
<li><a href="/release-guidelines.html">Release Guidelines</a></li>
<li><a href="/bylaws.html">PMC Charter</a></li>
<li><a href="/volunteers.html">Volunteers</a></li>
<li><a href="https://gitbox.apache.org/repos/asf?p=struts.git">Source Repository</a></li>
<li><a href="/updating-website.html">Updating the website</a></li>
</ul>
</li>
<li class="apache"><a href="http://www.apache.org/"><img src="/img/apache.png"></a></li>
</ul>
</div>
</div>
</div>
</nav>
</header>
<article class="container">
<section class="col-md-12">
<a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/getting-started/message-resource-files.md" title="Edit this page on GitHub">Edit on GitHub</a>
<a href="index.html" title="back to Getting started"><< back to Getting started</a>
<h1 class="no_toc" id="message-resource-files">Message Resource Files</h1>
<ul id="markdown-toc">
<li><a href="#introduction" id="markdown-toc-introduction">Introduction</a></li>
<li><a href="#message-resource-property-files" id="markdown-toc-message-resource-property-files">Message Resource Property Files</a></li>
<li><a href="#struts-2-key-attribute" id="markdown-toc-struts-2-key-attribute">Struts 2 Key Attribute</a></li>
<li><a href="#struts-2-text-tag" id="markdown-toc-struts-2-text-tag">Struts 2 Text Tag</a></li>
<li><a href="#package-level-properties" id="markdown-toc-package-level-properties">Package Level Properties</a></li>
<li><a href="#global-properties" id="markdown-toc-global-properties">Global Properties</a></li>
<li><a href="#internationalization-i18n" id="markdown-toc-internationalization-i18n">Internationalization (i18n)</a></li>
<li><a href="#summary" id="markdown-toc-summary">Summary</a></li>
</ul>
<p>This tutorial assumes you’ve completed the <a href="form-validation">Form Validation</a> tutorial and have a working
<strong>form-validation</strong> project. The example code for this tutorial, <strong>message-resource</strong>, is available for checkout from the
Struts 2 GitHub repository at <a href="https://github.com/apache/struts-examples">struts-examples</a>.</p>
<h2 id="introduction">Introduction</h2>
<p>In this tutorial we’ll explore using Struts 2 message resource capabilities (also called resource bundles). Message
resources provide a simple way to put text in a view page that is the same throughout your application, to create form
field labels, and to change text to a specific language based on the user’s locale (i18n).</p>
<p>The <a href="http://struts.apache.org/mail">Struts 2 user mailing list</a> is an excellent place to get help. If you are having
a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don’t find an answer
to your problem, post a question on the mailing list.</p>
<h2 id="message-resource-property-files">Message Resource Property Files</h2>
<p>In a Struts 2 web application you may associate a message resource property file with each Struts 2 Action class by creating
a properties file with the same name as the Action class and having the .properties extension. This properties file must
go in the same package as the Action class. For our tutorial example, let’s say we want to place the form field labels
into a separate file where we can easily change them and also provide the capability to display the labels in other languages.</p>
<p>If you’re doing this tutorial after completing <a href="form-validation">Form Validation</a> then you can make these changes
to that tutorial’s example application.</p>
<p>Put the text below in a file named Register.properties in the <code class="language-plaintext highlighter-rouge">org.apache.struts.register.action</code> package
in the <code class="language-plaintext highlighter-rouge">src/main/resources</code> folder.</p>
<p><strong>Register.properties</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>personBean.firstName=First name
personBean.lastName=Last name
personBean.age=Age
personBean.email=Email
thankyou=Thank you for registering %{personBean.firstName}.
</code></pre></div></div>
<p>The above is just a standard Java properties file. The key is to the left of the = sign and the value for the key
is to the right. When the Register action is executed these properties will be available to the view page by referencing
the key name.</p>
<h2 id="struts-2-key-attribute">Struts 2 Key Attribute</h2>
<p>The Struts 2 key attribute can be used in the <a href="../tag-developers/textfield-tag">textfield</a> tag to instruct
the framework what value to use for the textfield’s name and label attributes. Instead of providing those attributes
and their values directly, you can just use the key attribute.</p>
<p>If you open register.jsp from the <a href="form-validation">Form Validation</a> tutorial you’ll see this Struts 2 textfield tag:</p>
<p><strong>textfield tag</strong></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;s:textfield</span> <span class="na">name=</span><span class="s">"personBean.firstName"</span> <span class="na">label=</span><span class="s">"First name"</span> <span class="nt">/&gt;</span>
</code></pre></div></div>
<p>Instead of specifying the name and label attributes you can just use the key attribute.</p>
<p><strong>textfield tag with key attribute</strong></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;s:textfield</span> <span class="na">key=</span><span class="s">"personBean.firstName"</span> <span class="nt">/&gt;</span>
</code></pre></div></div>
<p>The value for the key attribute instructs the Struts 2 framework to use the same value for the name attribute
(<code class="language-plaintext highlighter-rouge">personBean.firstName</code>). For the label attribute’s value the value of the key attribute is used by the Struts 2 framework
to find a key in a properties file with the same value. So in our example, Struts 2 will look in <code class="language-plaintext highlighter-rouge">Register.properties</code>
for a key with a value of <code class="language-plaintext highlighter-rouge">personBean.firstName</code>. The value of that key (<code class="language-plaintext highlighter-rouge">First name</code>) will be used as the label attribute’s value.</p>
<p>To enable the key attribute to find the properties file, the display of the view page must be the result of executing
a Struts 2 Action class. Right now if you examine index.jsp from the <a href="form-validation">Form Validation</a> tutorial
the link to the <code class="language-plaintext highlighter-rouge">register.jsp</code> page is a standard URL.</p>
<p><strong>link to register.jsp</strong></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;p&gt;&lt;a</span> <span class="na">href=</span><span class="s">"register.jsp"</span><span class="nt">&gt;</span>Please register<span class="nt">&lt;/a&gt;</span> for our prize drawing.<span class="nt">&lt;/p&gt;</span>
</code></pre></div></div>
<p>We need to change the above link so that it goes through the Register.java Struts 2 Action class. Replace the above with
this markup.</p>
<p><strong>link to Register Action class</strong></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;s:url</span> <span class="na">action=</span><span class="s">"registerInput"</span> <span class="na">var=</span><span class="s">"registerInputLink"</span> <span class="nt">/&gt;</span>
<span class="nt">&lt;p&gt;&lt;s:a</span> <span class="na">href=</span><span class="s">"%{registerInputLink}"</span><span class="nt">&gt;</span>Please register<span class="nt">&lt;/s:a&gt;</span> for our prize drawing.<span class="nt">&lt;/p&gt;</span>
</code></pre></div></div>
<p>We use the Struts 2 url tag to create a link to action registerInput. We then use that link as the value for the <code class="language-plaintext highlighter-rouge">href</code>
attribute of the anchor tag. We must define the registerInput action in <code class="language-plaintext highlighter-rouge">struts.xml</code>. Add the following to <code class="language-plaintext highlighter-rouge">struts.xml</code></p>
<p><strong>registerInput action node for struts.xml</strong></p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"registerInput"</span> <span class="na">class=</span><span class="s">"org.apache.struts.register.action.Register"</span> <span class="na">method=</span><span class="s">"input"</span> <span class="nt">&gt;</span>
<span class="nt">&lt;result</span> <span class="na">name=</span><span class="s">"input"</span><span class="nt">&gt;</span>/register.jsp<span class="nt">&lt;/result&gt;</span>
<span class="nt">&lt;/action&gt;</span>
</code></pre></div></div>
<p>The above action node instructs the Struts 2 framework to execute class Register’s input method in response to action
<code class="language-plaintext highlighter-rouge">registerInput</code>. The input method is inherited by class <code class="language-plaintext highlighter-rouge">Register</code> from class <code class="language-plaintext highlighter-rouge">ActionSupport</code>. The default behavior of
the inherited input method is to return the String input. The result node above specifies that if the returned result
is <code class="language-plaintext highlighter-rouge">input</code> then render the view <code class="language-plaintext highlighter-rouge">register.jsp</code>.</p>
<p>By doing the above the view page <code class="language-plaintext highlighter-rouge">register.jsp</code> will have access to the properties defined in <code class="language-plaintext highlighter-rouge">Register.properties</code>.
The Struts 2 framework will make those properties defined in <code class="language-plaintext highlighter-rouge">Register.properties</code> available to the view page since
the view page was rendered after <code class="language-plaintext highlighter-rouge">Register.java</code> (the Struts 2 Action class) was executed.</p>
<p>Follow the instructions (README.txt) in the project to create the war file and copy the war file to your servlet container.
Open a web browser and navigate to the home page specified in the README.txt file (<code class="language-plaintext highlighter-rouge">index.action</code>). You should see a link
to <code class="language-plaintext highlighter-rouge">registerInput.action</code> when mousing over the hyperlink <code class="language-plaintext highlighter-rouge">Please Register</code>.</p>
<p><img src="attachments/att14975007_registerInput.png" alt="registerInput.png" /></p>
<p>When you click on the Please Register link your browser should display the <code class="language-plaintext highlighter-rouge">register.jsp</code>. The form field labels should
be the key values from the <code class="language-plaintext highlighter-rouge">Register.properties</code> file.</p>
<p><img src="attachments/att14975006_register.png" alt="register.png" /></p>
<h2 id="struts-2-text-tag">Struts 2 Text Tag</h2>
<p>We can also use the Struts 2 text tag to display values from a properties file. In <code class="language-plaintext highlighter-rouge">thankyou.jsp</code> add this <code class="language-plaintext highlighter-rouge">text</code> tag
instead of the <code class="language-plaintext highlighter-rouge">h3</code> tag that is in <code class="language-plaintext highlighter-rouge">thankyou.jsp</code>.</p>
<p><strong>text tag</strong></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;h3&gt;&lt;s:text</span> <span class="na">name=</span><span class="s">"thankyou"</span> <span class="nt">/&gt;&lt;/h3&gt;</span>
</code></pre></div></div>
<p>Since <code class="language-plaintext highlighter-rouge">thankyou.jsp</code> is also rendered after executing the <code class="language-plaintext highlighter-rouge">Register.java</code> Action class, the key <code class="language-plaintext highlighter-rouge">thankyou</code> and its value
will be available to the view page.</p>
<p><img src="attachments/att14975009_thankyou.png" alt="thankyou.png" /></p>
<p>How did the value entered for the first name input field get displayed on <code class="language-plaintext highlighter-rouge">thankyou.jsp</code>? Look back at the value
for the <code class="language-plaintext highlighter-rouge">thankyou</code> key in the <code class="language-plaintext highlighter-rouge">Register.properties</code> file.</p>
<p><strong>Register.properties</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>thankyou=Thank you for registering %{personBean.firstName}.
</code></pre></div></div>
<p>The markup <code class="language-plaintext highlighter-rouge">%{personBean.firstName}</code> tells Struts 2 to replace this part with the result of calling <code class="language-plaintext highlighter-rouge">getPersonBean</code>,
which returns a <code class="language-plaintext highlighter-rouge">Person</code> object. Then call the <code class="language-plaintext highlighter-rouge">getFirstName</code> method which returns a String (the value the user inputted
into the <code class="language-plaintext highlighter-rouge">personBean.firstName</code> form field on <code class="language-plaintext highlighter-rouge">register.jsp</code>).</p>
<h2 id="package-level-properties">Package Level Properties</h2>
<p>What if you want a properties file with keys and values that can be referenced from multiple view pages and those view
pages are rendered after executing different Action classes? Struts 2 has the ability to use multiple property files
provided the property file is found in the package hierarchy.</p>
<p>Place the following in a file named <code class="language-plaintext highlighter-rouge">package.properties</code> and save that file in package <code class="language-plaintext highlighter-rouge">org.apache.struts</code> in <code class="language-plaintext highlighter-rouge">src/main/resources</code>.</p>
<p><strong>package.properties</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>greeting=Welcome to The Wonderful World of Struts 2
</code></pre></div></div>
<p>Now any view rendered by an Action that is in the hierarchy <code class="language-plaintext highlighter-rouge">org.apache.struts...</code> can use a Struts 2 <code class="language-plaintext highlighter-rouge">text</code> tag with
a <code class="language-plaintext highlighter-rouge">name</code> attribute value of <code class="language-plaintext highlighter-rouge">greeting</code> to display the value of the <code class="language-plaintext highlighter-rouge">greeting</code> property key. For example add the following
markup to <code class="language-plaintext highlighter-rouge">helloworld.jsp</code> before the <code class="language-plaintext highlighter-rouge">h2</code> tag.</p>
<p><strong>Using properties set in package.properties</strong></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;h1&gt;&lt;s:text</span> <span class="na">name=</span><span class="s">"greeting"</span> <span class="nt">/&gt;&lt;/h1&gt;</span>
</code></pre></div></div>
<p>Then rebuild the war file and deploy it to your servlet container. Go to index.action and click on the link for Hello World.
You should see:</p>
<p><img src="attachments/att14975005_hellogreeting.png" alt="hellogreeting.png" /></p>
<p>The property keys and values defined in package.properties are available to any view that is rendered after executing
an Action class that is the package hierarchy that includes <code class="language-plaintext highlighter-rouge">package.properties</code>.</p>
<h2 id="global-properties">Global Properties</h2>
<p>You can also specify a global property file in <code class="language-plaintext highlighter-rouge">struts.xml</code>. The keys and values defined in that property file will be
available to all the view pages that are rendered after executing an Action class.</p>
<p>Add the following to a file named <code class="language-plaintext highlighter-rouge">global.properties</code> (note the name doesn’t have to be global).</p>
<p><strong>global.properties</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>contact=For assistance contact &lt;a href='mailto:contact@email.com'&gt;contact@email.com&lt;/a&gt;
</code></pre></div></div>
<p>Save the <code class="language-plaintext highlighter-rouge">global.properties</code> file in the <code class="language-plaintext highlighter-rouge">src/main/resources</code> folder.</p>
<p>To inform the Struts 2 framework about the <code class="language-plaintext highlighter-rouge">global.properties</code> file add the follow node to <code class="language-plaintext highlighter-rouge">struts.xml</code> after the constant
<code class="language-plaintext highlighter-rouge">name="struts.devmode"</code> node.</p>
<p><strong>Specify Global Property File In struts.xml</strong></p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.custom.i18n.resources"</span> <span class="na">value=</span><span class="s">"global"</span> <span class="nt">/&gt;</span>
</code></pre></div></div>
<p>To use the contact key in a view page, add the following markup to <code class="language-plaintext highlighter-rouge">index.jsp</code> just before the closing body tag.</p>
<p><strong>Using contact property</strong></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;hr</span> <span class="nt">/&gt;</span>
<span class="nt">&lt;s:text</span> <span class="na">name=</span><span class="s">"contact"</span> <span class="nt">/&gt;</span>
</code></pre></div></div>
<p>Rebuild the war file, deploy it to your Servlet container, and then go to <code class="language-plaintext highlighter-rouge">index.action</code>. You should see:</p>
<p><img src="attachments/att14975004_contact.png" alt="contact.png" /></p>
<p>Struts 2 will look for a property key of contact in all the property files starting with the property file that matches
the Action class, then in the property files that are in the package hierarchy of the Action class, and then in any property
files specified in <code class="language-plaintext highlighter-rouge">struts.xml</code>. For this example Struts 2 will find the contact key in <code class="language-plaintext highlighter-rouge">global.properties</code>. The value
of the contact key will be displayed where we have put the text tag.</p>
<p>You can add the text tag above to all the JSPs in this example.</p>
<h2 id="internationalization-i18n">Internationalization (i18n)</h2>
<p>Using message resource files (resource bundles) also enables you to provide text in different languages. By default,
Struts 2 will use the user’s default locale. If that locale is en for English then the property files used will be
the ones without a locale specification (for example <code class="language-plaintext highlighter-rouge">Register.properties</code>). If the locale is not English but
say Spanish (es) then Struts 2 will look for a properties file named <code class="language-plaintext highlighter-rouge">Register_es.properties</code>.</p>
<p>To provide an example of Struts 2 support for i18n create a file named <code class="language-plaintext highlighter-rouge">Register_es.properties</code> and in that file add
the following Spanish translations.</p>
<p><strong>Register_es.properties</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>personBean.firstName=Nombre
personBean.lastName=Apellidos
personBean.age=Edad
personBean.email=Correo
thankyou=Gracias por registrarse, %{personBean.firstName}.
</code></pre></div></div>
<blockquote>
<p>My apologies to Spanish language speakers for any mistakes in the Spanish translations.</p>
</blockquote>
<p>Save the <code class="language-plaintext highlighter-rouge">Register_es.properties</code> file in the same package as <code class="language-plaintext highlighter-rouge">Register.properties</code>.</p>
<p>In our example application, we need to tell Struts 2 to use a locale value of es (since we’re not in a Spanish locale)
instead of the default locale value of our location (which is en). Add the following markup to index.jsp.</p>
<p><strong>Specify The Locale As a URL Parameter</strong></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;h3&gt;</span>Registro español<span class="nt">&lt;/h3&gt;</span>
<span class="nt">&lt;s:url</span> <span class="na">action=</span><span class="s">"registerInput"</span> <span class="na">var=</span><span class="s">"registerInputLinkES"</span><span class="nt">&gt;</span>
<span class="nt">&lt;s:param</span> <span class="na">name=</span><span class="s">"request_locale"</span><span class="nt">&gt;</span>es<span class="nt">&lt;/s:param&gt;</span>
<span class="nt">&lt;/s:url&gt;</span>
<span class="nt">&lt;p&gt;&lt;s:a</span> <span class="na">href=</span><span class="s">"%{registerInputLinkES}"</span><span class="nt">&gt;</span>Por favor, regístrese<span class="nt">&lt;/s:a&gt;</span> para nuestro sorteo<span class="nt">&lt;/p&gt;</span>
</code></pre></div></div>
<p>In the above markup we’ve added a parameter named request_locale to the URL. The value of that parameter is <code class="language-plaintext highlighter-rouge">es</code>.
The Action class that responds to this URL (<code class="language-plaintext highlighter-rouge">Register.java</code>) will see that the locale is <code class="language-plaintext highlighter-rouge">es</code> and will look for property
files with <code class="language-plaintext highlighter-rouge">_es</code> (for example <code class="language-plaintext highlighter-rouge">Register_es.properties</code>). It will use those property files to find the values of the property
keys referenced by the view page (e.g. <code class="language-plaintext highlighter-rouge">personBean.firstName</code>).</p>
<p>After clicking on the above link you should see the same form as before but with the form field labels in Spanish.</p>
<p><img src="attachments/att14975008_spanishform.png" alt="spanishform.png" /></p>
<p>If we implement the same concept by creating _es.properties versions of <code class="language-plaintext highlighter-rouge">global.properties</code> (<code class="language-plaintext highlighter-rouge">global_es.properties</code>)
and <code class="language-plaintext highlighter-rouge">package.properties</code> (<code class="language-plaintext highlighter-rouge">package_es.properties</code>) then we can create a complete registration web page in Spanish.
Download the finished example application for this tutorial from Github - <a href="https://github.com/apache/struts-examples/tree/master/message-resource">message-resource</a>
to see those property files and run the complete example with the registration form in Spanish.</p>
<h2 id="summary">Summary</h2>
<p>We’ve covered how to use message resources (resource bundles) in Struts 2 and also introduced how Struts 2 enables
internationalization (i18n) in this tutorial. To fully understand these concepts and learn more about Struts 2 consult
the main Struts 2 documentation available at <a href="http://struts.apache.org">http://struts.apache.org</a>.</p>
<table>
<tbody>
<tr>
<td>Return to <a href="form-validation">Form validation</a></td>
<td>or</td>
<td>onward to <a href="exception-handling">Exception handling</a></td>
</tr>
</tbody>
</table>
</section>
</article>
<footer class="container">
<div class="col-md-12">
Copyright &copy; 2000-2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
Apache Struts, Struts, Apache, the Apache feather logo, and the Apache Struts project logos are
trademarks of The Apache Software Foundation. All Rights Reserved.
</div>
<div class="col-md-12">Logo and website design donated by <a href="https://softwaremill.com/">SoftwareMill</a>.</div>
</footer>
<script>!function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (!d.getElementById(id)) {
js = d.createElement(s);
js.id = id;
js.src = "//platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js, fjs);
}
}(document, "script", "twitter-wjs");</script>
<script src="https://apis.google.com/js/platform.js" async="async" defer="defer"></script>
<div id="fb-root"></div>
<script>(function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s);
js.id = id;
js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
</body>
</html>