微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决多个枚举的国际化枚举值的翻译

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

上课

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

使其成为自定义EL功能

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib 
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://example.com/enumi18n</namespace>
<function>
    <function-name>xlate</function-name>
    <function-class>your.package.EnumTranslator</function-class>
    <function-signature>String getMessageKey(java.lang.Enum)</function-signature>
</function>
</facelet-taglib>

将taglib添加到您的web.xml

<context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/enumi18n.taglib.xml</param-value>
</context-param>

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

TransferStatus.NOT_TRANSFERRED = Not transferred
TransferStatus.TRANSFERRED = Transferred

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

    <resource-bundle>
        <base-name>kk.os.obj.jsf.i18n.enum</base-name>
        <var>enum</var>
    </resource-bundle>

自定义标签添加到您的xhtml文件

<html ... xmlns:l="http://example.com/enumi18n">

<h:outputText value="#{enum[l:xlate(order.transferStatus)]}" />

解决方法

我有几个需要国际化的枚举(我需要将枚举值转换为某些语言才能在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()在每个枚举中添加相同的方法。那应该有更好的东西!现在轮到你了,所以:-)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。