Top > SAStrutsあれこれ > 2-8 国際的なアプリケーションを作ろう
#freeze
#contents

* 内容 == [#gc5bf090]
** 2-8-0 事前準備 [#jbc6f94f]
「2-2 会員登録をしよう」をベースにします。

インターネットには国境がありません。日本からのみならず海外のユーザーが、自分のサイトを訪れることも十分考えられます。Strutsにあるメッセージリソースの機能を利用して、「2-2 会員登録をしよう」で作成した会員登録画面を英語圏対応にしてみましょう。

 
** 2-8-1 概要 [#o278baee]
この節では、「2-2 会員登録をしよう」で作成した会員登録画面に、表示言語を切り替えるためのリンクを追加して任意に表示を切り替えることをできるようにします。リンクの内「English」を押下すると、表示されるメッセージが英語に、「日本語」を押下すると日本語に変わります。

日本語表示&br;
&ref(supersample2-8_1.jpg);&br;

英語表示&br;
&ref(supersample2-8_2.jpg);

** 2-8-2 サンプルの説明 [#b2448a0c]
本サンプルは、「2-2 会員登録をしよう」のサンプルをベースにしています。表示するメッセージをリソースファイルに集約し、ロケールを動的に変更する機能を追加します。

会員登録画面にアクセスすると、氏名やメールアドレスを入力するテキストボックスの他に、言語を切り替えるためのリンクが表示されます。これたを押下すると、ロケールが変更されメッセージが対応する言語に変化し、会員登録画面が再表示されます。

** 2-8-3 サンプルのポイント [#xa002890]
会員登録画面の表示をメッセージリソースの機能で一括管理し、言語別のapplication.propertiesファイルを用意します。さらに、Struts1.2から導入されたLocaleActionクラスの代替クラスを自前で準備・利用し、画面上のリンクを押下することで動的にロケールを変更する機能を実装します。

■言語別のメッセージリソース&br;
SAStrutsのアプリケーションでメッセージ表示の多言語対応をしたい場合には言語別にリソースファイルを作成し、JSPファイル中の<bean:message>タグで表示位置を指定する必要があります。

言語別リソースファイルの区別はファイル名で行います。SAStrutsは英語用を「application.properties」、日本語用を「application_ja.properties」として識別するため、それぞれを作成します。ファイル名の「_」以降は、。それぞれの言語のISO-639コードに対応するようにします。

また、JSPファイルでは、<bean:message>タグのKey属性でリソースファイル内のラベルを指定します。このメッセージリソースの仕組みにのっとったものだけが、ロケールに対応して変更できます。

■ロケールを変更するActionクラス&br;
Struts1.2以降では、動的にロケールを変更する機能(LocaleActionクラス)が実装されています(元ネタではこれを使用しています)。しかし、SAStrutsでは、これを使用することはできないので(多分?)、代替クラスを作成して使用します。

** 2-8-4 サンプルの動かし方 [#o565247b]
サンプルはあらかじめ用意していないので、以降の項目を参照にして、自分で作成しなければいけません。

** 2-8-5 ファイル構成 [#q85d2c69]
今回、作成、自動生成、もしくは変更するファイルを以下に示します。
|ファイル名|種別|作成/自動生成/変更|h
|ChangeLocaleAction.java|Actionファイル|作成|
|ChangeLocaleForm.java|ActionFormファイル|作成|
|memberEntry.jsp|JSP|変更|
|application.properties|メッセージリソース|変更|
|application_ja.properties|メッセージリソース|変更|

** 2-8-6 サンプルの画面遷移と画面情報の入出力 [#ub9a4dfd]

** 2-8-7 設定ファイル [#k0e08e48]
設定ファイルの編集は必要ありません。

** 2-8-8 会員登録画面 [#v44528f7]
"supersample2-2\src\main\webapp\WEB-INF\view\member\memberEntry.jsp"を以下の内容に差し替えます。ロケールを変更するためのリンクの追加と、表示文字列をメッセージリソースから取得するように変更しています。
*** memberEntry.jsp [#ia8daecc]
#code(jsp){{
<html:html locale="true" >
 <BODY>
  <H1><bean:message key="title" /></H1>
  <TABLE>
  <TR>
  <TD><s:link href="/changeLocale?language=en&country=US">English</s:link></TD>
  <TD><s:link href="/changeLocale?language=ja&country=JP">日本語</s:link></TD>
  </TR>
  </TABLE> 
  <html:errors />
   <s:form>
   <TABLE>
    <TR>
     <TD><bean:message key="name" /></TD>
     <TD><html:text property="name" /></TD>
    </TR>
    <TR>
     <TD><bean:message key="mail" /></TD>
     <TD><html:text property="mail" /></TD>
    </TR>
    <TR>
     <TD><bean:message key="password" /></TD>
     <TD><html:password property="password" redisplay="false" /></TD>
    </TR>
    <TR>
     <TD><bean:message key="address" /></TD>
     <TD><html:text property="address" /></TD>
    </TR>
    <TR>
     <TD><bean:message key="tel" /></TD>
     <TD><html:text property="tel" /></TD>
    </TR>
    <TR>
     <TD><bean:message key="birth" /></TD>
     <TD><html:text property="birth" /></TD>
    </TR>
    <TR>
     <TD>
      <html:submit>
         <bean:message key="submit" />
      </html:submit>
     </TD>
    </TR>
   </TABLE>
  </s:form>
 </BODY>
</html:html>
}}
 
** 2-8-9 メッセージリソース(application.properties、application_ja.properties) [#q7d7a5bb]
*** 英語版メッセージ [#d730651b]
"supersample2-2\src\main\resources\application.properties"に以下のメッセージを追加しましょう。
#code(sh){{
title=Sample:2-8<BR> Database Update Sample
name=Name
mail=Mail Address
password=Password(Encrypt it with MD5 in this example. )
address=Address
tel=Telephone Number
birth=Date of birth(I hope in YYYY-MM-DD. 1980-03-02)
submit=Submit
thank=, Thank you for registration.

error.already=The mail address is registered. 
errors.prefix=<FONT color="#ff0000">
errors.suffix=</FONT><BR>
}}
 
*** 日本語版メッセージ [#vb2b600b]
"supersample2-2\src\main\resources\application_ja.properties"に以下のメッセージを追加しましょう。
#code(sh){{
title=2-8のサンプル<BR> データベース更新の例
name=氏名
mail=メールアドレス
password=パスワード(今回の例ではMD5で暗号化しています)
address=住所
tel=電話番号
birth=生年月日(YYYY-MM-DDでお願いします。 1980-03-02)
submit=登録
thank=さん<BR> ご登録ありがとうございました。

error.already=そのメールアドレスは登録されています。
errors.prefix=<FONT color="#ff0000">
errors.suffix=</FONT><BR>
}}
 
** 2-8-10 会員情報を表すFormクラス [#aee8a1bc]
「2-2 会員登録をしよう」で作成済みのものです。

** 2-8-11 登録確認画面 [#o58f0ad3]
「2-2 会員登録をしよう」で作成済みのものです。

** 2-8-12 ロケール変更アクションクラス [#b16fd955]
Struts1.2以降に導入されているLocaleActionクラス的なものを作成します。
"supersample2-2\src\main\java\sample\action\ChangeLocaleAction.java"を以下の内容で作成しましょう。
*** ChangeLocaleAction.java [#bf596460]
#code(java){{
package sample.action;
 
import java.util.Locale;
import org.apache.struts.Globals;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.RequestUtil;
import sample.form.ChangeLocaleForm;
 
public class ChangeLocaleAction {
    
    @ActionForm
    @Resource
    protected ChangeLocaleForm changeLocaleForm;
    
    //登録画面の表示
    @Execute(validator = false)
    public String index() {
        
        //ロケールオブジェクトを生成
        Locale newLocale = new Locale(changeLocaleForm.language, changeLocaleForm.country);
        
        //セッションオブジェクトを取得
        HttpSession session = RequestUtil.getRequest().getSession();
        
        //現セッションのロケールを設定
        session.setAttribute(Globals.LOCALE_KEY, newLocale);
        
        //会員登録画面表示アクションメソッドを呼び出し
        return "/member/";
    }
}
}}
 
※参照&br;
Jakarta Strutsクックブック 著者: Bill Siggelkow, テクノロジックアート 12章 国際化 [[プレビュー:http://books.google.co.jp/books?id=4yD0mJ5s2AAC&pg=RA1-PA302&lpg=RA1-PA302&dq=Globals.LOCALE_KEY%E3%80%80Locale&source=bl&ots=zAoIRvPEmU&sig=ABXkVvrmWmQpfmuMhrZ07Grq1Lc&hl=ja&ei=3Ar7SdP8J9iGkQWDieGFBQ&sa=X&oi=book_result&ct=result&resnum=9#PRA1-PA311,M1]]

** 2-8-13 ロケール変更アクションフォームクラス [#ed0a93a2]
ChangeLocaleActionクラスで使用するアクションフォームを作成します。"supersample2-2\src\main\java\sample\form\ChangeLocaleForm.java"を以下の内容で作成します。
*** ChangeLocaleForm.java [#c59ce8fa]
#code(java){{
package sample.form;
 
import org.seasar.struts.annotation.Required;
 
public class ChangeLocaleForm {

    //言語(ISO-639)
    @Required
    public String language;
    
    //国(ISO-3166)
    @Required
    public String country;
}
}}
 
リクエストパラメータlanguage、countryには変更するロケールを指定します。languageには言語を、2桁の小文字からなるISO-639コードを指定します。countryには国を、2桁の大文字からなるISO-3166コードを指定します。代表的なコードを以下の通りです。
|国名|言語|国|h
|日本|ja|JP|
|米国|en|US|
|英国|en|GB|
|中国|zh|CN|
|韓国|ko|KR|

詳細は以下のサイトを参照して下さい。
[[ISO-639:http://www.loc.gov/standards/iso639-2/php/English_list.php]]

    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS