再说一遍之前已经讨论过的东西,我想在哪里分享“我的”解决方案并要求改进、其他方法或最佳实践。
我有几个需要国际化的枚举(我需要将枚举值翻译成某些语言以便在 jsf 页面中显示它们)。示例枚举:
public enum TransferStatus {
NOT_TRANSFERRED,
TRANSFERRED
}
翻译例如Not yet transferred
/Transferred, all good
翻译应存储在 MessageBundle(属性文件)中。我正在寻找一个简单、通用的解决方案(最好不需要在所有枚举中编写额外的代码),它在 jsf 方面不需要太多。顺便提一下,当然有可能两个不同的枚举具有相同的枚举值(例如,类似的值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()
向每个枚举添加相同的方法。应该有更好的东西!现在轮到你了,所以:-)