<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta http-equiv="Content-Script-Type" content="text/javascript" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <title>国際化</title>
    <link rel="stylesheet" href="/css/style.css" type="text/css" media="all" />
    
    
  </head>
  <body>
    <div class="header">
      <div id="pane.left-header" class="pane left">
        <div id="org.seasar.kvasir.cms.toolbox.customPop-2" class="pop org.seasar.kvasir.cms.toolbox.customPop">
          <div class="body"><div class="wiki">
<ul>
<li><a href="/" class="pageNotFound">（サイトトップ）</a></li>
<li><a href="/download">ダウンロード</a></li>
<li><a href="/news/" class="pageNotFound">新着情報</a></li>
<li><a href="/docs/" class="pageNotFound">ドキュメント</a></li>
</ul>
</div>
</div>
        </div>
      </div>
      <div id="pane.right-header" class="pane right">
        <div id="org.seasar.kvasir.cms.toolbox.loginPop-1" class="pop org.seasar.kvasir.cms.toolbox.loginPop">
          <div class="body">
<form method="post" action="/plugins/toolbox/login.do/docs/1.0.x/ref/i18n">
    <div class="row">
      <span class="label">Name</span>
      <span class="textinput"><input type="text" name="name" size="12" value="" /></span>
    </div>
    <div class="row">
      <span class="label">Password</span>
      <span class="textinput"><input type="password" name="password" size="12" value="" /></span>
    </div>
    <div class="row">
      <span class="submit"><input type="submit" value="Login" /></span>
    </div>
</form>
</div>
        </div><div id="org.seasar.kvasir.cms.pop.loginUserPop-1" class="pop org.seasar.kvasir.cms.pop.loginUserPop">
          <div class="body"></div>
        </div>
      </div>
    </div>
    <div class="page-frame">
      <div id="pane.left-sidebar" class="pane sidebar-frame sidebar subcontent">
        <div id="org.seasar.kvasir.cms.toolbox.searchPop-1" class="pop org.seasar.kvasir.cms.toolbox.searchPop">
          <h2 class="title">Search</h2>
          <div class="body"><form class="simple" method="get" action="/plugins/toolbox/search.do">
  <input type="text" name="query" size="12" />
  <input type="submit" value="Go!" />
</form>
</div>
        </div><div id="org.seasar.kvasir.cms.toolbox.customPop-1" class="pop org.seasar.kvasir.cms.toolbox.customPop">
          <h2 class="title">メニュー</h2>
          <div class="body"><ul>
  <li><a href="/" class="pageNotFound">（サイトトップ）</a></li>
  <li><a href="/download">ダウンロード</a></li>
  <li><a href="/news">新着情報</a></li>
  
    
    
      <li>
        <a href="/docs/1.0.x/user">ユーザマニュアル</a>
        <ul>
          <li>
            <a href="/docs/1.0.x/user/description">Ymirとは</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/processFlow">Ymirの処理フロー</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/projectStatus">動作ステータス</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/generator">自動生成機能</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/vili">Eclipseプラグイン「Vili（ヴィリ）」</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/ve">Eclipseプラグイン「Ve（ヴェー）」</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/setUp">セットアップ</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/skeleton">空のアプリケーション</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/example">サンプルアプリケーションの作成</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/development">開発における注意点</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/faq">FAQ</a>
            
          </li>
        </ul>
      </li><li>
        <a href="/docs/1.0.x/ref">リファレンスマニュアル</a>
        <ul>
          <li>
            <a href="/docs/1.0.x/ref/pageClass">Pageクラス</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/pathMapping">リクエストパスとPageクラスのマッピング</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/response">レスポンス</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/fileupload">ファイルアップロード</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/typeConversion">型の自動変換</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/zptTemplate">ZPTテンプレート</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/constraintCheck">制約チェック</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/validation">バリデーション</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/transactionToken">トランザクショントークン</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/permissionCheck">権限チェック</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/objectScope">オブジェクトスコープ</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/i18n">国際化</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/exceptionHandler">例外処理</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/include">インクルード</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/conversation">カンバセーション</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/appProperties">アプリケーションの設定</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/dicon">diconファイルの扱い</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/standardArchitecture">アプリケーションアーキテクチャ標準</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/ymirJson">JSON連携</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/batch">バッチプログラムの作成</a>
            
          </li>
        </ul>
      </li><li>
        <a href="/docs/1.0.x/dev">Ymir開発者マニュアル</a>
        <ul>
          <li>
            <a href="/docs/1.0.x/dev/build">Ymirのビルド</a>
            
          </li><li>
            <a href="/docs/1.0.x/dev/release">Ymirのリリース</a>
            
          </li><li>
            <a href="/docs/1.0.x/dev/update-ymir-fragment-dbflute">DBFluteフラグメントの更新</a>
            
          </li>
        </ul>
      </li><li>
        <a href="/docs/1.0.x/etc">その他</a>
        
      </li><li>
        <a href="/docs/1.0.x/glossary">用語集</a>
        <ul>
          <li>
            <a href="/docs/1.0.x/glossary/Vili">Vili</a>
            
          </li><li>
            <a href="/docs/1.0.x/glossary/ve">Ve</a>
            
          </li>
        </ul>
      </li>
    
  
  <li><a href="/roadmap">ロードマップ</a></li>
  <li><a href="https://www.seasar.org/issues/browse/YMIR">既知の不具合を閲覧する・不具合を報告する</a></li>
  <li><a href="https://www.seasar.org/svn/ymir/">SVNリポジトリ</a></li>
  <li><a href="http://svn.seasar.org/browse/?root=ymir">SVNリポジトリを閲覧</a></li>
</ul>
</div>
        </div>
      </div>
      <div id="pane.main" class="pane main">
      
        <div id="org.seasar.kvasir.cms.toolbox.breadcrumbsPop-1" class="pop org.seasar.kvasir.cms.toolbox.breadcrumbsPop">
          
          <div class="body"><ul>
  <li class="first"><a href="/">(TOP)</a></li><li><a href="/docs">ドキュメント</a></li><li><a href="/docs/1.0.x">ドキュメント（1.0.x系）</a></li><li><a href="/docs/1.0.x/ref">リファレンスマニュアル</a></li><li>国際化</li>
</ul>
</div>
        </div><div id="org.seasar.kvasir.cms.pop.contentPop-1" class="pop org.seasar.kvasir.cms.pop.contentPop">
          <h2 class="title">国際化</h2>
          <div class="body">
<ul class="information">
  
  <li>2010-02-09 11:30:07</li>
</ul>
<div class="content"><div class="document">
<p>Ymirではアプリケーションの国際化のための仕組みとして、ロケール情報の管理機能とメッセージリソース機能を持っています。</p>
<div class="section" id="e383ade382b1e383bce383abe68385e5a0b1e381aee7aea1e79086e6a99fe883bd">
<h3><a name="e383ade382b1e383bce383abe68385e5a0b1e381aee7aea1e79086e6a99fe883bd">ロケール情報の管理機能</a></h3>
<p>Ymirではアプリケーション利用者毎にロケールを持たせるための仕組みをフレームワークとして提供しています。</p>
<p>ロケールの操作にはorg.seasar.ymir.locale.LocaleManagerを用います。LocaleManagerは特に設定をしなくてもPageクラス等から利用できますが、app.diconに登録されているアプリケーション用コンポーネントからLocaleManagerを利用したい場合は、app.diconからymir-component.diconをインクルードしておいて下さい。</p>
<p>LocaleManagerを利用したいコンポーネントには、LocaleManagerのためのSetterを用意しておけばLocaleManagerコンポーネントが自動的にインジェクトされます。</p>
<p>利用者に関連付けられているロケールを取得するにはLocaleManager#getLocale()を使います。</p>
<p>現在のセッションにロケールを関連付けるためには、LocaleManager#setLocale(Locale)を使います。</p>
<p>現在のセッションに関連付けられているロケールを削除するには、LocaleManager#removeLocale()を使います。</p>
<p>なお、LocaleManagerはメッセージリソースから適切なメッセージを取り出す処理などでYmirの内部からも利用されますので、アプリケーションでは基本的にはLocaleManagerを使ってロケールの管理をするようにして下さい。</p>
</div>
<div class="section" id="e383a1e38383e382bbe383bce382b8e383aae382bde383bce382b9e6a99fe883bd">
<h3><a name="e383a1e38383e382bbe383bce382b8e383aae382bde383bce382b9e6a99fe883bd">メッセージリソース機能</a></h3>
<p>メッセージリソースとは、Strutsのメッセージリソースと同様のもので、ロケールごとのプロパティを扱うための仕組みです。</p>
<p>メッセージリソースは、次のようにして利用されます。</p>
<ol>
<li>バリデーションエラーなどのエラーメッセージを格納するNotesオブジェクトから実際のメッセージ文字列を構築する</li>
<li>ZPTテンプレート中にメッセージリソースのキーを指定したTALES式を埋め込むことで、メッセージ文字列を表示する</li>
<li>Pageクラスなどからメッセージリソースを明示的に取得してメッセージ文字列を構築する</li>
</ol>
<p>メッセージリソースを管理するためには、org.seasar.ymir.message.Messagesを使用します。</p>
<p>標準のYmirの設定では、クラスパス上の<tt class="docutils literal"><span class="pre">messages_XXX.xproperties</span></tt>（<tt class="docutils literal"><span class="pre">XXX</span></tt>はロケール名。このファイルのソースは通常<tt class="docutils literal"><span class="pre">src/main/resources/</span></tt>ディレクトリ直下に置かれます）というロケール毎のファイルに格納されたリソースがメッセージリソースとして使われるようになっています。</p>
<p>xpropertiesファイルの書式は基本的に通常のJavaのプロパティファイルと同じですが、UTF-8で直接非ASCII文字を記述することができます。</p>
<div class="section" id="notese382aae38396e382b8e382a7e382afe38388e38292e4bdbfe381a3e3819fe383a1e38383e382bbe383bce382b8e69687e5ad97e58897e381aee6a78be7af89">
<h4><a name="notese382aae38396e382b8e382a7e382afe38388e38292e4bdbfe381a3e3819fe383a1e38383e382bbe383bce382b8e69687e5ad97e58897e381aee6a78be7af89">Notesオブジェクトを使ったメッセージ文字列の構築</a></h4>
<p>例えば、PageクラスのgetNotes()メソッドが返すNotesオブジェクトから現在のロケールに従ったメッセージ文字列を表示するには、ZPTテンプレート中で次のように書きます。</p>
<pre class="literal-block">
&lt;ul&gt;
  &lt;li tal:repeat=&quot;note self/notes/notes&quot; tal:content=&quot;note/%value&quot;&gt;メッセージ&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>Noteオブジェクトを格納する変数「note」について「note/%value」と書くと現在のロケールに従ったメッセージ文字列がMessagesコンポーネントから取り出され、Noteがパラメータを持つ場合はパラメータが埋め込まれてメッセージ文字列が構築されて表示されます。</p>
<p>パラメータが埋め込まれる際、パラメータの値の先頭に「label.」をつけたキーに対応する値がMessagesコンポーネントにあればそれが実際の値として埋め込まれます。なければパラメータの値がそのまま埋め込まれます。</p>
<p>例えばNoteが持つキー（Note#getValue()の値）が「error.required」、Noteが持つパラメータ（Note#getParameters()の値）の1つ目の値が「name」、messages.xpropertiesの内容が以下のような場合、</p>
<pre class="literal-block">
error.required={0}を指定して下さい
label.name=なまえ
</pre>
<p>実際に表示されるメッセージは「なまえを指定して下さい」となります。キーが「error.required」、パラメータの1つ目の値が「password」である場合は、label.passwordのエントリが登録されていないので「passwordを指定して下さい」となります。</p>
<p>messages.xpropertiesからメッセージ文字列やパラメータ文字列を取り出す際の処理については<a class="reference" href="#e3839ae383bce382b8e59bbae69c89e381aee383a1e38383e382bbe383bce382b8e69687e5ad97e58897e381aee68ea2e7b4a2">ページ固有のメッセージ文字列の探索</a>も参照して下さい。</p>
<p><em>[Ymir-1.0.3以降]</em> Noteがパラメータを1つ以上持つ場合、キーと最初のパラメータ値を「+」で結合したキーに対応するメッセージ文字列があれば、それが使用されます。例えば上の例で、</p>
<pre class="literal-block">
error.required+name={0}を教えて下さい
</pre>
<p>というエントリがmessages.xpropertiesにある場合、キーが「error.required」、パラメータが「name」であるNoteからメッセージ文字列を構築すると「なまえを教えて下さい」になります。</p>
<div class="section" id="e8a487e59088e38391e383a9e383a1e383bce382bfe381abe996a2e38199e3828be383a1e38383e382bbe383bce382b8e69687e5ad97e58897e381aee6a49ce7b4a2">
<h5><a name="e8a487e59088e38391e383a9e383a1e383bce382bfe381abe996a2e38199e3828be383a1e38383e382bbe383bce382b8e69687e5ad97e58897e381aee6a49ce7b4a2">複合パラメータに関するメッセージ文字列の検索</a></h5>
<p>名前が「.」でつながっていたり、「[10]」などの添え字がついている名前が組み合わさったようなパラメータを「複合パラメータ」と言います。例えば次のようなものが複合パラメータです:</p>
<pre class="literal-block">
user.first.name
names[10]
fruits.fruit[10].name
</pre>
<p>複合パラメータについては、通常のパラメータとはメッセージ文字列の検索方法が異なります。</p>
<p>messages.xpropertiesに「_.note.parameter.segment.template」というエントリがある場合、複合パラメータはセグメント（「.」で区切られている単位）毎に処理されます。例えばmessages.xpropertiesに以下のエントリがある場合、</p>
<pre class="literal-block">
_.note.parameter.segment.direction=r
_.note.parameter.head=
_.note.parameter.delimiter=の
_.note.parameter.tail=
_.note.parameter.segment.template={1}番目の{0}
</pre>
<p>複合パラメータ「fruits.fruit[10].name」に対応するメッセージ文字列は「fruitsの10番目のfruitのname」になります。</p>
<p>基本的には「_note.parameter.head」の文字列を先頭に付与し、セグメント毎に「_note.parameter.delimiter」を挟んで、「_note.parameter.segment.direction」で指定された方向に（rは右向き、lは左向き）結合し、最後に「_note.parameter.tail」の文字列を付与します。セグメントが添え字を持っている場合は「_note.parameter.segment.template」を使って添え字つきのセグメントのメッセージ文字列を構築して結合します。「_note.parameter.segment.template」に指定できるプレースフォルダは、{0}がセグメントから添え字を取り除いたものから構築したメッセージ文字列、{1}が添え字、{2}が添え字を1オリジンに直したものになります。</p>
<p><em>[Ymir-1.0.3以降]</em> セグメントに対応するメッセージ文字列が空文字列である場合は、そのセグメントは無視されます。例えばmessages.xpropertiesに以下のエントリがある場合、</p>
<pre class="literal-block">
label.first=
</pre>
<p>「user.first.name」に対応するメッセージ文字列は「userのname」になります。</p>
<p>messages.xpropertiesに「_.note.parameter.segment.template」というエントリがない場合、複合パラメータは通常のパラメータと同様に処理されますが、その時添え字は全て除去されます。また、対応するエントリがmessages.xpropertiesnにない場合は、最後のセグメントに関してメッセージ文字列が検索されます。例えば、複合パラメータ「fruits.fruit[10].name」については、次の順でメッセージ文字列が検索されます:</p>
<pre class="literal-block">
fruits.fruit.name → name
</pre>
</div>
</div>
<div class="section" id="e383a1e38383e382bbe383bce382b8e382ade383bce38292e79bb4e68ea5e68c87e5ae9ae38197e3819fe383a1e38383e382bbe383bce382b8e69687e5ad97e58897e381aee6a78be7af89">
<h4><a name="e383a1e38383e382bbe383bce382b8e382ade383bce38292e79bb4e68ea5e68c87e5ae9ae38197e3819fe383a1e38383e382bbe383bce382b8e69687e5ad97e58897e381aee6a78be7af89">メッセージキーを直接指定したメッセージ文字列の構築</a></h4>
<p>例えば、メッセージキー「message.ok」に対応する現在のロケールに応じたメッセージ文字列を表示するには、ZPTテンプレート中で次のように書きます。</p>
<pre class="literal-block">
&lt;span tal:replace=&quot;messages/%message.ok&quot;&gt;メッセージ&lt;/span&gt;
</pre>
<p>なお、この方法ではパラメータの埋め込みはできません。</p>
<p>ロケールによらずデフォルトのメッセージを表示したい場合は次のように「%」をつけずに書いて下さい。</p>
<pre class="literal-block">
&lt;span tal:replace=&quot;messages/message.ok&quot;&gt;メッセージ&lt;/span&gt;
</pre>
<p>詳しくは<a class="reference pageNotFound" href="/docs/1.0.x/ref/zptTemplate#e382bbe382b0e383a1e383b3e38388e381aee8a7a3e98788">「ZPTテンプレート」の「セグメントの解釈」</a>の表のMessagesに関する項目を参照して下さい</p>
</div>
<div class="section" id="e38397e383ade382b0e383a9e383a0e382b3e383bce38389e381abe3818ae38191e3828be383a1e38383e382bbe383bce382b8e69687e5ad97e58897e381aee6a78be7af89">
<h4><a name="e38397e383ade382b0e383a9e383a0e382b3e383bce38389e381abe3818ae38191e3828be383a1e38383e382bbe383bce382b8e69687e5ad97e58897e381aee6a78be7af89">プログラムコードにおけるメッセージ文字列の構築</a></h4>
<p>プログラム中でメッセージ文字列を構築するには、メッセージリソースを管理するMessagesコンポーネントを取得して利用します。</p>
<p>Pageクラス等から利用する場合は特に設定は不要ですが、app.diconに登録されているアプリケーション用コンポーネントからMessagesコンポーネントを利用したい場合は、app.diconからymir-component.diconをインクルードしておいて下さい。</p>
<p>このコンポーネントを利用したいクラスでMessagesクラスを引数に持つSetterメソッドを用意するだけで、自動的にMessagesコンポーネントがインジェクトされます。後はMessagesインタフェースの提供メソッドを呼び出してメッセージ文字列を構築することができます。</p>
<p>メッセージ文字列の取得には、Messages#getMessage(String key)を使って下さい。指定したキーに対応するメッセージ文字列のうち、現在のロケールに合うものが返されます。</p>
</div>
<div class="section" id="e3839ae383bce382b8e59bbae69c89e381aee383a1e38383e382bbe383bce382b8e69687e5ad97e58897e381aee68ea2e7b4a2">
<h4><a name="e3839ae383bce382b8e59bbae69c89e381aee383a1e38383e382bbe383bce382b8e69687e5ad97e58897e381aee68ea2e7b4a2">ページ固有のメッセージ文字列の探索</a></h4>
<p>Ymirでは、あるキーに対応するメッセージをページ毎に変えることができるようになっています。具体的には、指定されたキーからページ固有のキーを生成し、そのキーに対応するメッセージ文字列を使用するようになっています。見つからない場合は、指定されたキーそのものに対応するメッセージ文字列が使用されます。</p>
<p>ページ固有のキーは、次のルールに従って生成されます。</p>
<ul>
<li>キーがドットを含まない場合、ページのコンポーネント名（またはページのコンポーネント名の末尾から「Page」を取り除いたもの）とキーをドット区切りで連結したもの</li>
<li>キーがドットを含む場合、キーのドットより前の部分とページのコンポーネント名（またはページのコンポーネント名の末尾から「Page」を取り除いたもの）とキーのドットより後ろの部分をドット区切りで連結したもの</li>
</ul>
<p>例えば「/index.html」ページ（コンポーネント名はindexPage）内でメッセージ文字列を検索する場合は、ページ固有のキーは以下のようになります:</p>
<pre class="literal-block">
例1: 元のキー：pageTitle → ページ固有のキー：indexPage.pageTitle, index.pageTitle
例2: 元のキー：label.userName → ページ固有のキー：label.indexPage.userName, label.index.userName
例3: 元のキー：message.action.succeed → ページ固有のキー：message.indexPage.action.succeed, message.index.action.succeed
</pre>
<p>キーの探索順序は以下のようになります:</p>
<pre class="literal-block">
indexPage.pageTitle → index → pageTitle
</pre>
<p>上記のようなメッセージ文字列探索が行なわれるのは、以下の場合です。</p>
<ul>
<li>バリデーションエラーなどのエラーメッセージを格納するNoteオブジェクトから実際のメッセージ文字列を構築する場合（パラメータ文字列についても上記のような探索が行なわれます）</li>
<li>ZPTテンプレート中にメッセージリソースのキーを「%」つきで指定したTALES式を埋め込むことで、メッセージ文字列を表示する場合</li>
<li>Messages#getMessage(String)を使用してメッセージ文字列を取得する場合</li>
</ul>
<p><em>[Ymir-1.0.7以降]</em> またページのコンポーネント名がパッケージ名を含む場合は、パッケージ名についてもキーが生成され探索対象となります。</p>
<p>例えば「/member/edit/index.html」ページ（コンポーネント名はmember_edit_indexPage）内でメッセージ文字列を検索する場合は、以下のようにキーが生成され探索されます:</p>
<pre class="literal-block">
member_edit_indexPage.pageTitle → member_edit_index.pageTitle → member_edit.pageTitle → member.pageTitle → pageTitle
</pre>
</div>
</div>
<div class="section" id="e794bbe5838fe381aee59bbde99a9be58c96">
<h3><a name="e794bbe5838fe381aee59bbde99a9be58c96">画像の国際化</a></h3>
<p>画像をロケールに従って切り替えたい場合は、TALESのi18npage式を使います。</p>
<p>例えば<tt class="docutils literal"><span class="pre">/image/title.jpg</span></tt>という画像をロケール毎に切り替えたい場合は以下のように記述します:</p>
<pre class="literal-block">
&lt;img tal:attributes=&quot;src i18npage:/image/title.jpg&quot; src=&quot;/image/title.jpg&quot; /&gt;
</pre>
</div>
</div>
</div>
</div>
        </div>
      
    </div>
    </div>
    <div class="footer-delimiter"></div>
    <div id="pane.footer" class="pane footer">
      <div id="org.seasar.kvasir.cms.pop.poweredByPop-1" class="pop org.seasar.kvasir.cms.pop.poweredByPop">
        <div class="body">Powered by Kvasir/Sora</div>
      </div>
    </div>
  </body>
</html>
