多个枚举的国际化(枚举值的翻译)

再次讨论过之前我想要分享“我的”解决方案的内容,并要求增强,其他方法或最佳实践。

我有几个枚举,我需要国际化(我需要将枚举值翻译成某些语言,以便在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)创建一个带有枚举的helper类并生成查找键:

 public class EnumTranslator { public static String getMessageKey(Enum e) { return e.getClass().getSimpleName() + '.' + e.name(); } } 

(3)将此代码添加到每个枚举:

 public String getKey() { return EnumTranslator.getMessageKey(this); } 

(4)现在,我可以像这样访问我的枚举的翻译值:

  

哪个没关系,但我不喜欢的是为每个枚举添加相同的getKey()方法。 应该有更好的东西! 现在轮到你了,SO 🙂

好的,现在这是完整的,随时可用的解决方案:(感谢@Joop Eggen)

上课

 public final class EnumTranslator { public static String getMessageKey(Enum e) { return e.getClass().getSimpleName() + '.' + e.name(); } } 

使其成为自定义ELfunction

   http://example.com/enumi18n  xlate your.package.EnumTranslator String getMessageKey(java.lang.Enum)   

将taglib添加到web.xml

  javax.faces.FACELETS_LIBRARIES /WEB-INF/enumi18n.taglib.xml  

拥有像这样的属性文件enum_en.properties和enum_yourlanguage.properties

 TransferStatus.NOT_TRANSFERRED = Not transferred TransferStatus.TRANSFERRED = Transferred 

将属性文件作为资源包添加到faces-config.xml

   kk.os.obj.jsf.i18n.enum enum  

将自定义taglib添加到xhtml文件中

  

并且 – 瞧 – 您现在可以在jsf中访问已翻译的枚举值:

  

我会创建一个EL函数,保留枚举类:

 #{l:xlate(order.transferStatus)} 

好的,xlate有一个Object参数(或Enum )。 但是enum课程保持不变。

我这样做的方式需要更多的代码(但远远少于我在这里看到的其他答案),但我觉得更可靠:

 @ManagedBean @ApplicationScoped public class EnumTranslator { private > Map getPresentableNames(Class enumClass) { ResourceBundle resources = ResourceBundle.getBundle( "com.example.app.MyMessageBundle", FacesContext.getCurrentInstance().getViewRoot().getLocale()); String prefix = enumClass.getSimpleName() + "."; Map map = new EnumMap(enumClass); for (E value : enumClass.getEnumConstants()) { map.put(value, resources.getString(prefix + value)); } return map; } // Bean method, accessible via EL public Map getTransferStatuses() { return getPresentableNames(TransferStatus.class); } } 

然后你的页面可以做:

  

关于什么:

 public interface InternationalizationOfEnum { default String getKey() { return EnumTranslator.getMessageKey(this); } String name();} 

 public enum anyEnum implements InternationalizationOfEnum{