S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

国際化対応

ちょっと基盤整備w
MyFaces 1.2.3(Trinidad 1.2.9)
今まで MyFaces 1.1.x を使ってたけど、別プロジェクトで先行して MyFaces1.2.x & Trinidad 1.2.x の組み合わせを使ってるので、勉強方々ついでにブランクプロジェクトを作っとこうかと。
そのついでに、その別プロジェクトで国際化の辺りをやってるので基盤に盛り込んどこ。って、軽い気持ちでやってみたらハマった。
JSPの記述はこんな感じ。

<f:view locale="#{termInfo.locale.language}">
<f:loadBundle basename="messages" var="messages" />
</f:view>

マネージドビーンtermInfoのプロパティlocaleに、ロケール(jpとかenとか)を設定して、それを切り替えて動的に表示する言語を切り替えたい訳ですが。



別画面への画面遷移だとちゃんと言語が切り替わって描画されるけど、自画面の再描画だと言語が切り替わらない(汗



キャッシュっぽい話?
JSFのライフサイクルまわりの話かな?
自画面の再描画では、マネージドビーンtermInfoのgetLocaleメソッドが呼ばれないらしい。
ということで、redirectを使ってムリヤリ自画面へ遷移してみるw
こんな細工をしてやるとうまくいったりする。

// 言語切り替えのイベント処理
public String doChangeLang() throws Throwable {
    getTermInfo().setLocale(new Locale("切り替える言語コード"));
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    String selfuri = ((HttpServletRequest) ec.getRequest()).getRequestURI().toString();  // 現在のURI
    ec.redirect(selfuri);                                                                // リダイレクト
    FacesContext.getCurrentInstance().responseComplete();
    return null;
}

これだと、自画面の再描画でマネージドビーンtermInfoのgetLocaleメソッドが呼ばれてる。
念のため、もう少し遷移を作ってみて確認しとこ。




っても、現時点で直面した問題ではないのはナイショwww