どんな繰り返しを避けるJava ResourceBundleの文字列?
-
25-09-2019 - |
質問
してくれました文字列も含まれる同じサブ文字列からの文章を確かめるとともに、ログには連絡方法などを支援し、ブランディングのような文字列を含む当社の製品名です。その繰り返したが、数課題を自ら主として間違えやコピー/ペーストのエラーの原因でもあり問題はその量を増やすテキスト弊社の翻訳者は。
を解決したかのようになります:
public class ExpandingResourceBundleControl extends ResourceBundle.Control {
public static final ResourceBundle.Control EXPANDING =
new ExpandingResourceBundleControl();
private ExpandingResourceBundleControl() { }
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format,
ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException {
ResourceBundle inner = super.newBundle(baseName, locale, format, loader, reload);
return inner == null ? null : new ExpandingResourceBundle(inner, loader);
}
}
ExpandingResourceBundle
代表者のリソースバンドルで行う変換{{ます。きます。ます。こと}}は、資源です。
またこれらの一つとなっており:
ResourceBundle.getBundle("com/acme/app/Bundle", EXPANDING);
この作品は細か--。
ここで起こることは、新しいコード(この例でautogeneratedコードしたつばを吐出マティス)を見ると同じリソースバンドルを指定せずに、カスタム。この表示行うことができるものとします。再現可能で書けば簡単体テストすると同じものを見ることができないとしなが発生しまケーション実行時に実現するでしょう。何とかキャッシュの内側 ResourceBundle
排出の値で置き換えられ、折れた。いまだになぜ日のjarファイルを作成してくデバッグ情報なデバッグで英会.
私の質問:
あの世界設定のデフォルトのResourceBundle.を制御することかしないことに気をつければよいのか。その解決すべく優雅.
あるその他の取扱いにつきましてはこのようなことがいえるでしょう優雅なかな改ざん、ResourceBundleの授業は全くないのでしょうか。
解決
私は、これはリソースバンドルが機能するように設計されている方法で、根本的な欠陥だと思う:キーが参照する他のキーが自動的にDRYに違反するという原則を(自分を繰り返さないでください)。私はこれがあなたの方法に類似していた暇な方法:あなたはEL表記を使用して、メッセージ内のリソースキーを指定することができますReflectiveResourceBundleクラスを作成します。
。の間違った方法:の
my.name.first=Bob
my.name.last=Smith
my.name.full=Bob Smith
の RIGHT WAY の
my.name.first=Bob
my.name.last=Smith
my.name.full=${my.name.first} ${my.name.last}
IましアップロードされたのGitHubへのコードは、そう、あなたや他の誰缶ダウンロードををそれ。また、私は( http://www.stripesframework.org/ <ストライプフレームワークを使用して誰のためのいくつかのサンプルコードを追加しました/>)すぐにあなたを得るためにアップして実行されている。
標準のJSTLのfmtタグライブラリで動作するようにこれを得るためにトリックは私たち自身とのHttpServletRequestのリソースを交換しインターセプタを設定することでした。コードルックス、このような何かます:
ResourceBundle bundle = MyStaticResourceHoldingTheBundle.getBundle();
Config.set(request, Config.FMT_LOCALIZATION_CONTEXT, new LocalizationContext(bundle, locale));
詳細は、上記のリンクでstripes.interceptorパッケージを見てみましょう。
他のヒント
の場合は文字列繰り返しの局在を知る文字列が繰り返されるだけで同じプロジェクトが共有リソースバンドルなデザインの悪夢その検討の文字列に複数のkey-valueパーツ。個別の部品の繰り返しからないと再利用を繰り返します。たとえば、次の二つの文字列に必要なものを表示:
- "赤キャップのロビンの小さなpasserine鳥ネイティブオーストラリアへ。"
- "赤キャップのロビンがドライヤーを各地域の多くの大陸"
のリソースバンドルできる。
robin.name=The Red-capped Robin
robin.native=is a small passerine bird native to Australia.
robin.region=is found in dryer regions across much of the continent.
そして結合し、必要な部品が必要 bundle.getString("robin.name")+bundle.getString(robin.native).
あいに注意が必要であるにも関わらず、文法のルールのように対象の述語順など。ない場合も同じではありません。そう少し注意を分ける場合......"とする。