2016-11-18 10 views
0

私たちはアプリケーションで翻訳を管理するのにMessageFormatを使用しています。変換キーとそのパラメータを含むラッパークラス(TranslationWrapper)があります。MessageFormatのLocaleを使用して再帰的に書式設定

翻訳されたメッセージを表示する場合、それはtranslationKeyが「メッセージ{0} {1}」、およびパラメータと同様の形式で値を含むオブジェクトの配列である

String message = new MessageFormat(translationKey, aLocale).format(parameters); 

このコマンドでフォーマットされています{0}と{1}のために。

任意のオブジェクトがパラメータとして使用されることがあるので、パラメータとしてTranslationWrapperをよく使用します。これにより、組み込みの翻訳キーに基づいてローカライズされたStringを作成することができます。

パラメータとして渡されるオブジェクトの場合は、toString()メソッドが呼び出されます。 TranslationWrappertoString()メソッドは、現在のユーザーのロケールを使用して自動的に変換しますが、別のロケールを使用することがあります。

コンストラクタのMessageFormatにこの異なるロケールを渡すので、{0}のような値を置き換えるときに、パラメータの文字列がMessageFormatに生成される方法を処理する方法があるかどうかを知りたいと思います。

ロケールが、私は、コンストラクタに渡されたロケールで
toString(locale); 

:代わりにTranslationWrappertoString()メソッドを呼び出すと、私のような何かを呼び出すしたいと思います。

答えて

1

これはかなり醜いソリューションですが、あなたは(それが設定されている場合)toStringメソッド内で使用するスレッドローカル変数に現在のロケールを設定することができます。

private static final ThreadLocal<Locale> threadLocale = new ThreadLocal<Locale>(); 

... 

public String translate(String translationKey, Locale aLocale, Object ...parameters) { 

    Locale previousLocale = threadLocale.get(); 
    try { 
     threadLocale.set(aLocale); 
     return new MessageFormat(translationKey, aLocale).format(parameters); 
     ... 
    } finally { 
     threadLocale.set(previousLocale); 
    } 
} 

// somewhere in toString method threadLocale.get() will return you current Locale 
+0

まだはるかに少ない醜い私が念頭に置いていたの回避策より。スレッドローカル変数について知らなかった私のような他の人のリファレンスとして、次の宣言例があります: 'private static final ThreadLocal threadLocale = new ThreadLocal ();' –

+0

私はこれをanwerに入れます – hoaz

関連する問題