トップ «前の日記(2009-09-12) 最新 次の日記(2009-09-20)» 編集

Ussy Diary


2009-09-17

[Seasar]Cubby でロケールを動的に切り替える

Seasar 2.4.39 + Cubby 2.0.1 で動作確認しました。

Cubby で国際化対応を考えたい場合 MessagesBehaviour インターフェースを実装したクラスを用意すればよいようです。今回は ResourceBundle の取得以外はそのまま処理を利用したいので DefaultMessagesBehaviour を継承しました。

public class ExampleMessagesBehaviour extends DefaultMessagesBehaviour {

    /**
     * {@inheritDoc}
     */
    @Override
    public ResourceBundle getBundle(final Locale locale) {
        Locale newLocale = getLocale(locale);
        return super.getBundle(newLocale);
    }

    private Locale getLocale(Locale locale) {
        // locale を取得するコード
        // HttpSession session = ThreadContext.getRequest().getSession();
        return locale;
    }
}

app-cubby.dicon

DefaultMessagesBehaviour が定義されているところを継承したクラスに変更します。

<!-- messages behaviour -->
<component class="example.ExampleMessagesBehaviour">
    <property name="baseName">"messages"</property>
</component>

これでアプリケーションにリクエストを要求するごとに、リソースを入れ替える処理のできあがりです。最後に messages_xx.properties を用意します。

あと getBundle が呼ばれる時点では Seasar から DI はされないので、もしコンポーネントを利用したい場合は SingletonS2Container から取得するなどしないといけないです。