本地化资源包中的枚举值

2023-12-13

我的 JSF 应用程序中的 i18n 枚举有问题。当我开始时,我有枚举,其中定义了文本。但现在,我在枚举中将密钥绑定到消息包。

我的枚举示例之一:

public enum OrderStatus implements CustomEnum {
    PENDING("enum.orderstatus.pending"),
    CANCELED("enum.orderstatus.canceled");

    /**
     * key in message bundle
     */
    private String name;

    OrderStatus(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

}

在视图层中,我使用类似的东西:

<!-- input -->
<h:selectOneMenu value="#{order.status}">
    <f:selectItems value="#{flowUtils.orderStatuses}"/>
</h:selectOneMenu>

<!-- output -->
<h:outputText value="#{order.status}"/>

在Java中:

public class FlowUtils {
    public List<SelectItem> getOrderStatuses() {
        ArrayList<SelectItem> l = new ArrayList<SelectItem>();
        for(OrderStatus c: OrderStatus.values()) {
            // before i18n
            // l.add(new SelectItem(c, c.getName()));

            // after i18n
            l.add(new SelectItem(c, FacesUtil.getMessageValue(c.getName())));
        }
        return l;               
    }
}

public class FacesUtil {
    public static String getMessageValue(String name) {
        FacesContext context = FacesContext.getCurrentInstance();
        return context.getApplication().getResourceBundle(context, "m").getString(name);
    }
}

它运行良好,但是当我需要输出时#{order.status},我需要转换它。 所以我实现了一个转换器,但在转换时遇到了麻烦String to Object in the getAsObject() method.

web.xml:

<converter>
  <converter-for-class>model.helpers.OrderStatus</converter-for-class>
  <converter-class>model.helpers.EnumTypeConverter</converter-class>
</converter>

Java:

public class EnumTypeConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent comp,
            String value) throws ConverterException {
        // value = localized value :(
        Class enumType = comp.getValueBinding("value").getType(context);
        return Enum.valueOf(enumType, value);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,
            Object object) throws ConverterException {
        if (object == null) {
            return null;
        }
        CustomEnum type = (CustomEnum) object;
        ResourceBundle messages = context.getApplication().getResourceBundle(context, "m");
        String text = messages.getString(type.getName());
        return text;
    }

}

我现在正纠结于此。有人知道如何有效地国际化多个枚举吗?


通过转换器传递的值不是您期望的选项标签,而是选项值。最佳实践是不要在模型端执行此操作,而是在视图端执行此操作,因为模型不需要了解 i18n。

至于方法,你基本上不必要地使事情变得过于复杂。从 JSF 1.2 开始,有一个内置的EnumConverter它将自动启动,从 JSF 2.0 开始,您可以迭代通用数组或List in f:selectItems由新的var属性而不需要重复值List<SelectItem>在模型中。

Bean 的外观如下:

public class Bean {
    private OrderStatus orderStatus;
    private OrderStatus[] orderStatuses = OrderStatus.values();

    // ...
}

这是视图的样子(假设msg指的是<var>正如你所定义的<resource-bundle> in faces-config.xml):

<h:selectOneMenu value="#{bean.orderStatus}">
    <f:selectItems value="#{bean.orderStatuses}" var="orderStatus" 
        itemValue="#{orderStatus}" itemLabel="#{msg[orderStatus.name]}" />
</h:selectOneMenu>

就这样。


与问题无关,您在枚举名称和消息键中输入了拼写错误,它应该是:

PENDING("enum.orderstatus.pending"),
CANCELLED("enum.orderstatus.cancelled");

而且,更干净的方法是将捆绑密钥保留在枚举之外,并使用枚举本身作为捆绑密钥的一部分。例如。

PENDING,
CANCELLED;
<h:selectOneMenu value="#{bean.orderStatus}">
    <f:selectItems value="#{bean.orderStatuses}" var="orderStatus" 
        itemValue="#{orderStatus}" itemLabel="#{msg['enum.orderstatus.' += orderStatus]}" />
</h:selectOneMenu>
enum.orderstatus.PENDING = Pending
enum.orderstatus.CANCELLED = Cancelled
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

本地化资源包中的枚举值 的相关文章

随机推荐

  • UI5:使用不同的图标从 JSON 动态构建 ListItems

    我有这个简单的 XML 视图
  • 无法使 Firebase 适用于非 Gradle 构建:缺少 google_app_id。 Firebase 分析已禁用

    我正在开发的应用程序有一个非常定制的构建过程 无法使用 gradle 构建我的应用程序 这并不理想 但我无法改变任何事情 尽管如此 我想在我的应用程序中使用 Firebase Analytics 其中包括模块 firebase core f
  • 如何根据二维数组上的特定位置获取网格单元的状态

    考虑一个二维网格n rows and n columns 此处为 75x75 单击鼠标即可在每个单元格中绘制符号 标记 下面的代码用于在单元格内绘制网格线和符号 class DrawCanvas extends JPanel Overrid
  • java.lang.RuntimeException:更新 Firestore 版本后 Firestore (0.6.6-dev) 中出现内部错误

    更新后我收到以下错误firestore 17 0 1 to firestore 17 0 2 java lang RuntimeException Internal error in Firestore 0 6 6 dev at com g
  • 在ConfigureServices()中调用BuildServiceProvider()的成本和可能的副作用是什么

    有时 在服务注册期间 我需要从 DI 容器解析其他 已注册 服务 对于像 Autofac 或 DryIoc 这样的容器来说 这没什么大不了的 因为您可以在一行上注册服务 然后在下一行上立即解决它 但是使用 Microsoft 的 DI 容器
  • 在 powershell 中打印参数

    我想知道 为什么下面的 powershell 脚本中没有打印字符串参数 function Get Name string Username echo user Username PS C gt Get Name ps1 username t
  • ffmpeg rtmp和本地文件输出

    我在使用 ffmpeg 时遇到了麻烦 我从抓取设备 摄像头 接收 rtsp 流并将其流式传输到 rtmp Youtube Live 我想在我的计算机中拥有该流的副本 因此我同时在本地文件中写入 我使用这个命令 ffmpeg y i RTSP
  • Valgrind 了解堆摘要中分配的字节数增加吗?

    我一直在研究调试分叉 TCP 服务器中的内存使用情况 我认为我做得很好 我只是似乎无法在 堆摘要 中找到有关 分配的字节数 的信息 我的服务器运行的时间越长 这个数字似乎就会不断增加 27526 27526 HEAP SUMMARY 275
  • 代理 HTML 元素

    我想检查一个库对我传递给它的视频元素做了什么 所以我天真地这样做了 cosnt videoElement new Proxy document querySelector video get target key const name ty
  • 嵌套 Flexbox 网格

    我已经构建了一个嵌套的弹性盒网格 将用于各个网关 目前 大概是由于使用outline 每个容器内的内容都会进入 并被隐藏 每个网关周围的空白区域 该空白区域充当每个 div 之间的间距 有没有更好的方法来处理网格间距 这可以让我确保内容不会
  • 仅适用于 Chrome 扩展程序中特定域的后台脚本

    我想知道如何仅针对特定 指定域运行 Chrome 扩展程序的后台脚本 例如 如果扩展程序仅在 Google com 的页面上运行 则没有理由让后台脚本在任何其他域上运行 在我的清单文件中 我设置了 匹配 但我仍然可以看到后台脚本在每个域和选
  • 如何使用PHP进行SQL的GROUP BY?

    我想从数据库表中选择行 并使用 PHP 而不是 SQL 基于参数 在本例中为按项目 对它们进行分组 SQL Clothes table id item owner 1 shoes joe 2 pants joe 3 hat joe 4 pa
  • Xamarin.Android:DrawerLayout.LayoutParams 中的重力参数

    我正在尝试创建一个DrawerLayout以编程方式使用Xamarin Android 但是我在尝试添加时遇到了问题ListView应该可以从左侧拖动 这是我的代码 DrawerLayout myDrawerLayout new Drawe
  • 显式复制构造函数

    我扩展了 std string 以满足我的需要 必须将自定义函数构建到名为的字符串类中自定义字符串 我已经定义了构造函数 class CustomString public std string public explicit Custom
  • 这个c程序有什么问题吗?调试发现程序被击中了 while (sqroot != 0); [复制]

    这个问题在这里已经有答案了 这是调试过程的截图我正在学习用 C 语言编程 我试图找出一个数字是否是镜像 但是程序编译没有错误 但没有给出所需的结果 调试程序发现它碰到了 while sqroot 0 Mirror number includ
  • 旋转图形但不旋转图例

    我有一个图形 我想旋转 90 度 问题是图例也会旋转 有没有办法只旋转图形 甚至能够将图例的旋转属性设置为 90 度就可以了 对于 xticks 例如我正在使用plt xticks range len mu mse index x labs
  • php Imagick::levelImage 用法

    我已经很努力了 但无法使这个方法正常工作 使用格式为 Imagick levelImage float blackPoint float gamma float whitePoint int channel Imagick CHANNEL
  • 如何在 DirectionsRenderer 打开 Bicycling 层后将其关闭

    In Google Maps API 中有关图层的文档 规定如下 Bicycling 图层对象将自行车道图层和 或特定于自行车的叠加层渲染到公共图层中 当请求骑行模式行驶方向时 默认情况下会在 DirectionsRenderer 中返回该
  • 使用 jQuery 即时创建

    我想在基于 AJAX 响应的盒子中动态构建 s 即如果responseText是3 我想构建3个选项
  • 本地化资源包中的枚举值

    我的 JSF 应用程序中的 i18n 枚举有问题 当我开始时 我有枚举 其中定义了文本 但现在 我在枚举中将密钥绑定到消息包 我的枚举示例之一 public enum OrderStatus implements CustomEnum PE