ログの確認やサポートへの連絡方法に関する文章から、会社名や製品名を含むブランディングのような文字列まで、同じ部分文字列を含む文字列がたくさんありました。この繰り返しは、私たち自身にいくつかの問題 (主にタイプミスやコピー/貼り付けのエラー) を引き起こしていましたが、翻訳者が翻訳しなければならないテキストの量が増えるという問題も引き起こしました。
私が思いついた解決策は次のようなものでした:
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
実際のリソース バンドルに委譲しますが、{{this.kind.of.thing}} の変換を実行してリソース内のキーを検索します。
これらのいずれかを取得するたびに、次の場所に移動する必要があります。
ResourceBundle.getBundle("com/acme/app/Bundle", EXPANDING);
そして、これはうまくいきます - しばらくの間。
最終的に起こることは、いくつかの新しいコード (私たちの場合、Matisse から吐き出された自動生成されたコード) が、カスタム コントロールを指定せずに同じリソース バンドルを検索することです。これは、単純な単体テストを記述して呼び出す場合と、それを呼び出さない場合の再現性がないように見えますが、実際にアプリケーションを実行すると発生します。どういうわけか、内部のキャッシュResourceBundle
が適切な値を排出し、壊れた値に置き換えます。理由はまだわかりません.Sunのjarファイルはデバッグ情報なしでコンパイルされているため、デバッグは雑用です.
私の質問:
私が気付いていないかもしれないデフォルトの ResourceBundle.Control をグローバルに設定する方法はありますか? それはすべてをかなりエレガントに解決します。
おそらく ResourceBundle クラスをまったく改ざんすることなく、この種のものをエレガントに処理する他の方法はありますか?