多个枚举的国际化(枚举值的翻译)
再次讨论过之前我想要分享“我的”解决方案的内容,并要求增强,其他方法或最佳实践。
我有几个枚举,我需要国际化(我需要将枚举值翻译成某些语言,以便在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{