<?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/0.9.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">ドキュメント（1.0.x系）</a>
        
      </li><li>
        <a href="/docs/0.9.x">ドキュメント（0.9.x系）</a>
        
      </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/0.9.x">ドキュメント（0.9.x系）</a></li><li><a href="/docs/0.9.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>2007-10-30 14:42:43</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>ロケールの操作にはLocaleManagerを用います。LocaleManagerは特に設定をしなくてもPageクラス等から利用できますが、app.diconに登録されているアプリケーション用コンポーネントからLocaleManagerを利用したい場合は、app.diconからymir-component.diconをインクルードしておいて下さい。</p>
<p>LocaleManagerを利用したいコンポーネントには、<tt class="docutils literal"><span class="pre">org.seasar.ymir.LocaleManager</span></tt>のためのSetterを用意しておけばLocaleManagerコンポーネントが自動的にインジェクトされます。</p>
<p>利用者に関連付けられているロケールを取得するには、<tt class="docutils literal"><span class="pre">org.seasar.ymir.Request#getLocale()</span></tt>を使うか、<tt class="docutils literal"><span class="pre">org.seasar.ymir.LocaleManager#getLocale()</span></tt>を使います。</p>
<p>現在のセッションにロケールを関連付けるためには、<tt class="docutils literal"><span class="pre">org.seasar.ymir.LocaleManager#setLocale(Locale)</span></tt>を使います。</p>
<p>現在のセッションに関連付けられているロケールを削除するには、<tt class="docutils literal"><span class="pre">org.seasar.ymir.LocaleManager#removeLocale()</span></tt>を使います。</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>メッセージリソースを管理する実体は、<tt class="docutils literal"><span class="pre">org.seasar.ymir.Messages</span></tt>の実装クラスのシングルトンコンポーネントです。</p>
<p>ymir-skeletonで登録されるデフォルトのMessagesコンポーネント実装では、クラスパス上の<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>詳しくは<a class="reference pageNotFound" href="/doc/ref/zptTemplate#e382bbe382b0e383a1e383b3e38388e381aee8a7a3e98788">「ZPTテンプレート」の「セグメントの解釈」</a>の表のNoteに関する項目を参照して下さい。</p>
<ol>
<li>バリデーションエラーなどのエラーメッセージを格納するNotesオブジェクトから実際のメッセージ文字列を構築する</li>
<li>ZPTテンプレート中にメッセージリソースのキーを指定したTALES式を埋め込むことで、メッセージ文字列を表示する</li>
<li>Pageクラスなどからメッセージリソースを明示的に取得して利用する</li>
</ol>
</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="/doc/ref/zptTemplate#e382bbe382b0e383a1e383b3e38388e381aee8a7a3e98788">「ZPTテンプレート」の「セグメントの解釈」</a>の表のMessagesに関する項目を参照して下さい</p>
</div>
<div class="section" id="e38397e383ade382b0e383a9e383a0e382b3e383bce38389e381abe3818ae38191e3828be383a1e38383e382bbe383bce382b8e69687e5ad97e58897e381aee6a78be7af89">
<h4><a name="e38397e383ade382b0e383a9e383a0e382b3e383bce38389e381abe3818ae38191e3828be383a1e38383e382bbe383bce382b8e69687e5ad97e58897e381aee6a78be7af89">プログラムコードにおけるメッセージ文字列の構築</a></h4>
<p>プログラム中でメッセージ文字列を構築するには、メッセージリソースを管理するMessagesコンポーネントを取得して利用します。Pageクラス等から利用する場合は特に設定は不要ですが、app.diconに登録されているアプリケーション用コンポーネントからMessagesコンポーネントを利用したい場合は、app.diconからymir-component.diconをインクルードしておいて下さい。</p>
<p>このコンポーネントを利用したいクラスでMessagesクラスを引数に持つSetterメソッドを用意するだけで、自動的にMessagesコンポーネントがインジェクトされます。後はMessagesインタフェースの提供メソッドを呼び出してメッセージ文字列を構築することができます。</p>
<p>メッセージ文字列の取得には、<tt class="docutils literal"><span class="pre">Messages#getMessage(String key)</span></tt>を使って下さい。指定したキーに対応するメッセージ文字列のうち、現在のロケールに合うものが返されます。</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">
pageTitle -&gt; indexPage.pageTitle, index.pageTitle
label.userName -&gt; label.indexPage.userName, label.index.userName
message.action.succeed -&gt; message.indexPage.action.succeed, message.index.action.succeed
</pre>
<p>キーの探索順序は以下のようになります:</p>
<pre class="literal-block">
indexPage.pageTitle -&gt; index.pageTitle -&gt; pageTitle
</pre>
<p>上記のようなメッセージ文字列探索が行なわれるのは、以下の場合です。</p>
<ol>
<li>バリデーションエラーなどのエラーメッセージを格納するNotesオブジェクトから実際のメッセージ文字列を構築する場合</li>
<li>ZPTテンプレート中にメッセージリソースのキーを「%」つきで指定したTALES式を埋め込むことで、メッセージ文字列を表示する場合</li>
<li>Messages#getMessage(String)を使用してメッセージ文字列を取得する場合</li>
</ol>
</div>
</div>
<div class="section" id="e794bbe5838fe381aee59bbde99a9be58c96">
<h3><a name="e794bbe5838fe381aee59bbde99a9be58c96">画像の国際化</a></h3>
<p>画像をロケールに従って切り替えたい場合は、TALESのi18npage式を使います。例えば<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>
