Localize Messages(i18n support)

text here to be treated as default message.parameter works as well.
There are(is) 4 people in the room.
この部屋に7人がいます。
There are(is) 15 people in the room.
この部屋に15人がいます。
Today's weather is good.
今日の天気は晴れです。
Today's weather is bad.
今日の天気は雨です。
Click <a href="http://asta4d.sample.com/">here</a> to contact us.
Click here to contact us.
html:Click <a href="http://asta4d.sample.com/">here</a> to contact us.
/templates/localize.html
<section>
	<article>
		<div class="panel panel-default"><div class="panel-body">
			<!-- the inner html will be treated as default message if the key is not found in message bundle -->
			<afd:msg id="notexistingkey" key="sample.notexistingkey" p0="parameter works as well.">text here to be treated as default message.{0}</afd:msg><br/>
		</div></div>
		
		<div class="panel panel-default"><div class="panel-body">
			<!-- simply specify parameters on tag -->
			<afd:msg id="peoplecount" key="sample.peoplecount" p0="4">dummy text</afd:msg><br/>
			<afd:msg id="peoplecount" key="sample.peoplecount" p0="7" locale="ja_JP">dummy text</afd:msg><br/>
		</div></div>
		
		<div class="panel panel-default"><div class="panel-body">
			<!-- the parameter can be rendered by snippet too -->
			<afd:snippet render="ComplicatedSnippet:setMsgParam">
				<afd:msg id="peoplecount" key="sample.peoplecount" p0="4">dummy text</afd:msg><br/>
				<afd:msg id="peoplecount" key="sample.peoplecount" p0="7" locale="ja_JP">dummy text</afd:msg><br/>
			</afd:snippet>
		</div></div>
		
		<div class="panel panel-default"><div class="panel-body">
			<!-- attribute started with "@" will be treated as a key -->
			<afd:msg id="weatherreport" key="sample.weatherreport" @p0="sample.weatherreport.sunny">天気</afd:msg><br/>
			<afd:msg id="weatherreport" key="sample.weatherreport" @p0="sample.weatherreport.sunny" locale="ja_JP">天気</afd:msg><br/>
		</div></div>
		
		<div class="panel panel-default"><div class="panel-body">
			<!-- attribute started with "#" will be treated as a sub key of current key, thus sample.weatherreport.sunny will be searched -->
			<afd:msg id="weatherreport" key="sample.weatherreport" #p0="rain">天気</afd:msg><br/>
			<afd:msg id="weatherreport" key="sample.weatherreport" #p0="rain" locale="ja_JP">天気</afd:msg><br/>
		</div></div>
		
		<div class="panel panel-default"><div class="panel-body">
			<!-- treat message as text -->
			<afd:msg key="sample.textUrl"></afd:msg><br/>
			
			<!-- treat message as html -->
			<afd:msg key="sample.htmlUrl"></afd:msg><br/>
			
			<!-- treat message as text even it begins with html: -->
			<afd:msg key="sample.escapedUrl"></afd:msg><br/>
		</div></div>
	</article>
</section>
/snippet/ComplicatedSnippet.java
public Renderer setMsgParam() {
    Renderer render = Renderer.create();
    render.add("#peoplecount", "p0", 15);
    return render;
}

/message.properties
sample.peoplecount=There are(is) {0} people in the room.

sample.weatherreport=Today''s weather is {0}.
sample.weatherreport.sunny=good
sample.weatherreport.cloudy=not good
sample.weatherreport.rain=bad

sample.textUrl=Click <a href="http://asta4d.sample.com/">here</a> to contact us.
sample.htmlUrl=html:Click <a href="http://asta4d.sample.com/">here</a> to contact us.
sample.escapedUrl=text:html:Click <a href="http://asta4d.sample.com/">here</a> to contact us.