繰り返しになりますが、以前に話し合ったことがあり、「自分の」ソリューションを共有して、機能強化、他のアプローチ、またはベストプラクティスを求めたいと思っていました。
国際化が必要な列挙型がいくつかあります(jsfページに表示するには、列挙型の値をいくつかの言語に変換する必要があります)。列挙型の例:
public enum TransferStatus {
NOT_TRANSFERRED,
TRANSFERRED
}
翻訳は例えばNot yet transferred
/Transferred, all good
翻訳はMessageBundle(プロパティファイル)に保存する必要があります。私は、jsf側で多くを必要としない、簡単で一般的なソリューション(すべての列挙型に追加のコードを記述する必要がないことが最善です)を探していました。言うまでもなく、もちろん、2つの異なる列挙型が同じ列挙型の値を共有する可能性があります(たとえば、COMPLETED
そのような値は、異なる列挙型で異なる意味を持ちます)。
私が思いついた解決策:
(1)次のようにプロパティファイルに翻訳を保存します。
TransferStatus.NOT_TRANSFERRED = Not yet transferred
TransferStatus.TRANSFERRED = Transferred, all good
(2)列挙型を取得してルックアップキーを生成するヘルパークラスを作成します。
public class EnumTranslator {
public static String getMessageKey(Enum<?> e) {
return e.getClass().getSimpleName() + '.' + e.name();
}
}
(3)次のコードをすべての列挙型に追加します。
public String getKey() {
return EnumTranslator.getMessageKey(this);
}
(4)これで、次のように列挙型の変換された値にアクセスできます。
<h:outputText value="#{enum[order.transferStatus.key]}" />
これは問題ありませんが、私が気に入らないのは、getKey()
すべての列挙型に同じメソッドを追加することです。それよりも良いものがあるはずです!今度はあなたの番です、SO :-)