Modified: websites/production/tapestry/content/component-rendering.html
==============================================================================
--- websites/production/tapestry/content/component-rendering.html (original)
+++ websites/production/tapestry/content/component-rendering.html Sun Feb 25
23:20:05 2018
@@ -31,8 +31,6 @@
<link href='/resources/highlighter/styles/shThemeCXF.css' rel='stylesheet'
type='text/css' />
<script src='/resources/highlighter/scripts/shCore.js'
type='text/javascript'></script>
<script src='/resources/highlighter/scripts/shBrushJava.js'
type='text/javascript'></script>
- <script src='/resources/highlighter/scripts/shBrushXml.js'
type='text/javascript'></script>
- <script src='/resources/highlighter/scripts/shBrushPlain.js'
type='text/javascript'></script>
<script>
SyntaxHighlighter.defaults['toolbar'] = false;
SyntaxHighlighter.all();
@@ -211,9 +209,7 @@ public class Count
}
}
</pre>
-</div></div><p>Returning false from next() causes Tapestry to re-run the
BeginRender phase, and from there, re-render the component's body (this
component does not have a template). Returning true transitions to the
CleanupRender phase.</p><p>Notice how Tapestry adapts to your methods, as
marked with the annotations. It also adapts in terms of parameters; the two
annotated methods here did not perform any output, so they did not need a
MarkupWriter.</p><p>What's really mind blowing is that the template and body of
a component will often contain ... more components! That means that many
different components will be in different phases of their own state
machine.</p><h2 id="ComponentRendering-RenderPhasesinDetail">Render Phases in
Detail</h2><p></p><div class="navmenu" style="float:right; width:50%;
background:#eee; margin:3px; padding:3px">
-<div class="confluence-information-macro
confluence-information-macro-note"><span class="aui-icon aui-icon-small
aui-iconfont-warning confluence-information-macro-icon"></span><div
class="confluence-information-macro-body">
-<p>The SetupRender phase, like all render phases, occurs once for each
rendering of the component. If the component is inside a looping component (<a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Loop.html">Loop</a>,
<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Grid.html">Grid</a>,
etc.), then the SetupRender method will be called once for <em>each</em>
iteration of the loop.</p></div></div></div><h3
id="ComponentRendering-SetupRender">SetupRender</h3><p>The SetupRender phase
(see @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/SetupRender.html">SetupRender</a>)
is where you can perform any one-time per-render setup for your component.
This is a good place to read component parameters and use them to set temporary
instance variables.</p><h3 id="ComponentRendering-BeginRender">BeginRender</
h3><p>The BeginRender phase (see @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/BeginRender.html">BeginRender</a>)
occurs at the start of the rendering of the component. For components that
render a tag, the start tag should be rendered here (the close tag should be
rendered inside the AfterRender phase). The component can also prevent the
template and/or body from being rendered by returning false.</p><p>Components
may or may not have a template. If a component has a template, and the template
includes a <body> element, then the BeforeRenderBody phase will be
triggered (giving the component the option of rendering its body or
not).</p><p>If a component does not have a <body> element in its
template, then the BeforeRenderBody phase is not triggered.</p><p>If a
component does not have a template, but does have a body, the BeforeRenderBody
phase is still triggered.</p><p>If no methods are annotated with BeginRen
der, then no special output occurs during this phase, but the template (if
present) or body (if no template is present, but the component has a body) will
be rendered.</p><h3
id="ComponentRendering-BeforeRenderTemplate">BeforeRenderTemplate</h3><p>The
BeforeRenderTemplate phase (see @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/BeforeRenderTemplate.html">BeforeRenderTemplate</a>)
exists to allow a component to decorate its template (creating markup around
the template generated markup), or to allow a component to skip its
template.</p><h3
id="ComponentRendering-BeforeRenderBody">BeforeRenderBody</h3><p>The
BeforeRenderBody phase (see @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/BeforeRenderBody.html">BeforeRenderBody</a>)
is associated with a component's body (the portion of its container's template
that the component occupies). The BeforeRenderBody phase al
lows the component the ability to skip the body, while still rendering the
rest of the component's template (if any).</p><p>If no methods are annotated
with BeforeRenderBody, then the body will be rendered by default. Again, this
occurs when the <body> element of the component's template is reached, or
automatically if the component has no template (but the component does have a
body).</p><h3
id="ComponentRendering-AfterRenderBody">AfterRenderBody</h3><p>The
AfterRenderBody phase (see @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/AfterRenderBody.html">AfterRenderBody</a>)
is executed after the body is rendered; this only occurs for components with a
body.</p><h3 id="ComponentRendering-AfterRender">AfterRender</h3><p>The
AfterRender phase (see @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/AfterRender.html">AfterRender</a>)
complements BeginRender, and is
often used to render the close tag that matches the start tag rendered in the
BeginRender phase. In any case, the AfterRender phase can continue on to
CleanupRender, or revert back to BeginRender (as in our Count component
example, above).</p><p>If no methods are annotated with AfterRender, then no
special output occurs, and the CleanupRender phase is triggered.</p><h3
id="ComponentRendering-CleanupRender">CleanupRender</h3><p>The CleanupRender
phase (see @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/CleanupRender.html">CleanupRender</a>)
is the counterpart to SetupRender, allowing final cleanup to occur.</p><h2
id="ComponentRendering-UsingMethodNamesinsteadofAnnotations">Using Method Names
instead of Annotations</h2><p>If you prefer to avoid using annotations on your
methods, you may do so by providing specific names for your methods. The
required method name is the annotation name, with the first character
decapitaliz
ed: setupRender(), beginRender(), etc. As with annotated render phase methods,
Tapestry is flexible about visibility, return type and parameters.</p><p>Using
this mechanism, the earlier example can be rewritten as:</p><div class="code
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>Returning false from next() causes Tapestry to re-run the
BeginRender phase, and from there, re-render the component's body (this
component does not have a template). Returning true transitions to the
CleanupRender phase.</p><p>Notice how Tapestry adapts to your methods, as
marked with the annotations. It also adapts in terms of parameters; the two
annotated methods here did not perform any output, so they did not need a
MarkupWriter.</p><p>What's really mind blowing is that the template and body of
a component will often contain ... more components! That means that many
different components will be in different phases of their own state
machine.</p><h2 id="ComponentRendering-RenderPhasesinDetail">Render Phases in
Detail</h2><div class="confluence-information-macro
confluence-information-macro-note"><span class="aui-icon aui-icon-small
aui-iconfont-warning confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>The SetupRender phase
, like all render phases, occurs once for each rendering of the component. If
the component is inside a looping component (<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Loop.html">Loop</a>,
<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Grid.html">Grid</a>,
etc.), then the SetupRender method will be called once for <em>each</em>
iteration of the loop.</p></div></div><h3
id="ComponentRendering-SetupRender">SetupRender</h3><p>The SetupRender phase
(see @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/SetupRender.html">SetupRender</a>)
is where you can perform any one-time per-render setup for your component.
This is a good place to read component parameters and use them to set temporary
instance variables.</p><h3
id="ComponentRendering-BeginRender">BeginRender</h3><p>The BeginRender phase (s
ee @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/BeginRender.html">BeginRender</a>)
occurs at the start of the rendering of the component. For components that
render a tag, the start tag should be rendered here (the close tag should be
rendered inside the AfterRender phase). The component can also prevent the
template and/or body from being rendered by returning false.</p><p>Components
may or may not have a template. If a component has a template, and the template
includes a <body> element, then the BeforeRenderBody phase will be
triggered (giving the component the option of rendering its body or
not).</p><p>If a component does not have a <body> element in its
template, then the BeforeRenderBody phase is not triggered.</p><p>If a
component does not have a template, but does have a body, the BeforeRenderBody
phase is still triggered.</p><p>If no methods are annotated with BeginRender,
then no special output oc
curs during this phase, but the template (if present) or body (if no template
is present, but the component has a body) will be rendered.</p><h3
id="ComponentRendering-BeforeRenderTemplate">BeforeRenderTemplate</h3><p>The
BeforeRenderTemplate phase (see @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/BeforeRenderTemplate.html">BeforeRenderTemplate</a>)
exists to allow a component to decorate its template (creating markup around
the template generated markup), or to allow a component to skip its
template.</p><h3
id="ComponentRendering-BeforeRenderBody">BeforeRenderBody</h3><p>The
BeforeRenderBody phase (see @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/BeforeRenderBody.html">BeforeRenderBody</a>)
is associated with a component's body (the portion of its container's template
that the component occupies). The BeforeRenderBody phase allows the component
the ability
to skip the body, while still rendering the rest of the component's template
(if any).</p><p>If no methods are annotated with BeforeRenderBody, then the
body will be rendered by default. Again, this occurs when the <body>
element of the component's template is reached, or automatically if the
component has no template (but the component does have a body).</p><h3
id="ComponentRendering-AfterRenderBody">AfterRenderBody</h3><p>The
AfterRenderBody phase (see @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/AfterRenderBody.html">AfterRenderBody</a>)
is executed after the body is rendered; this only occurs for components with a
body.</p><h3 id="ComponentRendering-AfterRender">AfterRender</h3><p>The
AfterRender phase (see @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/AfterRender.html">AfterRender</a>)
complements BeginRender, and is often used to render the clos
e tag that matches the start tag rendered in the BeginRender phase. In any
case, the AfterRender phase can continue on to CleanupRender, or revert back to
BeginRender (as in our Count component example, above).</p><p>If no methods are
annotated with AfterRender, then no special output occurs, and the
CleanupRender phase is triggered.</p><h3
id="ComponentRendering-CleanupRender">CleanupRender</h3><p>The CleanupRender
phase (see @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/CleanupRender.html">CleanupRender</a>)
is the counterpart to SetupRender, allowing final cleanup to occur.</p><h2
id="ComponentRendering-UsingMethodNamesinsteadofAnnotations">Using Method Names
instead of Annotations</h2><p>If you prefer to avoid using annotations on your
methods, you may do so by providing specific names for your methods. The
required method name is the annotation name, with the first character
decapitalized: setupRender(), beginRender
(), etc. As with annotated render phase methods, Tapestry is flexible about
visibility, return type and parameters.</p><p>Using this mechanism, the earlier
example can be rewritten as:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">package org.example.app.components;
import org.apache.tapestry5.annotations.Parameter;
@@ -286,7 +282,7 @@ public class Count
</div></div><h2 id="ComponentRendering-ShortCircuiting">Short
Circuiting</h2><p>If a method returns a true or false value, this will short
circuit processing. Other methods within the phase that would ordinarily be
invoked will not be invoked.</p><p>Most render phase methods should return
void, to avoid unintentionally short circuiting other methods for the same
phase.</p><h2 id="ComponentRendering-MethodConflictsandOrdering">Method
Conflicts and Ordering</h2><p>It is possible to have multiple methods that are
annotated with the same render phase annotation. This may include methods in
the same class, or a mix of method defined in a class and inherited from other
classes.</p><h3 id="ComponentRendering-MixinsBeforeComponent">Mixins Before
Component</h3><p>When a component has <a
href="component-mixins.html">mixins</a>, then the mixins' render phase methods
execute <em>before</em> the component's render phase methods. If a mixin
extends from a base class, the mixin's parent class met
hods execute before the mixin subclass' render phase methods.</p><p>Exception:
Mixins whose class is annotated with @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/MixinAfter.html">MixinAfter</a>
are ordered <em>after</em> the component, not before.</p><p>The order in which
the mixins of a given class (@MixinAfter or mixins before) execute is
determined by the ordering constraints specified for the mixins. If no
constraints are provided, the order is undefined. See <a
href="component-mixins.html">Component Mixins</a> for more details.</p><h3
id="ComponentRendering-ParentsbeforeChild">Parents before Child</h3><p>Ordering
is always parent-first. Methods defined in the parent class are always invoked
before methods defined in the child class.</p><p>When a sub-class overrides an
render phase method of a base class, the method is only invoked once, along
with any other base class methods. The subclass can change the <em>implem
entation</em> of the base class method via an override, but can't change the
<em>timing</em> of when that method is invoked. See <a class="external-link"
href="https://issues.apache.org/jira/browse/TAPESTRY-2311">TAPESTRY-2311</a>.</p><h3
id="ComponentRendering-ReverseOrderingforAfterXXXandCleanupRender">Reverse
Ordering for AfterXXX and CleanupRender</h3><p>The After_XXX_ phases exists to
balance the Begin_XXX_ and Before_XXX_ phases. Often elements will be started
inside an earlier phase and then the elements will be ended (closed) inside the
corresponding After_XXX_ phase (with the body and template of the component
rendering between).</p><p>In order to ensure that operations occur in the
correct, and natural order, the render phase methods for these two stages are
invoked in <em>reverse order</em>:</p><ul><li>Subclass methods</li><li>Parent
class methods</li><li>Mixin subclass methods</li><li>Mixin parent class
methods</li></ul><h3 id="ComponentRendering-WithinaSingleClass">Wit
hin a Single Class</h3><p>Currently, rendering methods having the same
annotation within a single class are executed in alphabetical order by method
name. Methods with the same name are ordered by number of parameters. Even so,
annotating multiple methods with the same rendering phase is not a great idea.
Instead, just define one method, and have it call the other methods in the
order you desire.</p><h2 id="ComponentRendering-RenderingComments">Rendering
Comments</h2><p>Starting with version 5.3, Tapestry can optionally emit
rendering comments for all requests; these are comments such as <!--BEGIN
Index:loop (context:Index.tml, line 15)--> that can assist you in debugging
markup output on the client-side. This will significantly increase the size of
the rendered markup, but can be very helpful with complex layouts to determine
which component was responsible for which portion of the rendered
page.</p><p>Rendering comments are only available when not running in <a
href="config
uration.html">production mode</a>.</p><p>To turn on rendering comments for all
requests, set the <a
href="configuration.html">tapestry.component-render-tracing-enabled</a>
configuration symbol to "true".</p><p>To turn on rendering comments only for a
particular request, add the query parameter <code>t:component-trace=true</code>
to the URL:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">
http://www.example.com/myapp/mypage?t:component-trace=true
</pre>
-</div></div></div>
+</div></div><p></p></div>
</div>
<div class="clearer"></div>
Modified: websites/production/tapestry/content/component-templates.html
==============================================================================
--- websites/production/tapestry/content/component-templates.html (original)
+++ websites/production/tapestry/content/component-templates.html Sun Feb 25
23:20:05 2018
@@ -100,7 +100,7 @@
<span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
<div class="details">
- <a href="templating-and-markup-faq.html">Templating
and Markup FAQ</a>
+ <a href="component-reference.html">Component
Reference</a>
</div>
@@ -109,7 +109,7 @@
<span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
<div class="details">
- <a href="component-classes.html">Component Classes</a>
+ <a href="component-libraries.html">Component
Libraries</a>
</div>
@@ -118,7 +118,7 @@
<span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
<div class="details">
- <a href="component-reference.html">Component
Reference</a>
+ <a href="templating-and-markup-faq.html">Templating
and Markup FAQ</a>
</div>
@@ -127,7 +127,7 @@
<span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
<div class="details">
- <a href="component-libraries.html">Component
Libraries</a>
+ <a href="component-classes.html">Component Classes</a>
</div>
@@ -337,7 +337,7 @@
</t:replace>
</t:extend>
</pre>
-</div></div></div>
+</div></div><p></p></div>
</div>
<div class="clearer"></div>
Modified: websites/production/tapestry/content/configuration.html
==============================================================================
--- websites/production/tapestry/content/configuration.html (original)
+++ websites/production/tapestry/content/configuration.html Sun Feb 25 23:20:05
2018
@@ -147,11 +147,11 @@
<h1 id="Configuration-ConfiguringTapestry">Configuring Tapestry</h1><p>This
page discusses all the ways in which Tapestry can be configured. Tapestry
applications are configured almost entirely using Java, with very little XML at
all.</p><p><strong>Contents</strong></p><p><style type="text/css">/*<![CDATA[*/
-div.rbtoc1519597278097 {padding: 0px;}
-div.rbtoc1519597278097 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1519597278097 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1519600771703 {padding: 0px;}
+div.rbtoc1519600771703 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1519600771703 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1519597278097">
+/*]]>*/</style></p><div class="toc-macro rbtoc1519600771703">
<ul class="toc-indentation"><li><a
href="#Configuration-XMLconfiguration(web.xml)">XML configuration
(web.xml)</a></li><li><a
href="#Configuration-YourApplication'sModuleClass">Your Application's Module
Class</a></li><li><a
href="#Configuration-ConfigurationSymbolNames">Configuration Symbol
Names</a></li><li><a
href="#Configuration-SettingComponentParameterDefaults">Setting Component
Parameter Defaults</a></li><li><a
href="#Configuration-ConfiguringIgnoredPaths">Configuring Ignored
Paths</a></li><li><a
href="#Configuration-ConfiguringContentTypeMapping">Configuring Content Type
Mapping</a></li><li><a href="#Configuration-SettingExecutionModes">Setting
Execution Modes</a></li><li><a
href="#Configuration-SegregatingApplicationsIntoFolders">Segregating
Applications Into Folders</a></li></ul>
</div><h2 id="Configuration-XMLconfiguration(web.xml)">XML configuration
(web.xml)</h2><p>Tapestry runs on top of the standard Java Servlet API. To the
servlet container, such as Tomcat, Tapestry appears as a <em>servlet
filter</em>. This gives Tapestry great flexibility in matching URLs without
requiring lots of XML configuration.</p><p>Although most configuration is done
with Java, a small but necessary amount of configuration occurs inside the
servlet deployment descriptor, WEB-INF/web.xml. Most of the configuration is
boilerplate, nearly the same for all applications.</p><div class="code panel
pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>web.xml (partial)</b></div><div
class="codeContent panelContent pdl">
<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"><!DOCTYPE web-app
@@ -520,7 +520,7 @@ div.rbtoc1519597278097 li {margin-left:
}
}
</pre>
-</div></div><div class="confluence-information-macro
confluence-information-macro-information"><span class="aui-icon aui-icon-small
aui-iconfont-info confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>This extra mapping is
unfortunately necessary, because the Servlet API does not provide a way for a
servlet filter, such as the one used by Tapestry, to know about its
mapping.</p></div></div><p>This changes the servlet container to <em>only</em>
forward requests inside the <code>t5app</code> folder to Tapestry; requests for
other folders (or the root folder) will not be passed to Tapestry at all. The
symbol contribution informs Tapestry to change the URLs it generates to include
the necessary folder name; it also affects the logic in Tapestry that
recognizes and handles requests.</p><p>In addition, if you choose to place page
template files in the context, rather than on the classpath (as with component
templates), then you will place those tem
plate files inside the <code>t5app</code> folder.</p><p>At this time, it is
still not possible to run multiple Tapestry 5 applications within the same web
application.</p></div>
+</div></div><div class="confluence-information-macro
confluence-information-macro-information"><span class="aui-icon aui-icon-small
aui-iconfont-info confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>This extra mapping is
unfortunately necessary, because the Servlet API does not provide a way for a
servlet filter, such as the one used by Tapestry, to know about its
mapping.</p></div></div><p>This changes the servlet container to <em>only</em>
forward requests inside the <code>t5app</code> folder to Tapestry; requests for
other folders (or the root folder) will not be passed to Tapestry at all. The
symbol contribution informs Tapestry to change the URLs it generates to include
the necessary folder name; it also affects the logic in Tapestry that
recognizes and handles requests.</p><p>In addition, if you choose to place page
template files in the context, rather than on the classpath (as with component
templates), then you will place those tem
plate files inside the <code>t5app</code> folder.</p><p>At this time, it is
still not possible to run multiple Tapestry 5 applications within the same web
application.</p><p> </p><p></p></div>
</div>
<div class="clearer"></div>
Modified: websites/production/tapestry/content/dom.html
==============================================================================
--- websites/production/tapestry/content/dom.html (original)
+++ websites/production/tapestry/content/dom.html Sun Feb 25 23:20:05 2018
@@ -31,8 +31,6 @@
<link href='/resources/highlighter/styles/shThemeCXF.css' rel='stylesheet'
type='text/css' />
<script src='/resources/highlighter/scripts/shCore.js'
type='text/javascript'></script>
<script src='/resources/highlighter/scripts/shBrushJava.js'
type='text/javascript'></script>
- <script src='/resources/highlighter/scripts/shBrushXml.js'
type='text/javascript'></script>
- <script src='/resources/highlighter/scripts/shBrushPlain.js'
type='text/javascript'></script>
<script>
SyntaxHighlighter.defaults['toolbar'] = false;
SyntaxHighlighter.all();
@@ -77,9 +75,10 @@
</div>
<div id="content">
- <div id="ConfluenceContent"><h1
id="DOM-DocumentObjectModel">Document Object Model</h1><p>Tapestry 5 takes a
very different approach to markup generation than most other frameworks.
Components render out a Document Object Model (DOM). This is a tree of nodes
representing elements, attributes and text within a document.</p><p>Once all
rendering is complete, the DOM tree is streamed to the client.</p><p>The <a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/MarkupWriter.html">MarkupWriter</a>
interface allows the majority of component code to treat the generation of
output as a stream. In reality, MarkupWriter is more like a cursor into the DOM
tree, and the DOM may ultimately be operated upon in a random access manner
(rather than the serial (or buffered) approach used in Tapestry 4).</p><div
class="navmenu" style="float:right; width:30%; background:white; margin:3px;
padding:3px">
-<div class="confluence-information-macro
confluence-information-macro-information"><p class="title">A Note For Tapestry
4 Users</p><span class="aui-icon aui-icon-small aui-iconfont-info
confluence-information-macro-icon"></span><div
class="confluence-information-macro-body">
-<p>In Tapestry 4, markup generation was based on generating a character
stream. At the lowest level, the fact that the output was in a markup format
such as HTML, XHTML or WML was not known. Higher levels, such as the
IMarkupWriter interface (and its implementations) provide the concept of markup
generation: elements, attributes, start tags and end tags. This technique
breaks down when two elements are peers, and not in a parent/child
relationship. For example, the rendering of a FieldLabel component is affected
by its companion TextField component. Handling these cases in Tapestry 4
required a number of kludges and special cases.</p></div></div></div><h1
id="DOM-DOMClasses">DOM Classes</h1><p>The implementation of this DOM is part
of Tapestry, despite the fact that several third-party alternatives exist. This
represents a desire to limit dependencies for the framework, but also the
Tapestry DOM is streamlined for initial creation, and a limited amount of
subsequent modification. Mo
st DOM implementations are more sophisticated than needed for Tapestry, with
greater support for querying (often using XPath) and manipulation.</p><p>Once
the Document object is created, you don't directly create new DOM objects;
instead, each DOM object includes methods that create new sub-objects. This
primarily applies to the Element class, which can be a container of text,
comments and other elements.</p><h2 id="DOM-Document">Document</h2><p>The <a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/dom/Document.html">Document</a>
object represents the an entire document, which is to say, an entire response
to be sent to the client.</p><p>Documents will have a single root element. The
newRootElement() method is used to create the root element for the
document.</p><p>The Document class also has methods for setting and getting the
DTD, adding comments and text, and finding an element based on a path of
element names.</p><h2 id="DOM-Element"
>Element</h2><p>An <a class="external-link"
>href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/dom/Element.html">Element</a>
> object represents an element of the document. Elements may have attributes,
>and they may themselves contain other elements, as well as text and
>comments.</p><p>The Element class has methods for searching, traversing and
>manipulating the DOM after it is built.</p><h1
>id="DOM-DOMManipulation/Rewriting">DOM Manipulation/Rewriting</h1><p>A
>powerful feature of Tapestry 5 is the ability to manipulate the structure and
>ordering of the DOM after it has been rendered. For example, this can be used
>to alter the output of a component that may otherwise be outside of your
>control.</p><p>DOM manipulation is surprisingly fast, too.</p><p>Methods on
>Node (and Element, which is a subclass of Node) allow an existing node to be
>moved relative to an Element. Nodes may be moved before or after the Element,
>or may be moved inside an Element at the top (the firs
t child) or the bottom (the last child).</p><p>Element's
<code>attribute</code> method adds a new attribute name/value pair to the
Element. If an existing attribute with the specified name already exists, then
then the new value is ignored. This has implications when different pieces of
code try to add attributes to an Element ... the first to add an attribute will
"win". Conversely, the <code>forceAttributes</code> method can be used to
update or remove an attribute.</p><p>In addition, the children of an Element
may be removed or a Node (and all of its children) removed
entirely.</p><p>Finally, an Element may "pop": the Element is removed and
replaced with its children.</p><h1
id="DOM-MarkupWriter">MarkupWriter</h1><p>The <a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/MarkupWriter.html">MarkupWriter
interface</a> allows the structure of the document to be built while
maintaining a streaming metaphor.</p><h2 id="DOM-element()andend()m
ethods">element() and end() methods</h2><p>Calls to element() create a new
element within the tree, and may provide attributes for the new element as
well. Calls to write(), writeln() and writef() write text nodes within the
current element. <em>Every call to element() should be matched with a call to
end()</em>, which is used to move the current node up one level.</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
+ <div id="ConfluenceContent"><h1
id="DOM-DocumentObjectModel">Document Object Model</h1><p>Tapestry 5 takes a
very different approach to markup generation than most other frameworks.
Components render out a Document Object Model (DOM). This is a tree of nodes
representing elements, attributes and text within a document.</p><p>Once all
rendering is complete, the DOM tree is streamed to the client.</p><p>The <a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/MarkupWriter.html">MarkupWriter</a>
interface allows the majority of component code to treat the generation of
output as a stream. In reality, MarkupWriter is more like a cursor into the DOM
tree, and the DOM may ultimately be operated upon in a random access manner
(rather than the serial (or buffered) approach used in Tapestry 4).</p><div
style="float:right; width:30%"><div class="confluence-information-macro
confluence-information-macro-information"><p class="title">A
Note For Tapestry 4 Users</p><span class="aui-icon aui-icon-small
aui-iconfont-info confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>In Tapestry 4, markup generation
was based on generating a character stream. At the lowest level, the fact that
the output was in a markup format such as HTML, XHTML or WML was not known.
Higher levels, such as the IMarkupWriter interface (and its implementations)
provide the concept of markup generation: elements, attributes, start tags and
end tags. This technique breaks down when two elements are peers, and not in a
parent/child relationship. For example, the rendering of a FieldLabel component
is affected by its companion TextField component. Handling these cases in
Tapestry 4 required a number of kludges and special cases.</p></div></div></div>
+
+
+<h1 id="DOM-DOMClasses">DOM Classes</h1><p>The implementation of this DOM is
part of Tapestry, despite the fact that several third-party alternatives exist.
This represents a desire to limit dependencies for the framework, but also the
Tapestry DOM is streamlined for initial creation, and a limited amount of
subsequent modification. Most DOM implementations are more sophisticated than
needed for Tapestry, with greater support for querying (often using XPath) and
manipulation.</p><p>Once the Document object is created, you don't directly
create new DOM objects; instead, each DOM object includes methods that create
new sub-objects. This primarily applies to the Element class, which can be a
container of text, comments and other elements.</p><h2
id="DOM-Document">Document</h2><p>The <a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/dom/Document.html">Document</a>
object represents the an entire document, which is to say, an entire response
to be sent to the client.</p><p>Documents will have a single root element. The
newRootElement() method is used to create the root element for the
document.</p><p>The Document class also has methods for setting and getting the
DTD, adding comments and text, and finding an element based on a path of
element names.</p><h2 id="DOM-Element">Element</h2><p>An <a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/dom/Element.html">Element</a>
object represents an element of the document. Elements may have attributes,
and they may themselves contain other elements, as well as text and
comments.</p><p>The Element class has methods for searching, traversing and
manipulating the DOM after it is built.</p><h1
id="DOM-DOMManipulation/Rewriting">DOM Manipulation/Rewriting</h1><p>A powerful
feature of Tapestry 5 is the ability to manipulate the structure and ordering
of the DOM after it has been rendered. For example, this can be used to alter
the output o
f a component that may otherwise be outside of your control.</p><p>DOM
manipulation is surprisingly fast, too.</p><p>Methods on Node (and Element,
which is a subclass of Node) allow an existing node to be moved relative to an
Element. Nodes may be moved before or after the Element, or may be moved inside
an Element at the top (the first child) or the bottom (the last
child).</p><p>Element's <code>attribute</code> method adds a new attribute
name/value pair to the Element. If an existing attribute with the specified
name already exists, then then the new value is ignored. This has implications
when different pieces of code try to add attributes to an Element ... the first
to add an attribute will "win". Conversely, the <code>forceAttributes</code>
method can be used to update or remove an attribute.</p><p>In addition, the
children of an Element may be removed or a Node (and all of its children)
removed entirely.</p><p>Finally, an Element may "pop": the Element is removed
and replaced
with its children.</p><h1 id="DOM-MarkupWriter">MarkupWriter</h1><p>The <a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/MarkupWriter.html">MarkupWriter
interface</a> allows the structure of the document to be built while
maintaining a streaming metaphor.</p><h2
id="DOM-element()andend()methods">element() and end() methods</h2><p>Calls to
element() create a new element within the tree, and may provide attributes for
the new element as well. Calls to write(), writeln() and writef() write text
nodes within the current element. <em>Every call to element() should be matched
with a call to end()</em>, which is used to move the current node up one
level.</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> writer.element("img", "src", "icon.png", "width", 20,
"height", 20, alt, "*");
writer.end();
</pre>
Modified: websites/production/tapestry/content/extending-the-if-component.html
==============================================================================
--- websites/production/tapestry/content/extending-the-if-component.html
(original)
+++ websites/production/tapestry/content/extending-the-if-component.html Sun
Feb 25 23:20:05 2018
@@ -77,7 +77,7 @@
</div>
<div id="content">
- <div id="ConfluenceContent"><h1
id="ExtendingtheIfComponent-ExtendingtheIfComponent">Extending the If
Component</h1><p>The <a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/If.html">If</a>
component can be made very flexible; its main parameter, <code>test</code>,
does not <em>have</em> to be bound to a boolean value, it merely has to be
bound to a value that can be <a
href="extending-the-if-component.html">coerced</a> to boolean.</p><p>For
example, you may be working on an application that does a lot of <a
class="external-link"
href="http://lucene.apache.org/java/docs/index.html">Lucene</a> searches, and
you represent the results as a SearchResult object:</p><div class="code panel
pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>SearchResult.java</b></div><div
class="codeContent panelContent pdl">
+ <div id="ConfluenceContent"><h1
id="ExtendingtheIfComponent-ExtendingtheIfComponent">Extending the If
Component</h1><p>The <a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/If.html">If</a>
component can be made very flexible; its main parameter, <code>test</code>,
does not <em>have</em> to be bound to a boolean value, it merely has to be
bound to a value that can be <a
href="parameter-type-coercion.html">coerced</a> to boolean.</p><p>For example,
you may be working on an application that does a lot of <a
class="external-link"
href="http://lucene.apache.org/java/docs/index.html">Lucene</a> searches, and
you represent the results as a SearchResult object:</p><div class="code panel
pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>SearchResult.java</b></div><div
class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">public class SearchResult<T> {
public final Class<T> itemType;
public final List<T> items;
@@ -108,7 +108,7 @@
</t:if>
</t:if>
</pre>
-</div></div><p>The first test checks to see if <code>searchResult</code> is
not null (null is treated as false). The second checks to see if the search
result is empty.</p><p>What we'd like is for the test to look at the
<code>searchResult</code> directly and treat an empty search result as false,
and a non-empty search result as true. This is similar to what Tapestry already
does for Collections.</p><p>This is just a matter of extending the TypeCoercer
service:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>AppModule.java (partial)</b></div><div class="codeContent panelContent
pdl">
+</div></div><p>The first test checks to see if <code>searchResult</code> is
not null (null is treated as false). The second checks to see if the search
result is empty.</p><p>What we'd like is for the test to look at the
<code>searchResult</code> directly and treat an empty search result as false,
and a non-empty search result as true. This is similar to what Tapestry already
does for Collections.</p><p>This is just a matter of adding a <a
href="parameter-type-coercion.html">
<code>Coercion</code></a><code>:</code></p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>AppModule.java (partial)</b></div><div
class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">public static void
contributeTypeCoercer(Configuration<CoercionTuple> configuration) {
add(configuration, SearchResult.class, Boolean.class,
Modified: websites/production/tapestry/content/layout-component.html
==============================================================================
--- websites/production/tapestry/content/layout-component.html (original)
+++ websites/production/tapestry/content/layout-component.html Sun Feb 25
23:20:05 2018
@@ -273,7 +273,7 @@ public class Layout
</body>
</html>
 </pre>
-</div></div></div>
+</div></div><p></p></div>
</div>
<div class="clearer"></div>
Modified: websites/production/tapestry/content/legacy-javascript.html
==============================================================================
--- websites/production/tapestry/content/legacy-javascript.html (original)
+++ websites/production/tapestry/content/legacy-javascript.html Sun Feb 25
23:20:05 2018
@@ -182,9 +182,12 @@
</div>
-<p>In production mode, by default, Tapestry will merge JavaScript libraries,
add version numbering, and set a far-future expires header to encourage
aggressive browser caching. Starting with version 5.3, Tapestry can also
automatically minify (compress) JavaScript libraries when in <a
href="configuration.html">production mode</a>.</p><p>In addition, as will be
described in detail <a href="legacy-javascript.html">below</a>, Tapestry comes
with the <a class="external-link" href="http://www.prototypejs.org/"
rel="nofollow">Prototype</a> and <a class="external-link"
href="http://script.aculo.us/" rel="nofollow">Scriptaculous</a> libraries, or
you can easily swap in JQuery using a 3rd-party module.</p><h1
id="LegacyJavaScript-AddingCustomJavaScript">Adding Custom
JavaScript</h1><p>When adding your own custom JavaScript or third-party
libraries, just follow the strategies below to take advantage of Tapestry's
JavaScript support mechanisms.</p><p>The recommended practice in Tapestry is
to package up any significant amount of JavaScript as a static JavaScript
library, a .js file that can be downloaded to the client. Keep your in-page
JavaScript code to a minimum, just the few statements needed to initialize
objects and reference methods in the JavaScript libraries.</p><h2
id="LegacyJavaScript-LinkingtoyourJavaScriptlibraries">Linking to your
JavaScript libraries</h2><p>Tapestry provides several ways to add a link to a
JavaScript library within your page or component. Although you can use direct
<code><script type="text/javascript" src="xxx.js"></script></code>
approach, you should only use it for JavaScript that resides outside of your
application. For JavaScript within your app, Tapestry provides <em>much</em>
better ways to do the same thing. Most users choose the simplest, the @Import
annotation approach.</p><div class="navmenu" style="float:right;
background:#eee; margin:3px; padding:0 1em">
-<p><strong>JumpStart Demo:</strong> <br clear="none">
-<a class="external-link"
href="http://jumpstart.doublenegative.com.au/jumpstart/examples/javascript/javascript"
rel="nofollow">JavaScript</a> </p></div><h2
id="LegacyJavaScript-Approach1:@Import">Approach 1: @Import</h2><p>Use the @<a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Import.html">Import</a>
annotation (or @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/IncludeJavaScriptLibrary.html">IncludeJavaScriptLibrary</a>
in Tapestry 5.0 and 5.1) to include links to JavaScript (and CSS) files in
your page or component. Tapestry ensures that each such file is only referenced
once in your page.</p><div class="sectionColumnWrapper"><div
class="sectionMacro"><div class="sectionMacroRow"><div class="columnMacro"><div
class="code panel pdl" style="border-width: 1px;"><div class="codeHeader
panelHeader pdl" style="border-bottom-width: 1px;"><b>For Tapestry 5.2 and late
r</b></div><div class="codeContent panelContent pdl">
+<p>In production mode, by default, Tapestry will merge JavaScript libraries,
add version numbering, and set a far-future expires header to encourage
aggressive browser caching. Starting with version 5.3, Tapestry can also
automatically minify (compress) JavaScript libraries when in <a
href="configuration.html">production mode</a>.</p><p>In addition, as will be
described in detail <a href="legacy-javascript.html">below</a>, Tapestry comes
with the <a class="external-link" href="http://www.prototypejs.org/"
rel="nofollow">Prototype</a> and <a class="external-link"
href="http://script.aculo.us/" rel="nofollow">Scriptaculous</a> libraries, or
you can easily swap in JQuery using a 3rd-party module.</p><h1
id="LegacyJavaScript-AddingCustomJavaScript">Adding Custom
JavaScript</h1><p>When adding your own custom JavaScript or third-party
libraries, just follow the strategies below to take advantage of Tapestry's
JavaScript support mechanisms.</p><p>The recommended practice in Tapestry is
to package up any significant amount of JavaScript as a static JavaScript
library, a .js file that can be downloaded to the client. Keep your in-page
JavaScript code to a minimum, just the few statements needed to initialize
objects and reference methods in the JavaScript libraries.</p><h2
id="LegacyJavaScript-LinkingtoyourJavaScriptlibraries">Linking to your
JavaScript libraries</h2><p>Tapestry provides several ways to add a link to a
JavaScript library within your page or component. Although you can use direct
<code><script type="text/javascript" src="xxx.js"></script></code>
approach, you should only use it for JavaScript that resides outside of your
application. For JavaScript within your app, Tapestry provides <em>much</em>
better ways to do the same thing. Most users choose the simplest, the @Import
annotation approach.</p><div style="float: right; max-width: 30%"><div
class="panel" style="border-color: #eee;border-width: 1px;"><div
class="panelHeader" style="bord
er-bottom-width: 1px;border-bottom-color: #eee;background-color:
#eee;"><b>JumpStart Demo</b></div><div class="panelContent">
+<p> <a class="external-link"
href="http://jumpstart.doublenegative.com.au/jumpstart/examples/javascript/javascript"
rel="nofollow">JavaScript</a></p>
+</div></div></div>
+
+
+<h2 id="LegacyJavaScript-Approach1:@Import">Approach 1: @Import</h2><p>Use the
@<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Import.html">Import</a>
annotation (or @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/IncludeJavaScriptLibrary.html">IncludeJavaScriptLibrary</a>
in Tapestry 5.0 and 5.1) to include links to JavaScript (and CSS) files in
your page or component. Tapestry ensures that each such file is only referenced
once in your page.</p><div class="sectionColumnWrapper"><div
class="sectionMacro"><div class="sectionMacroRow"><div class="columnMacro"><div
class="code panel pdl" style="border-width: 1px;"><div class="codeHeader
panelHeader pdl" style="border-bottom-width: 1px;"><b>For Tapestry 5.2 and
later</b></div><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">@Import(library={"context:js/jquery.js",
"context:js/myeffects.js"})
public class MyComponent
@@ -224,9 +227,12 @@ public class MyComponent
renderSupport.addScriptLink(myEffects);
}
</pre>
-</div></div></div></div></div></div><p>Tapestry will ensure that the necessary
<link> elements are added to the <em>top</em> of the document (in the
<head> element). With Tapestry 5.3 and later the new elements are
inserted at the bottom of the <head> element; in versions before 5.3 they
appear at the top of the <head> element).</p><p>As with the annotation
approach, adding the same asset multiple times does <em>not</em> create
duplicate links.</p><p>The <code>setupRender</code> method (the name is
specifically linked to a <a href="legacy-javascript.html">render phase</a>) is
the correct place to inform the JavaScriptSupport (or RenderSupport) service
that the library is needed.</p><div class="navmenu" style="float:right;
background:#eee; margin:3px; padding:0 1em">
-<p><strong>JumpStart Demo:</strong> <br clear="none">
-<a class="external-link"
href="http://jumpstart.doublenegative.com.au/jumpstart/examples/javascript/reusable"
rel="nofollow">Reusable JavaScript</a> </p></div><h3
id="LegacyJavaScript-TheaddScriptmethod">The <code>addScript</code>
method</h3><p>The <code>addScript</code> method is used when you need to add
some JavaScript code directly to the page. This will be inserted at the
<em>bottom of the document</em>, and will only be executed when the document
has finished loading on the client (i.e., from the window.onload event
handler).</p><div class="sectionColumnWrapper"><div class="sectionMacro"><div
class="sectionMacroRow"><div class="columnMacro"><div class="code panel pdl"
style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>Tapestry 5.2 and later</b></div><div
class="codeContent panelContent pdl">
+</div></div></div></div></div></div><p>Tapestry will ensure that the necessary
<link> elements are added to the <em>top</em> of the document (in the
<head> element). With Tapestry 5.3 and later the new elements are
inserted at the bottom of the <head> element; in versions before 5.3 they
appear at the top of the <head> element).</p><p>As with the annotation
approach, adding the same asset multiple times does <em>not</em> create
duplicate links.</p><p>The <code>setupRender</code> method (the name is
specifically linked to a <a href="legacy-javascript.html">render phase</a>) is
the correct place to inform the JavaScriptSupport (or RenderSupport) service
that the library is needed.</p><div style="max-width: 30%; float: right;"><div
class="panel" style="border-color: #eee;border-width: 1px;"><div
class="panelHeader" style="border-bottom-width: 1px;border-bottom-color:
#eee;background-color: #eee;"><b>JumpStart Demo</b></div><div
class="panelContent">
+<p> <a class="external-link"
href="http://jumpstart.doublenegative.com.au/jumpstart/examples/javascript/reusable"
rel="nofollow">Reusable JavaScript</a></p>
+</div></div></div>
+
+
+<h3 id="LegacyJavaScript-TheaddScriptmethod">The <code>addScript</code>
method</h3><p>The <code>addScript</code> method is used when you need to add
some JavaScript code directly to the page. This will be inserted at the
<em>bottom of the document</em>, and will only be executed when the document
has finished loading on the client (i.e., from the window.onload event
handler).</p><div class="sectionColumnWrapper"><div class="sectionMacro"><div
class="sectionMacroRow"><div class="columnMacro"><div class="code panel pdl"
style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>Tapestry 5.2 and later</b></div><div
class="codeContent panelContent pdl">
<pre class="brush: text; gutter: false; theme: Default"
style="font-size:12px;">void afterRender()
{
javaScriptSupport.addScript(
@@ -316,11 +322,12 @@ public class MyComponent
</div></div><p>Then use it somewhere else:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> new Effect.Fade($(myId), { duration:
$T(myid).fadeDuration });
</pre>
-</div></div><h1 id="LegacyJavaScript-AjaxComponentsandMixins">Ajax Components
and Mixins</h1><p class="confluence-link">Tapestry provides easy-to-use support
for <em>Ajax</em>, the technique of using JavaScript to dynamically updating
parts of a web page with content from the server without redrawing the whole
page. See <a href="ajax-and-zones.html">Ajax and Zones</a> for
details.</p><h1 id="LegacyJavaScript-Built-inLibraries">Built-in
Libraries</h1><p></p><div class="navmenu" style="float:right; width:30%;
background:#eee; margin:3px; padding:3px">
-<p><font color="green"><strong>Alternatives to Prototype</strong></font><br
clear="none">
-Tapestry also works well with other JavaScript libraries, such as JQuery and
ExtJS:</p>
-<ul><li><strong><a class="external-link"
href="https://github.com/got5/tapestry5-jquery" rel="nofollow">Tapestry5-Jquery
module</a></strong> – Using JQuery <em>instead of</em>
Prototype</li><li><a class="external-link"
href="http://wiki.apache.org/tapestry/Tapestry5HowToIntegrateJQuery">Tapestry5HowToIntegrateJQuery</a>
– Using JQuery <em>in addition to</em> Prototype</li><li><a
class="external-link"
href="https://issues.apache.org/jira/browse/TAP5-999">TAP5-999</a> tracks work
underway to introduce an agnostic tapestry.js layer to allow switching from
Prototype to JQuery. See <span class="error">[JavaScript Rewrite]</span> for
more info.</li><li><a class="external-link"
href="https://issues.apache.org/jira/browse/TAP5-1364">TAPS-1364</a> lists some
starting points for ExtJS integration</li></ul>
-</div>Tapestry comes with the <a class="external-link"
href="http://www.prototypejs.org/" rel="nofollow">Prototype</a> and <a
class="external-link" href="http://script.aculo.us/"
rel="nofollow">Scriptaculous</a> libraries ... no extra download is required.
Tapestry will automatically link into your pages the prototype.js,
scriptaculous.js, and effects.js libraries, as well as the Tapestry library,
tapestry.js (which largely consists of support for form input validation).
Starting with Tapestry 5.3, <a class="external-link"
href="http://documentcloud.github.com/underscore/"
rel="nofollow">Underscore</a> is also included.<h2
id="LegacyJavaScript-PrototypeandScriptaculousVersions">Prototype and
Scriptaculous Versions</h2><p>Tapestry included prototype and scriptaculous in
versions prior to Tapestry 5.4. See <a
href="supported-environments-and-versions.html">Supported Environments and
Versions</a> for a matrix of prototype and scriptaculous versions supported by
Tapestry.</p><p>In v
ersions before 5.4, Tapestry used a modified version of the main Scriptaculous
library, scriptaculous.js, with the library's default <a class="external-link"
href="http://wiki.script.aculo.us/scriptaculous/show/Usage"
rel="nofollow">autoloading</a> behavior turned off. This lets Tapestry and
Tapestry components control which Scriptaculus scripts are loaded, rather than
having <em>all</em> of them loaded unnecessarily.</p><p>If you need access to
other Scriptaculous libraries, you can provide them as follows:</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
+</div></div><h1 id="LegacyJavaScript-AjaxComponentsandMixins">Ajax Components
and Mixins</h1><p class="confluence-link">Tapestry provides easy-to-use support
for <em>Ajax</em>, the technique of using JavaScript to dynamically updating
parts of a web page with content from the server without redrawing the whole
page. See <a href="ajax-and-zones.html">Ajax and Zones</a> for
details.</p><h1 id="LegacyJavaScript-Built-inLibraries">Built-in
Libraries</h1><div style="float: right; max-width: 30%"><div class="panel"
style="border-color: #eee;border-width: 1px;"><div class="panelHeader"
style="border-bottom-width: 1px;border-bottom-color: #eee;background-color:
#eee;"><b>Alternatives to Prototype</b></div><div class="panelContent">
+<p>Tapestry 5.4 includes the ability to switch between Prototype and JQuery.
For Tapestry 5.3 and earlier, you also have some options::</p><ul><li><a
class="external-link" href="https://github.com/got5/tapestry5-jquery"
rel="nofollow">Tapestry5-Jquery module</a> – Using JQuery
<em>instead of</em> Prototype</li><li><a class="external-link"
href="http://wiki.apache.org/tapestry/Tapestry5HowToIntegrateJQuery">Tapestry5HowToIntegrateJQuery</a> –
Using JQuery <em>in addition to</em> Prototype</li><li><a
class="external-link"
href="https://issues.apache.org/jira/browse/TAP5-1364">TAPS-1364</a> –
lists some starting points for ExtJS integration</li></ul>
+</div></div></div>
+
+
+<p> </p><p>Tapestry 5.4 and earlier come with the <a
class="external-link" href="http://www.prototypejs.org/"
rel="nofollow">Prototype</a> and <a class="external-link"
href="http://script.aculo.us/" rel="nofollow">Scriptaculous</a> libraries ...
no extra download is required. Tapestry will automatically link into your pages
the prototype.js, scriptaculous.js, and effects.js libraries, as well as the
Tapestry library, tapestry.js (which largely consists of support for form input
validation). Starting with Tapestry 5.3, <a class="external-link"
href="http://documentcloud.github.com/underscore/"
rel="nofollow">Underscore</a> is also included.</p><h2
id="LegacyJavaScript-PrototypeandScriptaculousVersions">Prototype and
Scriptaculous Versions</h2><p>Tapestry included only Prototype and
Scriptaculous in versions prior to Tapestry 5.4. See <a
href="supported-environments-and-versions.html">Supported Environments and
Versions</a> for a matrix of prototype and scriptaculous versions
supported by Tapestry.</p><p>In versions before 5.4, Tapestry used a modified
version of the main Scriptaculous library, scriptaculous.js, with the library's
default <a class="external-link"
href="http://wiki.script.aculo.us/scriptaculous/show/Usage"
rel="nofollow">autoloading</a> behavior turned off. This lets Tapestry and
Tapestry components control which Scriptaculus scripts are loaded, rather than
having <em>all</em> of them loaded unnecessarily.</p><p>If you need access to
other Scriptaculous libraries, you can provide them as follows:</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> @Inject @Path("${tapestry.scriptaculous}/dragdrop.js")
private Asset dragDropLibrary;
Modified: websites/production/tapestry/content/localization.html
==============================================================================
--- websites/production/tapestry/content/localization.html (original)
+++ websites/production/tapestry/content/localization.html Sun Feb 25 23:20:05
2018
@@ -31,8 +31,6 @@
<link href='/resources/highlighter/styles/shThemeCXF.css' rel='stylesheet'
type='text/css' />
<script src='/resources/highlighter/scripts/shCore.js'
type='text/javascript'></script>
<script src='/resources/highlighter/scripts/shBrushJava.js'
type='text/javascript'></script>
- <script src='/resources/highlighter/scripts/shBrushXml.js'
type='text/javascript'></script>
- <script src='/resources/highlighter/scripts/shBrushPlain.js'
type='text/javascript'></script>
<script>
SyntaxHighlighter.defaults['toolbar'] = false;
SyntaxHighlighter.all();
@@ -128,9 +126,7 @@
</div>
-<p>Localization support is well integrated into Tapestry. Tapestry allows you
to easily separate the text you present to your users from the rest of your
application ... pull it out of your Java code and even out of your component
templates. You can then translate your messages into other languages and let
Tapestry put everything together.</p><h2
id="Localization-ComponentMessageCatalogs">Component Message
Catalogs</h2><p>Each component class may have a component message catalog. A
component message catalog is a set of files with the extension ".properties".
These property files are the same format used by java.util.ResourceBundle, just
lines of <code>key=value</code>. These files are stored on the classpath, in
the same package folder as the page or component's compiled Java
class.</p><p>So for a class named <code>org.example.myapp.pages.MyPage</code>,
you would have a main properties file as
<code>org/example/myapp/pages/MyPage.properties</code>.</p><p>If you have a
translations o
f these values, you provide additional properties file, adding an <a
class="external-link"
href="http://www.loc.gov/standards/iso639-2/englangn.html" rel="nofollow">ISO
language code</a> before the extension. Thus, if you have a French translation,
you could create a file <code>MyPage_fr.properties</code>.</p><p>Any values in
the more language specific file will <em>override</em> values from the main
properties file. If you had an even more specific localization for just French
as spoken in France, you could create <code>MyPage_fr_FR.properties</code>
(that's a language code plus a country code, and you can even go further and
add variants ... but its unlikely that you'll ever need to go beyond just
language codes in practice).</p><p>The messages in the catalog are accessed by
keys. Tapestry ignores the case of the keys when accessing messages in the
catalog.</p><h3 id="Localization-ComponentMessageCatalogInheritance">Component
Message Catalog Inheritance</h3><p>If a component clas
s is a subclass of another component class, then it inherits that base class'
message catalog. Its own message catalog extends and overrides the values
inherited from the base class.</p><p>In this way, you could have a base
component class that contained common messages, and extend or override those
messages in subclasses (just as you would extend or override the methods of the
base component class). This, of course, works for as many levels of inheritance
as you care to support.</p><h2
id="Localization-Application-wideMessageCatalog">Application-wide Message
Catalog</h2><p>If the file
<code>WEB-INF/</code><em>AppName</em><code>.properties</code> exists in the
context, it will be used as an application-wide message catalog. The
<em>AppName</em> is derived from the name of the filter inside the web.xml
file; this is most often just "app", thus <code>WEB-INF/app.properties</code>.
The search for the file is case sensitive. The properties files may be
localized.</p><p>Individual pages
and components can override the values defined in the message catalog.</p><div
class="navmenu" style="float:right; width:45%; background:white; margin:3px;
padding:3px">
-<div class="confluence-information-macro confluence-information-macro-note"><p
class="title">Avoid BOMs</p><span class="aui-icon aui-icon-small
aui-iconfont-warning confluence-information-macro-icon"></span><div
class="confluence-information-macro-body">
-<p>Make sure that your properties files don't contain <a
class="external-link" href="http://en.wikipedia.org/wiki/Byte_order_mark"
rel="nofollow">byte order marks (BOM)</a>, because Java – and thus
Tapestry – doesn't support BOM in properties files (see <a
class="external-link" href="http://bugs.sun.com/view_bug.do?bug_id=4508058"
rel="nofollow">http://bugs.sun.com/view_bug.do?bug_id=4508058</a>). Some
editors write them out when saving a file in UTF-8, so watch
out.</p></div></div></div><h2
id="Localization-PropertiesFileCharset">Properties File Charset</h2><p>Tapestry
uses the <code>UTF-8</code> character set (charset) when reading the properties
files in a message catalog. This means that you don't have to use the Java
<code>native2ascii</code> tool.</p><h2
id="Localization-LocalizedComponentTemplates">Localized Component
Templates</h2><p>The same lookup mechanism applies to component templates.
Tapestry will search for a localized version of each component template
and use the closest match. Thus you could have <code>MyPage_fr.html</code>
for French users, and <code>MyPage.html</code> for all other users.</p><h2
id="Localization-AccessingLocalizedMessages">Accessing Localized
Messages</h2><p>The above discusses what files to create and where to store
them, but doesn't address how to make use of that information.</p><p>Messages
can be accessed in one of two ways:</p><ul><li>Using the "message:" <a
href="component-parameters.html">binding expression</a> in a component
template</li><li>By injecting the component's Messages object<br clear="none">
In the first case, you may use the message: binding prefix with component
parameters, or with template expansions:</li></ul><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<p>Localization support is well integrated into Tapestry. Tapestry allows you
to easily separate the text you present to your users from the rest of your
application ... pull it out of your Java code and even out of your component
templates. You can then translate your messages into other languages and let
Tapestry put everything together.</p><h2
id="Localization-ComponentMessageCatalogs">Component Message
Catalogs</h2><p>Each component class may have a component message catalog. A
component message catalog is a set of files with the extension ".properties".
These property files are the same format used by java.util.ResourceBundle, just
lines of <code>key=value</code>. These files are stored on the classpath, in
the same package folder as the page or component's compiled Java
class.</p><p>So for a class named <code>org.example.myapp.pages.MyPage</code>,
you would have a main properties file as
<code>org/example/myapp/pages/MyPage.properties</code>.</p><p>If you have a
translations o
f these values, you provide additional properties file, adding an <a
class="external-link"
href="http://www.loc.gov/standards/iso639-2/englangn.html" rel="nofollow">ISO
language code</a> before the extension. Thus, if you have a French translation,
you could create a file <code>MyPage_fr.properties</code>.</p><p>Any values in
the more language specific file will <em>override</em> values from the main
properties file. If you had an even more specific localization for just French
as spoken in France, you could create <code>MyPage_fr_FR.properties</code>
(that's a language code plus a country code, and you can even go further and
add variants ... but its unlikely that you'll ever need to go beyond just
language codes in practice).</p><p>The messages in the catalog are accessed by
keys. Tapestry ignores the case of the keys when accessing messages in the
catalog.</p><h3 id="Localization-ComponentMessageCatalogInheritance">Component
Message Catalog Inheritance</h3><p>If a component clas
s is a subclass of another component class, then it inherits that base class'
message catalog. Its own message catalog extends and overrides the values
inherited from the base class.</p><p>In this way, you could have a base
component class that contained common messages, and extend or override those
messages in subclasses (just as you would extend or override the methods of the
base component class). This, of course, works for as many levels of inheritance
as you care to support.</p><h2
id="Localization-Application-wideMessageCatalog">Application-wide Message
Catalog</h2><p>If the file
<code>WEB-INF/</code><em>AppName</em><code>.properties</code> exists in the
context, it will be used as an application-wide message catalog. The
<em>AppName</em> is derived from the name of the filter inside the web.xml
file; this is most often just "app", thus <code>WEB-INF/app.properties</code>.
The search for the file is case sensitive. The properties files may be
localized.</p><p>Individual pages
and components can override the values defined in the message catalog.</p><div
class="confluence-information-macro confluence-information-macro-warning"><p
class="title">Avoid BOMs</p><span class="aui-icon aui-icon-small
aui-iconfont-error confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>Make sure that your properties
files don't contain <a class="external-link"
href="http://en.wikipedia.org/wiki/Byte_order_mark" rel="nofollow">byte order
marks (BOM)</a>, because Java – and thus Tapestry –
doesn't support BOM in properties files (see <a class="external-link"
href="http://bugs.sun.com/view_bug.do?bug_id=4508058"
rel="nofollow">http://bugs.sun.com/view_bug.do?bug_id=4508058</a>). Some
editors write them out when saving a file in UTF-8, so watch
out.</p></div></div><p> </p><h2
id="Localization-PropertiesFileCharset">Properties File Charset</h2><p>Tapestry
uses the <code>UTF-8</code> character set (charset) whe
n reading the properties files in a message catalog. This means that you don't
have to use the Java <code>native2ascii</code> tool.</p><h2
id="Localization-LocalizedComponentTemplates">Localized Component
Templates</h2><p>The same lookup mechanism applies to component templates.
Tapestry will search for a localized version of each component template and use
the closest match. Thus you could have <code>MyPage_fr.html</code> for French
users, and <code>MyPage.html</code> for all other users.</p><h2
id="Localization-AccessingLocalizedMessages">Accessing Localized
Messages</h2><p>The above discusses what files to create and where to store
them, but doesn't address how to make use of that information.</p><p>Messages
can be accessed in one of two ways:</p><ul><li>Using the "message:" <a
href="component-parameters.html">binding expression</a> in a component
template</li><li>By injecting the component's Messages object<br clear="none">
In the first case, you may use the message: binding pr
efix with component parameters, or with template expansions:</li></ul><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"><t:layout title="message:page-title">
${message:greeting}, ${user.name}!
@@ -180,7 +176,7 @@ public String getDisplayLanguage() {
}
</pre>
</div></div><p>Once a persistent locale is set, you will see the locale name
as the first virtual folder in page render and component event requests URLs.
In this way, a persistent locale will, in fact, persist from request to
request, or in a user's bookmarks.</p><p>You will see the new locale take
effect on the next request. If it is changed in a component event request
(which is typical), the new locale will be used in the subsequent page render
request.</p><p>Note that the locale for a page is fixed (it can't change once
the page instance is created). In addition, a page may only be attached to a
request once. In other words, if code in your page changes the persistent
locale, you won't see a change to the page's locale (or localized messages)
<em>in that request</em>.</p><h2 id="Localization-Built-inLocales">Built-in
Locales</h2><p>While your application can support any locale (and thus any
language) that you want, Tapestry provides only a limited set of translations
for its ow
n built-in messages. As of Tapestry 5.3, the following locales have
translations provided:</p><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>en (English)</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><span>el (Greek)</span></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p><span>it (Italian)</span></p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p><span>pl
(Polish)</span></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><span><span>sv
(Swedish)</span></span></p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>bg (Bulgarian)</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><span>es (Spanish)</span></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p><span>ja (Japanese)</span></p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p><span>pt
(Portuguese)</span></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><span><span>
vi (Vietnamese)</span></span></p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>cs (Czech)<sup>1</sup></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p><span>fi (Finnish)</span></p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p><span>mk
(Macedonian)</span></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><span>ru (Russian)</span></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p><span>zh
(Chinese)</span></p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p><span>da (Danish)</span></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p><span>fr (French)</span></p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p><span>nl
(Dutch)</span></p></td><td colspan="1" rowspan="1" class="confluenceTd">sl
(Slovenian)<sup>2</sup></td><td colspan="1" rowspan="1"
class="confluenceTd"><p> </p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p><span>de (German)</span></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p><span>hr (Croatian)</span></p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p><span>no
(Norwegian)</span></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><span>sr (Serbian)</span></p></td><td colspan="1"
rowspan="1"
class="confluenceTd"><p> </p></td></tr></tbody></table></div><p><sup>1 </sup><span>as
of Tapestry 5.3.8</span></p><p><span> </span><sup>2 </sup><span>as of
Tapestry 5.4</span></p><h3
id="Localization-ProvidingtranslationsforTapestrybuilt-inmessages">Providing
translations for Tapestry built-in messages</h3><p>Fortunately, Tapestry uses
all the same mechanisms for its own locale support as it provides for your
application. So, to support other locales, just translate the built-in message
catalog (property) files yourself:</p><p> </p><style
type="text/css">table.sectionMacro { width: auto; }</style>
-<div class="sectionColumnWrapper"><div class="sectionMacro"><div
class="sectionMacroRow"><div class="columnMacro"><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Tapestry 5.4 and later</p></th></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p><a class="external-link"
href="https://git-wip-us.apache.org/repos/asf?p=tapestry-5.git;a=tree;f=tapestry-core/src/main/resources/org/apache/tapestry5">core.properties</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a class="external-link"
href="https://git-wip-us.apache.org/repos/asf?p=tapestry-5.git;a=tree;f=tapestry-kaptcha/src/main/resources/org/apache/tapestry5/kaptcha">tapestry-kaptcha.properties</a></p></td></tr></tbody></table></div></div><div
class="columnMacro"><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Tapestry 5.3.x</p></th></tr><tr><td colspan="1" row
span="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.3/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/BeanEditForm.properties?view=markup">BeanEditForm.properties</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.3/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/DateField.properties?view=markup">DateField.properties</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.3/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/Errors.properties?view=markup">Errors.properties</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/br
anches/5.3/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/GridColumns.properties?view=markup">GridColumns.properties</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.3/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/GridPager.properties?view=markup">GridPager.properties</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.3/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/Palette.properties?view=markup">Palette.properties</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.3/tapestry-core/src/main/resources/org/apache/tapestry5/internal/ValidationMessages.properties?view=markup
">ValidationMessages.properties</a></p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.3/tapestry-kaptcha/src/main/resources/org/apache/tapestry5/kaptcha/tapestry-kaptcha.properties?view=markup">tapestry-kaptcha.properties</a></p></td></tr></tbody></table></div></div></div></div></div><p>To
have Tapestry use these new files, just put them in the corresponding
package-named directory within your own app (for example,
src/main/resources/org/apache/tapestry5/core.properties).</p><p>Finally, please
open a new feature request <a class="external-link"
href="https://issues.apache.org/jira/browse/TAP5">here</a> and attach the
translated files so that they can be included in the next release of
Tapestry.</p><div class="confluence-information-macro
confluence-information-macro-information"><span class="aui-icon aui-icon-small
aui-iconfont-info confluence-information-macro-icon"></span
><div class="confluence-information-macro-body"><p>Please note that a patch is
>always preferred over an archive of properties files.</p></div></div></div>
+<div class="sectionColumnWrapper"><div class="sectionMacro"><div
class="sectionMacroRow"><div class="columnMacro"><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Tapestry 5.4 and later</p></th></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p><a class="external-link"
href="https://git-wip-us.apache.org/repos/asf?p=tapestry-5.git;a=tree;f=tapestry-core/src/main/resources/org/apache/tapestry5">core.properties</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a class="external-link"
href="https://git-wip-us.apache.org/repos/asf?p=tapestry-5.git;a=tree;f=tapestry-kaptcha/src/main/resources/org/apache/tapestry5/kaptcha">tapestry-kaptcha.properties</a></p></td></tr></tbody></table></div></div><div
class="columnMacro"><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Tapestry 5.3.x</p></th></tr><tr><td colspan="1" row
span="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.3/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/BeanEditForm.properties?view=markup">BeanEditForm.properties</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.3/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/DateField.properties?view=markup">DateField.properties</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.3/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/Errors.properties?view=markup">Errors.properties</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/br
anches/5.3/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/GridColumns.properties?view=markup">GridColumns.properties</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.3/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/GridPager.properties?view=markup">GridPager.properties</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.3/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/Palette.properties?view=markup">Palette.properties</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.3/tapestry-core/src/main/resources/org/apache/tapestry5/internal/ValidationMessages.properties?view=markup
">ValidationMessages.properties</a></p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://svn.apache.org/viewvc/tapestry/tapestry5/branches/5.3/tapestry-kaptcha/src/main/resources/org/apache/tapestry5/kaptcha/tapestry-kaptcha.properties?view=markup">tapestry-kaptcha.properties</a></p></td></tr></tbody></table></div></div></div></div></div><p>To
have Tapestry use these new files, just put them in the corresponding
package-named directory within your own app (for example,
src/main/resources/org/apache/tapestry5/core.properties).</p><p>Finally, please
open a new feature request <a class="external-link"
href="https://issues.apache.org/jira/browse/TAP5">here</a> and attach the
translated files so that they can be included in the next release of
Tapestry.</p><div class="confluence-information-macro
confluence-information-macro-information"><span class="aui-icon aui-icon-small
aui-iconfont-info confluence-information-macro-icon"></span
><div class="confluence-information-macro-body"><p>Please note that a patch is
>always preferred over an archive of properties
>files.</p></div></div><p></p></div>
</div>
<div class="clearer"></div>